image-processing - 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 -separate +channel -level 48,52% output.png
但我无法明确定位其他颜色。
例如,如果我想用其他颜色改变绿色,结果图像也会影响绿色、黄色、红色和天蓝色。
有没有办法显式更改阴影中的单一颜色:
- 黄色
- 天蓝色
- 粉色的
- 绿色
- 白色的
- 黑色的
- 红色的
我尝试更改所有通道:R,G,B,C,M,Y,K,A,O。
使用-separate选项我可以定位 RBG,但 RGB 的问题是 R 效果红色、黄色和粉色,G 效果绿色、天蓝色和黄色以及 B 效果蓝色、粉色和天蓝色。
输出样本: RGB 图像颜色变化
预期输出:在上面的“output-0”输出中,它影响红色、黄色和粉红色。我想要只影响红色的命令。其他颜色也类似。
我使用的链接:https ://www.imagemagick.org/discourse-server/viewtopic.php?t=33361
我正在使用 python 来运行这个命令。我也愿意使用其他可以显式处理所有颜色的库。
解决方案
如果您的图像像我要求的那样具有代表性,就这么简单:
magick rgb.png -fill white -opaque red result.png
如果您还想影响“接近红色”的色调,您可以应用一些模糊:
magick rgb.png -fuzz 40% -fill white -opaque red result.png
请注意,这也会影响红色圆圈的边缘,它是“羽毛红色”。
如果没有,您的 ImageMagick 代码实际上是在进行“色调旋转”,并且正如您所注意到的,它会影响整个图像。在继续之前阅读有关 HSV 的 Wikipedia 页面。这是一个 HSI Hue 轮供参考:
解决方案是进行色相旋转,但通过仅选择您想要影响的颜色/区域的蒙版应用其效果。请记住,OpenCV 将 Hue 从 0..360 到 0..180 范围内减半,以便它可以将 Hue 存储在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、色调旋转、颜色替换、选择性颜色、遮罩。
推荐阅读
- java - 如何在java中保持更新和跟踪二维数组?
- safari - Safari 意外崩溃
- mongodb - 统计数据库 mongoDB 上的集合
- database - MongoDB:从多个文档中的数组中删除文档
- reactjs - 输入占位符仅显示在开发环境中,但不显示在 React 的生产构建中
- c++ - 当向量的值已经在上面定义的函数中被 push_backed 时,向量的值不能在 main() 中产生的回溯问题
- powerbi - Power BI(报表生成器)日期筛选器
- flutter - 如何在 iPad 等大型设备中模拟可扩展的手机尺寸
- php - 打印嵌套 JSON 中的值
- php - 从 MySQL 数据库(通过 PHP)获取时需要很长时间才能加载的优化图像