首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用OpenCV-Python改变特定区域的色调?

如何用OpenCV-Python改变特定区域的色调?
EN

Stack Overflow用户
提问于 2020-06-30 01:08:36
回答 2查看 5.7K关注 0票数 1

我想编辑某个区域我想改变的图片的颜色的hsv值。

我要把所有的紫色部分的形象改成绿色。这是我在图像编辑软件中做的一个例子。结果是的,我无缘无故地让它变暗了,但我只想让刀刃变绿,而不是手柄。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-30 18:12:07

下面是在Python/OpenCV中通过变换颜色来实现这一点的一种方法。

输入:

代码语言:javascript
复制
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()

结果:

票数 3
EN

Stack Overflow用户

发布于 2020-06-30 03:02:07

Python/OpenCV中的简单方法是使用inRange()创建图像紫色的掩码,然后使用Numpy将图像更改为绿色,其中掩码为白色。

输入:

代码语言:javascript
复制
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通道放回。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62648862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档