【圖像處理算法】圖像處理之誤差擴散(抖動)算法

          【圖像處理算法】圖像處理之誤差擴散(抖動)算法

一、算法簡介

誤差擴撒法在數據處理中經常碰到,尤其是用於圖像處理中,降低色彩的深度。下面有三張圖,【圖一】256級(8bit)灰度過度      【圖二】將圖一轉換成16級(8bit)灰度(高4位不變,低4位置0)       【圖三】將圖一用誤差擴散法轉換成16級灰度。(256級灰度指共256種灰度值,16級灰度指共16種灰度值)

801 字節         646 字節           2539 字節

【圖一】                     【圖二】                        【圖三】

很明顯,同是16級灰度,但是【圖三】的效果明顯好於【圖二】,其原因是【圖二】使用的是誤差擴撒算法。

顧名思義,誤差擴撒,就是色彩深度降低時,將像素的變化的誤差擴撒開去,使得肉眼在觀察圖片的時候,相鄰的像素點集合整體的誤差變小,就比如:人在下樓梯時,如果臺階過高,容易扯着蛋;要是同樣的高度能多有幾個臺階,那麼臺階之間的距離變小了,那麼扯蛋效應就會減小甚至消失(不好意思,我稱之爲扯蛋效應)。

二、具體過程

1、如果我們要將這一張256級灰度的圖片轉換成16級灰度,最簡單的辦法就是將每個像素的後四位置0。例如256級灰度值是120,轉換成16級灰度值則有:120/16=7.5,7*16=112,即16級灰度值爲112,那麼存在120-112=8(即0.5*16=8)的像素差值,這就是誤差。如果不利用這個誤差信息,則就是【圖二】的效果。

256級灰度轉化16級灰度方法:即把256級灰度平均分成16等分,轉化的時候,只需要判斷256級灰度在16等分中的哪一個區間,然後用該區間的最小值作爲16級灰度的灰度值。即:

if((x>0) && (x<=16))
	Grayscale_value = 0=16;
else if((x > 16)&&( x<=32))
	Grayscale_value = 32;
else if((x > 32)&&( x<=48))
	Grayscale_value = 48;
else if((x > 48)&&( x<=64))
	Grayscale_value = 64;
else if((x > 64)&&( x<=80))
	Grayscale_value = 80;
else if((x > 80)&&( x<=96))
	Grayscale_value = 96;
else if((x > 96)&&( x<=112))
	Grayscale_value = 112;
else if((x > 112)&&( x<=128))
	Grayscale_value = 128;
else if((x > 128)&&( x<=144))
	Grayscale_value = 144;
else if((x > 144)&&( x<=160))
	Grayscale_value = 160;
else if((x > 160)&&( x<=176))
	Grayscale_value = 176;
else if((x > 176)&&( x<=182))
	Grayscale_value = 182;
else if((x > 182)&&( x<=198))
	Grayscale_value = 198;
else if((x > 198)&&( x<=214))
	Grayscale_value = 214;
else if((x > 214)&&( x<=230))
	Grayscale_value = 230;
else if((x > 230)&&( x<=246))
	Grayscale_value = 246;
else if((x > 246))
	Grayscale_value = 255;

也可以像原作者那樣直接按照公式計算。
2、誤差擴散(抖動),爲了解決【圖二】的現象,我們來利用這個誤差,即將這個誤差擴散到該像素點的周圍,而不是由該像素完全承擔這個誤差。這樣從視覺方面來看,就會更平緩,更容易接受。我們按照3:2:3的比例將8這個誤差分批到該像素點的右邊,右下,下邊這些周圍的像素點上,即右邊像素=右邊像素+3,右下像素=右下像素+2,下邊像素=下邊像素+3,如此一來,處理完整個圖像的每個像素點,是不是比直接截尾的效果要好很多呢?

在上述說明中這個誤差8的舉例有點特殊,誤差是13,則按3:2:3得分配的誤差爲2,1,2(或者四捨五入的3,2,3)。

事實上,3:2:3的效果也不是最好的分配誤差法案,你還可以試一試下面的分法(也可以自己構造):

 

其中X指的是要轉換的像素點,周圍的瓜分誤差的比例。

ok,這個算法還是比較有用的,由於比較簡單,就不給出代碼了,可以自己實現一下。
————————————————
版權聲明:本文爲CSDN博主「hujingshuang」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hujingshuang/article/details/45716445

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章