没有看到你尝试过的代码,很难猜出你做错了什么。为了用一个具体的例子向你展示这是如何做到的,让我们改变这辆车难看的蓝色:
这个简短的 Python 脚本展示了我们如何使用 HSV 颜色空间更改颜色:
import cv2
orig = cv2.imread("original.jpg")
hsv = cv2.cvtColor(orig, cv2.COLOR_BGR2HSV)
hsv[:,:,0] += 100
bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('changed.jpg', bgr)
你得到:
在wikipedia上,您会看到色调介于 0 到 360 度之间,但对于 OpenCV 中的值,请参阅文档。您会看到我为图像中每个像素的色调添加了 100。我猜您想更改图像一部分的颜色,但您可能从上面的脚本中得到了这个想法。
以下是如何获得所要求的深红色汽车。首先我们得到红色的:
我试图保持金属感的深红色:
正如我所说,您用来改变颜色光线的方程式取决于您想要为对象使用的材料。在这里,我想出了一个快速而肮脏的方程式来保留汽车的金属材料。此脚本从第一个浅蓝色汽车图像生成上述深红色汽车图像:
import cv2
orig = cv2.imread("original.jpg")
hls = cv2.cvtColor(orig, cv2.COLOR_BGR2HLS)
hls[:,:,0] += 80 # change color from blue to red, hue
for i in range(1,50): # 50 times reduce lightness
# select indices where lightness is greater than 0 (black) and less than very bright
# 220-i*2 is there to reduce lightness of bright pixel fewer number of times (than 50 times),
# so in the first iteration we don't reduce lightness of pixels which have lightness >= 200, in the second iteration we don't touch pixels with lightness >= 198 and so on
ind = (hls[:,:,1] > 0) & (hls[:,:,1] < (220-i*2))
# from the lightness of the selected pixels we subtract 1, using trick true=1 false=0
# so the selected pixels get darker
hls[:,:,1] -= ind
bgr = cv2.cvtColor(hls, cv2.COLOR_HLS2BGR)
cv2.imwrite('changed.jpg', bgr)