我想使用 ImageMagick 更改阴影的颜色。
我可以使用来管理阴影变化:
convert input.png -colorspace HCL -channel R -evaluate set 5% +channel -colorspace sRGB output.png
使用设置XX%,我能够获得不同的颜色,例如红色,绿色,黄色,蓝色,粉红色,天蓝色,灰色等。
以下命令可用于定位蓝色:
convert input.png -colorspace HCL -channel R -separate +channel -level 48,52% output.png
但是我无法明确地定位其他颜色。
例如,如果我想将绿色更改为其他颜色,则生成的图像也将同时具有绿色,黄色,红色和天蓝色。
有没有一种方法可以显式更改阴影的单一颜色:
我尝试更改所有渠道:R,G,B,C,M,Y,K,A,O。
使用-分隔选项,我可以定位RBG,但是RGB的问题是R效果红色,黄色和粉红色,G效果绿色,天蓝色和黄色以及B效果蓝色,粉红色和天空-蓝色。
输出样本: RGB image colour change
预期的输出:在上述“输出-0”的输出中,其效果为红色,黄色和粉红色。我想要只影响红色的命令。其他颜色也是如此。
我使用的链接:https://www.imagemagick.org/discourse-server/viewtopic.php?t=33361
我正在使用python运行此命令。我也愿意使用其他可以显式使用所有颜色的库。
答案 0 :(得分:1)
如果您的图片具有我的代表性,就这么简单:
magick rgb.png -fill white -opaque red result.png
如果您还想影响色调“接近红色” ,则可以应用一些绒毛:
magick rgb.png -fuzz 40% -fill white -opaque red result.png
注意,这也会影响红色圆的边缘,该红色圆是“羽毛红色” 。
如果没有,那么您的ImageMagick代码实际上就是执行“色调旋转” ,并且您已经注意到,它会影响整个图像。在继续之前,请先阅读Wikipedia page on HSV。这是HSI色相轮供参考:
解决方案是进行色相旋转,但通过仅选择要影响的颜色/区域的遮罩应用其效果。请记住,OpenCV将色相从0..360减至0..180,以便可以将色相存储在np.uint8
中。
因此,如果我们加载与上图相同的图像,并且仅选择绿色(色相在120附近),则可以通过添加60(色相= 240)将那些仅旋转为蓝色:
#!/usr/local/bin/python3
import cv2 as cv
import numpy as np
# Load the image and convert to HSV colourspace
image = cv.imread("rgb.png")
# Convert to HSV and split channels
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
H,S,V = cv.split(hsv)
# Shift only greens (Hue near 120) around hue circle by 120 degrees to blues - remembering OpenCV halves all these values - see comment
H[(H>55)&(H<65)] += 60
# Recombine into single 3-channel image and convert back to RGB
result = cv.merge((H,S,V))
result = cv.cvtColor(result,cv.COLOR_HSV2BGR)
cv.imwrite("result.png",result)
如果要将蓝色(Hue = 240)更改为黄色(Hue = 60),只需更改以下内容:
H[(H>55)&(H<65)] += 60
对此:
H[(H>115)&(H<125)] -= 90
如果您想扩大受影响的果岭范围,请在我的代码中减少55
和/或增加65
。如果要将果岭移到其他色调,请增大或减小60
。
如果需要,您可以使用PIL / Pillow完成上述所有操作-无需安装(大型)OpenCV。
关键字:图像,图像处理,Python,OpenCV,ImageMagick,色相,HSL,HSV,色相旋转,颜色替换,选择颜色,遮罩。