2010-08-11 75 views
1

我正在處理圖像,根據需要將它們的顏色從黑色更改爲紅色,藍色,綠色等。我使用SetPixel方法將圖像中每個像素的顏色從黑色改變爲紅色。如何解決在C#中更改圖像顏色時的抗鋸齒問題?

它工作得很好,除了邊界和圖像內的一些曲線。比方說,我圈出了充滿黑色的圖像。帶圓圈的圖像顏色會發生變化,但當我縮放時,我仍然可以看到邊框周圍的黑色點,並未完全被紅色所替代。我試圖四處挖掘,發現它與抗鋸齒有關。

有沒有遇到過類似的問題,或對如何解決這個問題有想法/建議?

非常感謝advnace的幫助!

問候, Tanush

回答

1

它可以與反走樣有關。消除鋸齒的本質是越靠近邊緣(某物的邊界)越多的像素顏色與背景顏色混合(或者我們可以說它更「透明」)。 所以問題可能在於,您不僅需要將源顏色替換爲目標顏色,還需要將源顏色與背景顏色混合的像素。 要實現這一點,您需要:

1)某種運行邊緣檢測算法 - 它可能是simple或高級,只要你想。

2)如果像素是鄰近邊緣和像素附近的源顏色的其它像素,然後計算它的不透明度(1-透明度)因子,這將是

opacity = (pixel_color-background_color)/(source_color-background_color)

3)現在計算您的顏色您必須替換當前抗鋸齒像素:

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

,並把這個對new_color而不是抗鋸齒像素。

總結: 您需要檢測抗鋸齒像素並將其替換爲您的抗鋸齒像素版本。

算法最難的部分是檢測反鋸齒像素 - 因爲您無法確定是否以100%的概率發現所有邊緣像素。你也不能確定是像素抗鋸齒還是剛開始製造這種顏色)。正因爲如此,您可能會在最終產品中產生一些色彩噪音。但在任何情況下,它應該比坐下來等待:)

好運