一个需求是吧一张图的红色部分转换为蓝色部分,最初不思路可以是通过通道互换解决,但这可能会产生一些混合色的颜色变换。例如橙色变为紫色(黄 + 红 || 黄绿 + 蓝)。
另一种思路是色彩空间变换,在一个空间内解决不了的问题,通过坐标变换 转换到另一空间求解,再转换回来,而另一个空间里面我们的操作不会对原空间施加预期之外的操作。
实现代码:
import cv2
import numpy as np
image = cv2.imread('C:/Users/admin/Desktop/test.png')
HSVImage = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lowerRed1 = np.array([0, 64, 50])
upperRed1 = np.array([10, 255, 255])
lowerRed2 = np.array([160, 64, 50])
upperRed2 = np.array([180, 255, 255])
redMask1 = cv2.inRange(HSVImage, lowerRed1, upperRed1)
redMask2 = cv2.inRange(HSVImage, lowerRed2, upperRed2)
fullMask = redMask1 + redMask2
blueHue = 60
HSVImage[:, :, 0] = np.where(fullMask == 255, blueHue, HSVImage[:, :, 0])
finalImage = cv2.cvtColor(HSVImage, cv2.COLOR_HSV2BGR)
cv2.imwrite('C:/Users/admin/Desktop/out.png', finalImage)