[Matlab][數位內容與機器學習] 灰階圖像資料量化

近期參加了”數位內容與機器學習”課程,在這邊將學習到的知識做個筆記,若有錯誤也煩請不吝指教。

量化的核心概念就是將資料歸納到數個值內,比如說四捨五入就是一種量化,將非整數的值取到相近的整數值上。本文即是在這個概念下去撰寫一個matlab程式對灰階圖片進行量化處理。

首先我們讀入的灰階圖片的每一個像素都會是一個0-255之間的亮度值,也就是輸入的灰階圖片本身就是一個經過256階(8bit)量化處理過的資料。

而如果要對這個資料再作一次n階的量化,可以將資料的最大最小值相減,並除以n-1來求階層間的差值(difference):

difference = (max(max(data))-min(min(data)))/(n-1)

對data做兩次max/min是因為這個function使用在二維陣列時會將每一列的最大/最小值存成新的一維陣列,而對一維陣列則是取得其中最大/最小的單一值,故對二維陣列連續做兩次max/min才能取得陣列中的最大/最小值。

再將資料減掉最小值並除以差值後以四捨五入的方式算出他應該屬於第幾階的資料(mapping),這段也是量化的重點:

mapping = (data-min(min(data)))/difference ;
mapping = round(mapping);

round就是用四捨五入取最接近整數值的function。

最後量化的結果就會是mapping乘上difference後將一開始被減掉的最小值:

Quantified_Data = mapping*difference+min(min(data));


可以將整個量化的過程寫成一個完整的Quant函數,輸入灰階圖片data以及量化的層數n:

function Quantified_Data = Quant(data, n)
    difference = (max(max(data))-min(min(data)))/(n-1);
    mapping = (data-min(min(data)))/difference ;
    mapping = round(mapping);
    Quantified_Data = mapping*difference+min(min(data));
end

下圖為使用這個function對一個灰階圖片以1bit、2bit、4bit及7bit量化後的結果(即n帶入2、4、16、128):

可以很明顯地看到隨著量化階層減少,產出的圖片顏色也隨之減少,也越模糊無法辨識,到1bit的時候就只剩下黑跟白兩種極端值且基湖無法辨識了。