我正在处理图像以根据要求将其颜色从黑色变为红色、蓝色、绿色等。我使用 SetPixel 方法将图像的每个像素的颜色从黑色更改为红色。
除了图像中的边框和一些曲线外,它几乎可以正常工作。假设我圈出了用黑色填充的图像。带圆圈的图像颜色发生了变化,但是当我放大时,我仍然可以看到边框周围的黑点,这些黑点并没有完全被红色取代。我试图挖掘并发现它与抗锯齿有关。
有没有遇到类似的问题或对如何解决此问题有想法/建议?
非常感谢您的帮助!
问候, 塔努什
我正在处理图像以根据要求将其颜色从黑色变为红色、蓝色、绿色等。我使用 SetPixel 方法将图像的每个像素的颜色从黑色更改为红色。
除了图像中的边框和一些曲线外,它几乎可以正常工作。假设我圈出了用黑色填充的图像。带圆圈的图像颜色发生了变化,但是当我放大时,我仍然可以看到边框周围的黑点,这些黑点并没有完全被红色取代。我试图挖掘并发现它与抗锯齿有关。
有没有遇到类似的问题或对如何解决此问题有想法/建议?
非常感谢您的帮助!
问候, 塔努什
它可能与抗锯齿有关。抗锯齿的本质是越靠近边缘(某物的边界)的像素越多,像素颜色与背景颜色混合的越多(或者我们可以说它更“透明”)。所以问题可能在于您不仅需要将源颜色替换为目标颜色,还需要将源颜色混合到背景颜色的像素。为此,您需要:
1)运行某种边缘检测算法——它可能是简单的或高级的,如你所愿。
2)如果像素靠近边缘并且像素靠近源颜色的其他像素,则计算它的不透明度(1-透明度)因子 - 这将是
不透明度 = (pixel_color-background_color)/(source_color-background_color)
3)现在计算您必须替换当前抗锯齿像素的颜色:
new_color = background_color * (1-opacity) + opacity * target_color
并把这个 new_color 代替抗锯齿像素。
总之:您需要检测抗锯齿像素并将其替换为您的抗锯齿像素版本。
算法中最难的部分是检测抗锯齿像素——因为你不能确定你以 100% 的概率找到了所有边缘像素。您也不能确定是像素抗锯齿还是最初是由这种颜色制成的)。因此,您可能会在最终产品中出现一些颜色噪点。但无论如何,它应该比坐着等待要好:)
祝你好运