替换颜色的着色器

时间:2017-12-26 11:27:16

标签: opengl glsl shader

我想制作一个用于替换要应用于普通颜色字符的颜色的着色器,但我不能只替换颜色,因为该图像包含平均为两种边框颜色的像素。 例如,图像如下所示:

enter image description here

假设我想要更改衬衫的颜色,我想将红色替换为绿色,但是边缘处有不是红色的像素:

enter image description here

如何计算其中一个像素的最终颜色?

2 个答案:

答案 0 :(得分:3)

你知道提前哪些主要颜色?

如果没有,则找到它们的简单解决方案是生成直方图 - 扫描整个图像,并且对于与其所有四个邻居相同的每个像素,将其中的一个添加到其包含的颜色的计数中。最后,仅保留那些至少填充显示器的不可忽略部分的颜色,例如,至少有5%的像素不透明。

处理黑色边框很容易:使用亮度/色度颜色空间,并始终保持亮度,仅重新映射色度。分解亮度有一个好处:它将颜色替换从3d问题折叠到第二个问题。

如果这不是GLSL,那么对于不是所选主要颜色之一的每个像素,固体解决方案可能是(i)找到最接近的主要颜色像素; (ii)然后找到最接近的主要颜色的像素,但不是(i)中找到的像素。使用常规线性代数计算出2d线上该像素与一种颜色之间的距离。替换颜色,重新插入和输出。

因为它是GLSL,所以"找到最近的"并不是特别现实,假设主要颜色的数量很小,那么只需将它作为与这些线的距离。例如。假设你有五种颜色。然后总共10个潜在的颜色过渡 - 从五种颜色中的每一种颜色中有四个其他选项,表明二十个过渡,但是其中一半与另一半完全相同,因为它们仅仅是例如红色到蓝色而不是蓝色到红色。十点。

将它们作为制服加载,然后找出颜色最接近的过渡渐变。替换基色。输出

所以,在网上:

  1. 将(R,G,B)变换为(Y,x,y) - YUV或YIQ或Y是否无关紧要,只选一个;
  2. 执行(x,y)线的距离和为此图像识别的颜色过渡梯度;
  3. 找到了这个像素距离最近的过渡区及其沿着过渡点的距离,替换了终点,重新映射;
  4. 与原始Y重新组合,转换回RGB并输出。
  5. 每个颜色过渡渐变的两个点产品建立最接近,然后单个mix生成输出(x,y)/

答案 1 :(得分:2)

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)