[Matlab][數位內容與機器學習] DCT轉換與高頻量化

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

DCT是一種將信號或圖像轉換成一組正弦波係數的數學運算,在二維DCT中,高頻係數通常位於DCT係數矩陣的右下角區域,而低頻係數通常位於左上角區域。

通常人眼對於低頻信息較為敏感,對於高頻信息較不敏感。因此對於一些高頻係數可以適當地進行量化和壓縮,例如將它們直接設為0或者經過一些簡單的編碼方式來表示。這樣可以達到壓縮數據的效果,同時也不會對圖像的視覺品質產生明顯的影響。本文即是在這個概念下去撰寫一個matlab程式進行DCT轉換及簡單的高頻量化。

首先將圖像資料切割成128*128的小方塊進行DCT轉換:

Image_DCT = blockproc(ImageInput, [128 128], @(block) dct2(block.data));
Image_DCT(abs(Image_DCT) < 10) = 0;
imshow(Image_DCT);

其中blockproc的功能是將輸入數據分成多個固定大小矩陣,並對每個矩陣進行處理,最後將塊的處理結果合併成最終的輸出結果。這裡使用的是128*128的矩陣分別帶入dct2轉換函數,並將絕對值小於10的部分設為0,輸出結果如下圖:

每一個128*128的矩陣左上角都還有密集的訊號,但右下角的高頻訊號因絕對值小於10被設為0了。

除了將block.data帶入dct2函數外,也可以自行定義一些dct加上量化規則的函數,比如:

  1. DCT轉換後取最大的N個值其餘歸零(這裡N帶100):
Image_Input = imread('Baboon_Gray.tiff');
Image_DCT = blockproc(Image_Input, [128 128], @(block) DCT_Top_N(block.data,100));
imshow(Image_DCT);

function data_dct_out = DCT_Top_N(data, N)
    data_dct_out = dct2(data);
    TopN_value = abs(reshape(data_dct_out,[1,128*128]));
    TopN_value = min(maxk(TopN_value,N));
    data_dct_out(abs(data_dct_out) < TopN_value) = 0;
    data_dct_out = idct2(data_dct_out);
    data_dct_out = rescale(data_dct_out);
end

2. DCT轉換後保留左上NN的值其餘歸零(這裡N帶50):

Image_DCT = blockproc(Image_Input, [128 128], @(block) DCT_Top_Right(block.data,50));
imshow(Image_DCT);

function data_dct_out = DCT_Top_Right(data, N)
    data_dct = dct2(data);
    data_dct_out = data_dct*0;
    for i = 1:N
        for j = 1:N
            data_dct_out (i,j) = data_dct(i,j);
        end
    end
    data_dct_out = idct2(data_dct_out);
    data_dct_out = rescale(data_dct_out)
end

可以使用上面的幾種方式分別帶入不同數值交叉驗證,當右下角的高頻被濾掉之後對圖像表現的影響。