1. 程式人生 > >影象演算法研究---索引影象旋轉縮放鋸齒問題

影象演算法研究---索引影象旋轉縮放鋸齒問題

所謂索引影象 ,就是一種把畫素值直接作為RGB調色盤下標的影象,把畫素值直接對映成調色盤中的數值。索引影象最多隻包含256種顏色,這256中顏色分別對應0-255個值,也就是256種索引值,一般的真彩圖像中的實際資料都是RGB或者RGBA資料,而索引影象中的實際資料則是256種索引值,每個索引值對應一種RGB或者RGBA顏色資料,這樣講,相信大家更容易理解一點。

介紹完了索引影象,來引入今天研究的問題。

今天的問題是:索引影象的旋轉與縮放

我們以旋轉為例,先看一下下面幾組測試:


                                         1.索引影象                                                                                                    2.32位真彩圖像

                                        3.索引影象旋轉45度結果


                                     4.真彩圖像旋轉45度結果

大家可以看到,上面的測試中,使用相同的旋轉演算法,但是索引圖旋轉後明顯出現了鋸齒現象。

也許你要說鋸齒是因為旋轉的插值演算法問題造成的,這裡可以告訴你,上面的測試都是在PS中進行的,使用的是雙線性型插值演算法。

現在我來解釋出現上述結果的原因:

如果我們使用的是真彩圖像,那麼,影象實際資料是對應的RGBA的值,這樣,我們使用插值的結果得到的也是與周圍顏色相近的RGBA資料,因此,視覺上沒什麼差異,就像圖4一樣,旋轉後跟旋轉前的圖2差不多;

如果我們使用的是索引影象,那麼,影象實際資料是RGBA資料對應的索引值,這樣,我們使用插值的結果得到的也是與周圍索引值相近的一個索引值,注意,得到的是一個索引值,至於這個索引值對應的RGBA資料是不是與周圍顏色相近,那我們就不得而知了,因此,也就出現了圖3的結果,也就是說圖3中,鋸齒的地方,是因為插值得到的索引對應的顏色不是黑色,而是白色!

如果還不明白,我們說這樣一個例子:

假如真彩圖上有三個RGB資料:(200,200,200),P(R,G,B),(100,100,100),其中P是我們要插值得到的,這裡我們使用平均法來計算P,那麼我們得到的P應該是:

P(150,150,150),這個就是實際的RGB資料,也是我們看到的影象顏色;

假如索引圖上有三個索引資料:200,P,100,這三個資料分別表示的是顏色RGB的索引,我們假設三個索引分別對應如下顏色:

200---RGB(200,200,200)

100---RGB(100,100,100)

150--RGB(255,255,255)

我們同樣使用平均值法得到P:P=150,,沒錯,但是這裡P對應的實際顏色的RGB值是(255,255,255),這個結果跟真彩圖的結果(150,150,150)有著明顯的顏色差異!

至此,相信大家已經很清楚了。

我們如何解決這個問題呢?

方案如下:

1,獲取索引影象的調色盤,也就是顏色表,這個表中記錄了索引值與顏色值的對應關係;

2,按照這個顏色表,把索引影象轉換為真彩圖像;

3,對真彩圖像進行縮放與旋轉等操作;

4,按照哦1中的顏色表將真彩旋轉結果轉換為索引影象,這個結果即為所求。

在這個方案中,如果在步驟4中出現旋轉之後的影象中的顏色值,在索引表中沒有對應關係 ,那麼,一般使用的是歐氏距離法,也就是計算當前顏色值與顏色表中 最接近(歐氏距離最小)的顏色值所對應的索引,以此索引作為結果索引即可。

這樣就可以完美解決上述 問題了。最後給一個索引圖旋轉的DEMO,程式碼沒有優化,只是說明而已:點選開啟連結