Image processing ImageMagick无法为图像显式更改阴影中的颜色
我想使用ImageMagick在阴影中改变颜色 我能够通过以下方式管理阴影变化:Image processing ImageMagick无法为图像显式更改阴影中的颜色,image-processing,colors,imagemagick,Image Processing,Colors,Imagemagick,我想使用ImageMagick在阴影中改变颜色 我能够通过以下方式管理阴影变化: convert input.png -colorspace HCL -channel R -evaluate set 5% +channel -colorspace sRGB output.png 使用set XX%我可以得到不同的颜色,如红色、绿色、黄色、蓝色、粉色、天蓝色、灰色等 下面的命令用于定位蓝色: convert input.png -colorspace HCL -channel R -s
convert input.png -colorspace HCL -channel R -evaluate set 5% +channel -colorspace sRGB output.png
使用set XX%我可以得到不同的颜色,如红色、绿色、黄色、蓝色、粉色、天蓝色、灰色等
下面的命令用于定位蓝色:
convert input.png -colorspace HCL -channel R -separate +channel -level 48,52% output.png
但我无法明确地针对其他颜色
例如,如果我想用其他颜色改变绿色,生成的图像也会影响绿色、黄色、红色和天蓝色
是否有一种方法可以显式更改以下颜色的单一阴影:
- 黄色的
- 天蓝色
- 粉红的
- 绿色的
- 白色的
- 黑色的
- 红色的
我正在使用python来运行这个命令。我也愿意使用其他库,这些库将明确使用所有颜色 如果您的图像像我要求的那样具有代表性,那么就这么简单: 如果您还想影响“接近红色”的色调,可以应用一些模糊:
magick rgb.png -fuzz 40% -fill white -opaque red result.png
请注意,这也会影响红色圆圈的边缘,即“羽毛红色”
如果没有,您的ImageMagick代码实际上是在进行“色调旋转”,并且正如您所注意到的,它会影响整个图像。在继续之前,请先阅读。以下是一个HSI色调轮供参考: 解决方案是进行色调旋转,但通过仅选择希望影响的颜色/区域的遮罩应用其效果。请记住,OpenCV将色调从0..360到0..180的范围减半,以便将色调存储在
np.uint8
中
因此,如果我们加载与上面相同的图像并仅选择绿色(其中色调接近120),我们可以通过添加60(色调=240)将这些图像旋转为蓝色:
#/usr/local/bin/python3
将cv2作为cv导入
将numpy作为np导入
#加载图像并转换为HSV颜色空间
image=cv.imread(“rgb.png”)
#转换为HSV和拆分频道
hsv=cv.cvt颜色(图像,cv.COLOR\u BGR2HSV)
H、 S,V=等速分割(hsv)
#仅将色调圆周围的绿色(色调接近120)移动120度至蓝色-记住OpenCV将所有这些值减半-请参阅注释
H[(H>55)和(H55)和(H115)&(请提供一个代表您正在使用的图像的示例,并显示您期望的结果。我有一个bash Imagemagick脚本,可以更改各个颜色。请参阅我的脚本huemap,在。这是一种色调旋转效果。黑色和白色不是色调,因此您无法更改它们。为此,请使用-fuzz XX%-填充skybluE-不透明的白色改变白色到天蓝色。你也可以按照Mark Setchell的回答来做任何颜色。我的答案是否解决了你的问题?如果是的话,请考虑把它当作你的答案——点击投票计数旁边的空心滴答声。如果不是,请说什么不起作用,这样我或其他人可以进一步帮助你。汉克斯。谢谢你的回答,H[(H>115)&(HRed以零为中心,当用色调圈环绕时,会触及360(即180),因此你需要寻找(H175)
,或者您可以反转RGB图像并查找青色。黑色和白色没有色调,因为它们都是不饱和的。因此,要查找黑色,您需要查找低饱和度(即无颜色)和低值(即暗)。要查找白色,您需要查找低饱和度(即无颜色)和高值(即亮)。计算任何颜色的简单方法是从图像中裁剪出一块该颜色,将其转换为HSV,然后看看你得到了什么,可能是通过平均,即print(H.mean(),H.min(),H.max())
magick rgb.png -fuzz 40% -fill white -opaque red result.png
#!/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)
H[(H>55)&(H<65)] += 60
H[(H>115)&(H<125)] -= 90