如何用颜色矩阵实现仅保留黄色、其余转为灰度?
实现仅保留黄色、其余转灰度的颜色处理方案
首先明确:单纯靠一个颜色矩阵没法实现条件判断式的保留黄色(因为矩阵是线性变换,只能对所有像素做相同的数学运算),但可以通过「灰度转换+黄色区域叠加」的两步方式实现,或者结合遮罩完成。
先分析你之前的问题
你用的矩阵:
{ 0.4, 0.4, 0.4, 0.0, 0.0 } { 0.4, 0.4, 0.4, 0.0, 0.0 } { 0.4, 0.4, 0.0, 0.0, 0.0 } { 0.0, 0.0, 0.0, 1.0, 0.0 } { 0.0, 0.0, 0.0, 0.0, 1.0 }
这个矩阵的作用是:
- 新R值 = 原R0.4 + 原G0.4 + 原B*0.4
- 新G值 = 原R0.4 + 原G0.4 + 原B*0.4
- 新B值 = 原R0.4 + 原G0.4 + 原B*0
相当于把所有颜色的R、G拉到相近的高值,B压低,自然会让大部分颜色偏黄;而原本的黄色(R=G高、B低)计算后R、G会变成(高+高+低)*0.4,反而接近灰度,所以效果完全相反。
正确的实现步骤
方法1:灰度转换+黄色遮罩叠加(最准确)
生成黄色遮罩:
将图像转为HSV色彩空间,黄色的参考范围是:- 色相(H):30°60°(可根据需求调整,比如20°65°也能覆盖更多黄色系)
- 饱和度(S):>0.3(过滤低饱和的偏灰黄色)
- 明度(V):>0.4(过滤暗黄色)
符合这个范围的像素标记为黄色区域,其余为非黄色区域。
将原图转为灰度:
使用标准灰度转换矩阵:{ 0.299, 0.587, 0.114, 0.0, 0.0 } { 0.299, 0.587, 0.114, 0.0, 0.0 } { 0.299, 0.587, 0.114, 0.0, 0.0 } { 0.0, 0.0, 0.0, 1.0, 0.0 } { 0.0, 0.0, 0.0, 0.0, 1.0 }这个矩阵是根据人眼对RGB的敏感度加权,得到标准灰度效果。
叠加黄色区域:
将原图中黄色区域的像素,替换到灰度图的对应位置;或者用混合模式(比如「正常混合」,遮罩区域显示原图,其余显示灰度图)。
方法2:近似的颜色矩阵模拟(适合简单场景)
如果不想用遮罩,想尽量用矩阵实现近似效果,可以设计一个矩阵,让黄色的R、G保留更多,B被抑制,同时非黄色区域向灰度靠拢。比如:
{ 1.0, 0.0, -1.0, 0.0, 0.0 } { 0.0, 1.0, -1.0, 0.0, 0.0 } { 0.299,0.587,0.114,0.0,0.0 } { 0.0, 0.0, 0.0, 1.0, 0.0 } { 0.0, 0.0, 0.0, 0.0, 1.0 }
这个矩阵的作用:
- 新R = 原R - 原B:黄色的B值低,所以R保留较多;非黄色如果B高,R会被压低
- 新G = 原G - 原B:同理,黄色的G保留较多
- 新B = 灰度值:所有像素的B通道统一为灰度值
这样会让黄色区域的R、G突出,B偏灰,接近保留黄色的效果,但不如遮罩方法准确,适合颜色对比强烈的场景。
注意事项
- 黄色的范围可以根据你的实际需求调整,比如亮黄色、暗黄色的阈值不同
- 如果是在Photoshop、GIMP这类工具里,可以直接用「色相/饱和度」调整+蒙版,或者「可选颜色」来实现,比手动写矩阵更直观
内容的提问来源于stack exchange,提问作者Tojie Akida
相关产品推荐
相关产品推荐

