關於圖片顯示質量的細節問題

 
5mbox v1.55改進了很多問題,其中一個非常重要的問題就是圖片顯示中的色差問題。
具體點來說,就是顏色的損失。比如現在我有一張png的圖片,它是24 bpp的(24 bpp的意思是:
圖片中的每個像素都由24個bit來表示,這也就是我們常見的RGB888模式,
用二進制來表示就是0000 0000 rrrr rrrr gggg gggg bbbb bbbb)
當然了,根據圖片解碼器的不同,它有可能是BGR模式的24 bpp。

這些都無關緊要了,只要我們知道他們是24 bit的數據表示一個像素就可以了。
回過頭來看a1200,a1200的屏幕分辨率應該是18 bpp的,
也就是傳說中的RGB666,用二進制來表示就是:
00rr rrrr gggg ggbb bbbb
也可能是BRG666(我記不清了,感興趣的朋友可以參考我前面的文章,這裏只講一下原理)
 
好,我們基本弄明白了RGB888與RGB666的區別,當我們用圖片解碼器把圖片從壓縮的jpeg或者png
解碼以後,通常得到的像素格式是24 bpp或者32 bpp(帶有alpha通道的)。這個時候是8 bits表示
一個顏色分量,也就是R可以有2^8個顏色,如果把它強制轉換成爲18 bpp的,用6 bits表示一個顏色分量,
也就是說R只能支持2^6個顏色。這就引起了顏色的丟失,也就是色差問題。
 
那麼接下來如何處理這個問題呢?對於這個問題,在計算機圖像處理中已經有了完整的解決方法,
那就是圖像的抖動算法和圖像的誤差擴散算法。
 
圖像抖動算法的基本原理可以參考如下的網址:
感興趣的朋友可以用turbo c編譯一下試試,呵呵,我試過了,可以用。
 
關於圖像的誤差擴散是目前比較流行和完善的算法,下面只介紹一下基本原理:
 降低色彩的深度. 下面三張圖, 圖1 是 256 級灰度過度, 圖 2 是簡單的將圖一按就近原則, 轉換成了 16 級灰度. (直接把 8bit 灰度的後 4bit 砍掉) 圖3 是將圖 1 用誤差擴散的方法轉換成 16 級灰度.
   
                   圖1                 圖2                    圖3
很明顯, 同是 16 色, 但是圖三的效果明顯好於圖二. 其原因是使用的誤差擴散算法. 顧名思義, 誤差擴散, 就是將色彩深度降低時, 將像素顏色的變化誤差, 擴散開去. 這使得肉眼在觀察圖片的時候, 相鄰的像素點集合整體 的誤差變小. 下面舉一例來說明要容易理解的多:
在原256 級灰度圖象上有一個點, 灰度值是 120 (0~255), 如果我們要將這張圖轉換成 16 級灰度, 最簡單的方法是將每個像素點除以 16. 那麼轉換後的值就是 120/16=7.5 保留整數位後就是 7 . 這樣轉換後的值就有了 0.5 的誤差. 最簡單的誤差擴散方法是將這 0.5 的誤差放到這個點右邊/下邊的點上, 我們可以按 3:2:3 的比例把它分配到右邊, 右下, 下邊的點上. 即, 我們把右邊和下邊的點加上 (0.5*16)*3/8=3, 把右下的點加上 (0.5*16)*2/8=2. 這樣處理完整個圖形, 要比直接截尾的效果要好的多. 實際上, 3:2:3 的誤差分配方案 並不算好. 你還可以試試 7:3:5:1 的分法:
X 7 
3 5 1  
或者 42 分:
X 8 4  
2 4 8 4 2  
1 2 4 2 1  
當然也不一定複雜的 Filter 就一定效果更好, 還是要視圖象而定.
我覺得這個方法很容易理解, 就不多寫了, 可以將其很容易的擴展到彩色圖象的處理. (只需要將顏色分成 R G B 三色素)
 
在linux的x window下面用抖動算法做了一個實驗,大體的效果如下圖所示:
 請大家注意第一幅圖的天空背景,是帶有條紋的,這裏的條紋就是由於直接從24 bpp轉成16 bpp導致的,
如果加入了抖動算法,對比其右邊的圖片顯示效果就可以很容易的看出其顯示效果變得細膩多了。
 
這裏就是簡單的優化了,對於算法中必須採用的浮點數計算,可以參考如下網址進行優化:
 
畢竟已經有前輩們做過努力了,再此我就不再聒噪了,再次感謝前輩們的工作!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章