1

我正在处理图像以根据要求将其颜色从黑色变为红色、蓝色、绿色等。我使用 SetPixel 方法将图像的每个像素的颜色从黑色更改为红色。

除了图像中的边框和一些曲线外,它几乎可以正常工作。假设我圈出了用黑色填充的图像。带圆圈的图像颜色发生了变化,但是当我放大时,我仍然可以看到边框周围的黑点,这些黑点并没有完全被红色取代。我试图挖掘并发现它与抗锯齿有关。

有没有遇到类似的问题或对如何解决此问题有想法/建议?

非常感谢您的帮助!

问候, 塔努什

4

1 回答 1

2

它可能与抗锯齿有关。抗锯齿的本质是越靠近边缘(某物的边界)的像素越多,像素颜色与背景颜色混合的越多(或者我们可以说它更“透明”)。所以问题可能在于您不仅需要将源颜色替换为目标颜色,还需要将源颜色混合到背景颜色的像素。为此,您需要:

1)运行某种边缘检测算法——它可能是简单的或高级的,如你所愿。

2)如果像素靠近边缘并且像素靠近源颜色的其他像素,则计算它的不透明度(1-透明度)因子 - 这将是

不透明度 = (pixel_color-background_color)/(source_color-background_color)

3)现在计算您必须替换当前抗锯齿像素的颜色:

new_color = background_color * (1-opacity) + opacity * target_color

并把这个 new_color 代替抗锯齿像素。

总之:您需要检测抗锯齿像素并将其替换为您的抗锯齿像素版本。

算法中最难的部分是检测抗锯齿像素——因为你不能确定你以 100% 的概率找到了所有边缘像素。您也不能确定是像素抗锯齿还是最初是由这种颜色制成的)。因此,您可能会在最终产品中出现一些颜色噪点。但无论如何,它应该比坐着等待要好:)

祝你好运

于 2010-08-28T22:16:04.787 回答