我想制作一个着色器来替换要应用于普通颜色字符的颜色,但我不能只替换颜色,因为图像包含平均为两种边框颜色的像素。例如,图像如下所示:
假设我想要更改衬衫的颜色,我想将红色替换为绿色,但是边缘处有不是红色的像素:
任何想法如何计算其中一个像素的结果颜色?
你知道提前哪些主要颜色?
如果没有,那么找到它们的简单解决方案是生成直方图 - 扫描整个图像,并且对于与其所有四个邻居相同的每个像素,将其添加到其包含的颜色的计数中。最后,仅保留那些至少填充显示器的不可忽略部分的颜色,例如,这些像素中至少有5%是不透明的。
处理黑色边框很容易:使用亮度/色度颜色空间,并始终保持亮度,仅重新映射色度。分解亮度有一个好处:它将颜色替换从3d问题折叠到2d问题。
如果这不是GLSL,那么对于不是所选主要颜色之一的每个像素,可能是(i)找到最接近的主要颜色像素的固体解决方案; (ii)然后找到最接近的主要颜色的像素,但不是(i)中找到的像素。使用常规线性代数计算出2d线上该像素与一种颜色之间的距离。替换颜色,重新插入和输出。
因为它是GLSL,所以“找到最近的”并不是特别真实,假设主要颜色的数量很小,那么只需将它作为距这些线的距离。例如。假设你有五种颜色。然后总共10个潜在的颜色过渡 - 从五种颜色中的每一种颜色中有四个其他选项,表明二十个过渡,但是其中一半与另一半完全相同,因为它们仅仅是例如红色到蓝色而不是蓝色到红色。十点。
将它们作为制服加载,然后找出颜色最接近的过渡渐变。替换基色。输出。
所以,在网上:
这是每个颜色过渡梯度的两个点积,以建立最接近,然后单个mix
生成输出(x,y)/
Let Rx, Gx, Bx = Pixel values of color X (Red in your case) to be removed/replaced.
Let Ry, Gy, By = Pixel values of color Y (Green in your case) to be used as new color.
然后,您将迭代所有像素并使用巧妙条件(下图),识别需要处理的像素。
如果Rc是所选像素颜色的当前值(与红色和黄色的组合无关),则像素的最终值为:
Rf = Rc - Rx + Ry
Gf = Gc - Gx + Gy
Bf = Bc - Bx + By
当然,这个处理对所有像素都不满意。仅识别相关像素的聪明条件可以是:如果像素颜色是红色或者至少一个相邻像素是红色/黄色。
更新:仅使用当前像素的另一个聪明条件:
这涉及从当前颜色中删除边框颜色黄色或黑色,并检查它是否为红色。
Rc - R(yellow) == R(RED) AND
Gc - G(yellow) == G(RED) AND
Bc - B(yellow) == B(RED)
OR
Rc - R(black) == R(RED) AND
Gc - G(black) == G(RED) AND
Bc - B(black) == B(RED)