2011-02-19 100 views
1

我正在嘗試使用3x3矩陣實現圖像卷積,其中我的顏色分量(每個範圍從0到255)都使用預倍乘的alpha進行存儲。所有的教程(例如http://www.codeproject.com/KB/GDI-plus/csharpfilters.aspx)我只能找到描述執行RGB組件的卷積計算,沒有提及有關alpha組件。與預乘倍數的圖像卷積

我現在的代碼保持alpha組件原樣。我已經嘗試過的濾鏡在處理每個像素已經具有完整字母集的圖像時看起來很好。當我有部分透明像素時boxblur過濾器看起來很奇怪,因爲當模糊發生時像素顏色不會傳播到透明區域。

運行卷積算法時我對alpha分量執行了什麼計算,以及在設置最終像素值時如何處理預乘α值?另外,我是否將濾鏡偏移添加到alpha分量?

我試着計算我的新alpha組件(與計算RGB組件的方法相同)(即根據濾鏡矩陣將該像素的周圍Alpha值相加),但是出現在透明區域邊緣的彩色邊緣半透明像素開始變暗得太多。我想我需要改變新的RGB組件以考慮新的alpha值,但我不知道該怎麼做。

謝謝。

回答

2

我認爲正確的方法是先計算只是使用標準的公式

alpha = a1*m1 + a2*m2 + a3*m3 + 
     a4*m4 + a5*m5 + a6*m6 + 
     a7*m7 + a8*m8 + a9*m9; 

,那麼你必須計算原始(非預乘)R/G/B的卷積卷積阿爾法並乘以alpha後

red = (r1/a1*m1 + r2/a2*m2 + r3/a3*m3 + 
     r4/a4*m4 + r5/a5*m5 + r6/a6*m6 + 
     r7/a7*m7 + r8/a8*m8 + r9/a9*m9) * alpha; 

用綠色和藍色的相似公式。

更有效的方法是首先去除預乘(即用r/a替換r,用g/a替換r,用b/a替換b)用標準公式對所有組件進行卷積,然後重新預乘r與r * a,g與g * a和b與b * a)。

+0

謝謝!我試過了,現在我的圖像濾鏡看起來幾乎是正確的。我現在面臨的問題是,當我做一個大框模糊或高斯模糊時,開始不透明的圖像開始變得越來越透明(我在Photoshop中沒有得到這種行爲)。儘管小模糊不明顯。任何想法,如果它的公式有問題? – rbcc