我想编辑某个区域我想改变的图片的颜色的hsv值。
我要把所有的紫色部分的形象改成绿色。这是我在图像编辑软件中做的一个例子。结果是的,我无缘无故地让它变暗了,但我只想让刀刃变绿,而不是手柄。
发布于 2020-06-30 18:12:07
下面是在Python/OpenCV中通过变换颜色来实现这一点的一种方法。
输入:

import cv2
import numpy as np
# load image with alpha channel
img = cv2.imread('sword_purple.png', cv2.IMREAD_UNCHANGED)
# extract alpha channel
alpha = img[:,:,3]
# extract bgr channels
bgr = img[:,:,0:3]
# convert to HSV
hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
#h = hsv[:,:,0]
#s = hsv[:,:,1]
#v = hsv[:,:,2]
h,s,v = cv2.split(hsv)
# purple is 276 in range 0 to 360; so half in OpenCV
# green is 120 in range 0 to 360; so half in OpenCV
purple = 138
green = 60
# diff color (green - hue)
diff_color = green - purple
# modify hue channel by adding difference and modulo 180
hnew = np.mod(h + diff_color, 180).astype(np.uint8)
# recombine channels
hsv_new = cv2.merge([hnew,s,v])
# convert back to bgr
bgr_new = cv2.cvtColor(hsv_new, cv2.COLOR_HSV2BGR)
# put alpha back into bgr_new
bgra = cv2.cvtColor(bgr_new, cv2.COLOR_BGR2BGRA)
bgra[:,:,3] = alpha
# save output
cv2.imwrite('sword_alpha.png', alpha)
cv2.imwrite('sword_bgr.png', bgr)
cv2.imwrite('sword_bgr_new.png', bgr_new)
cv2.imwrite('sword_green.png', bgra)
# Display various images to see the steps
cv2.imshow('alpha',alpha)
cv2.imshow('bgr',bgr)
cv2.imshow('bgr_new',bgr_new)
cv2.imshow('bgra',bgra)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:

发布于 2020-06-30 03:02:07
Python/OpenCV中的简单方法是使用inRange()创建图像紫色的掩码,然后使用Numpy将图像更改为绿色,其中掩码为白色。
输入:

import cv2
import numpy as np
# load image with alpha channel
img = cv2.imread('sword_purple.png', cv2.IMREAD_UNCHANGED)
# extract alpha channel
alpha = img[:,:,3]
# extract bgr channels
bgr = img[:,:,0:3]
# select purple
lower_purple = (140,40,110)
upper_purple = (170,60,130)
mask = cv2.inRange(bgr, lower_purple, upper_purple)
# change the image to make it green where the mask is white
bgr_new = bgr.copy()
bgr_new[mask==255] = (0,255,0)
# put alpha back into rgb_new
bgra = cv2.cvtColor(bgr_new, cv2.COLOR_BGR2BGRA)
bgra[:,:,3] = alpha
# save output
cv2.imwrite('sword_alpha.png', alpha)
cv2.imwrite('sword_bgr.png', bgr)
cv2.imwrite('sword_mask.png', mask)
cv2.imwrite('sword_masked_green.png', bgr_new)
cv2.imwrite('sword_green.png', bgra)
# Display various images to see the steps
cv2.imshow('alpha',alpha)
cv2.imshow('mask',mask)
cv2.imshow('bgr_new',bgr_new)
cv2.imshow('bgra',bgra)
cv2.waitKey(0)
cv2.destroyAllWindows()
阿尔法频道:

BGR频道:

掩码:

重新着色的BGR频道:

返回alpha通道的结果:

或者,您也可以通过将BGR转换为HSV并以相同的方式将紫色更改为绿色来实现相同的操作。然后转换回BGR并将alpha通道放回。
https://stackoverflow.com/questions/62648862
复制相似问题