【问题标题】:Shader that replaces colors替换颜色的着色器
【发布时间】:2017-12-26 11:27:15
【问题描述】:

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

假设我想改变衬衫的颜色,我想把红色换成绿色,但是在边缘有不是红色的像素:

任何想法如何计算其中一个像素的合成颜色?

【问题讨论】:

  • 您是否提前知道有限的一组重要颜色(例如,特定的红色、特定的黄色),或者您需要解决它们吗?是否要求所有阶段都发生在 GLSL 中?

标签: opengl glsl shader


【解决方案1】:

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

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

处理黑色边框很容易:使用亮度/色度色彩空间,始终不理会亮度,只重新映射色度。分解亮度有一个好处:它将颜色替换从 3d 问题转换为 2d 问题。

如果这不是 GLSL,那么对于不是所选主要颜色之一的每个像素,可能有一个固溶体,可能是 (i) 找到最近的主要颜色像素; (ii) 然后找到最近的像素,它是一种主要颜色,但不是 (i) 中找到的那个。使用正常的线性代数来计算二维线上该像素从一种颜色到另一种颜色的距离。替换颜色,重新插值并输出。

因为它是 GLSL,所以“找到最近的”并不是特别现实,假设主要颜色的数量很少,那么就按照与这些线的距离来做。例如。假设你有五种颜色。然后总共有 10 种潜在的颜色过渡——从五种颜色中的每一种中,还有四个其他选项,建议 20 种过渡,但其中一半与另一半完全相同,因为它们只是例如。红色到蓝色而不是蓝色到红色。所以十个。

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

所以,在网络中:

  1. 将 (R, G, B) 转换为 (Y, x, y) — YUV 或 YIQ 或 Y 无关紧要,只需选择一个即可;
  2. 针对 (x, y) 执行距直线的距离以及为此图像识别的颜色过渡渐变;
  3. 已找到该像素最接近的过渡及其沿该过渡的距离,替换端点,重新映射;
  4. 与原始 Y 重新组合,转换回 RGB 并输出。

即每个颜色过渡梯度用两个点积建立最接近,然后用单个mix 生成输出 (x, y)/

【讨论】:

    【解决方案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
    

    当然,这种处理不应该对所有像素都满意。仅识别相关像素的聪明条件可能是:如果像素颜色为红色或至少一个相邻像素为红色/黄色。

    更新:仅使用当前像素的另一个巧妙条件:

    这涉及从当前颜色中删除边框颜色 YELLOW 或 BLACK 颜色并检查它是否为 RED。

    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) 
    

    【讨论】:

    • 太好了,谢谢!假设所有边缘都有黑色描边,您是否认为有任何方法可以使条件仅依赖于当前像素?
    • R(black) 不等于 0?在那种情况下,Rc 必须是 R(red),G 和 B 也是如此,对吗?还是我错过了什么?
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2016-02-02
    • 2016-03-06
    相关资源
    最近更新 更多