Site icon KerKer 的模組世界

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

&NewLine;<p class&equals;"wp-block-paragraph">近期參加了&&num;8221&semi;數位內容與機器學習&&num;8221&semi;課程,在這邊將學習到的知識做個筆記,若有錯誤也煩請不吝指教。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">DCT是一種將信號或圖像轉換成一組正弦波係數的數學運算,在二維DCT中,高頻係數通常位於DCT係數矩陣的右下角區域,而低頻係數通常位於左上角區域。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">通常人眼對於低頻信息較為敏感,對於高頻信息較不敏感。因此對於一些高頻係數可以適當地進行量化和壓縮,例如將它們直接設為0或者經過一些簡單的編碼方式來表示。這樣可以達到壓縮數據的效果,同時也不會對圖像的視覺品質產生明顯的影響。本文即是在這個概念下去撰寫一個matlab程式進行DCT轉換及簡單的高頻量化。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<&excl;--more-->&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">首先將圖像資料切割成128&ast;128的小方塊進行DCT轉換:<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code>Image&lowbar;DCT &equals; blockproc&lpar;ImageInput&comma; &&num;91&semi;128 128&rsqb;&comma; &commat;&lpar;block&rpar; dct2&lpar;block&period;data&rpar;&rpar;&semi;&NewLine;Image&lowbar;DCT&lpar;abs&lpar;Image&lowbar;DCT&rpar; &lt&semi; 10&rpar; &equals; 0&semi;&NewLine;imshow&lpar;Image&lowbar;DCT&rpar;&semi;<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">其中blockproc的功能是將輸入數據分成多個固定大小矩陣,並對每個矩陣進行處理,最後將塊的處理結果合併成最終的輸出結果。這裡使用的是128&ast;128的矩陣分別帶入dct2轉換函數,並將絕對值小於10的部分設為0,輸出結果如下圖:<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<figure class&equals;"wp-block-image size-large"><img src&equals;"https&colon;&sol;&sol;kerker&period;website&sol;wp-content&sol;uploads&sol;2023&sol;02&sol;DCT量化jpg-1024x576&period;jpg" alt&equals;"" class&equals;"wp-image-1342"&sol;><&sol;figure>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">每一個128&ast;128的矩陣左上角都還有密集的訊號,但右下角的高頻訊號因絕對值小於10被設為0了。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">除了將block&period;data帶入dct2函數外,也可以自行定義一些dct加上量化規則的函數,比如:<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ol class&equals;"wp-block-list">&NewLine;<li>DCT轉換後取最大的N個值其餘歸零&lpar;這裡N帶100&rpar;:<&sol;li>&NewLine;<&sol;ol>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code>Image&lowbar;Input &equals; imread&lpar;'Baboon&lowbar;Gray&period;tiff'&rpar;&semi;&NewLine;Image&lowbar;DCT &equals; blockproc&lpar;Image&lowbar;Input&comma; &&num;91&semi;128 128&rsqb;&comma; &commat;&lpar;block&rpar; DCT&lowbar;Top&lowbar;N&lpar;block&period;data&comma;100&rpar;&rpar;&semi;&NewLine;imshow&lpar;Image&lowbar;DCT&rpar;&semi;&NewLine;&NewLine;function data&lowbar;dct&lowbar;out &equals; DCT&lowbar;Top&lowbar;N&lpar;data&comma; N&rpar;&NewLine; data&lowbar;dct&lowbar;out &equals; dct2&lpar;data&rpar;&semi;&NewLine; TopN&lowbar;value &equals; abs&lpar;reshape&lpar;data&lowbar;dct&lowbar;out&comma;&&num;91&semi;1&comma;128&ast;128&rsqb;&rpar;&rpar;&semi;&NewLine; TopN&lowbar;value &equals; min&lpar;maxk&lpar;TopN&lowbar;value&comma;N&rpar;&rpar;&semi;&NewLine; data&lowbar;dct&lowbar;out&lpar;abs&lpar;data&lowbar;dct&lowbar;out&rpar; &lt&semi; TopN&lowbar;value&rpar; &equals; 0&semi;&NewLine; data&lowbar;dct&lowbar;out &equals; idct2&lpar;data&lowbar;dct&lowbar;out&rpar;&semi;&NewLine; data&lowbar;dct&lowbar;out &equals; rescale&lpar;data&lowbar;dct&lowbar;out&rpar;&semi;&NewLine;end<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">2&period; <em>DCT轉換後保留左上N<&sol;em>N的值其餘歸零&lpar;這裡N帶50&rpar;:<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code>Image&lowbar;DCT &equals; blockproc&lpar;Image&lowbar;Input&comma; &&num;91&semi;128 128&rsqb;&comma; &commat;&lpar;block&rpar; DCT&lowbar;Top&lowbar;Right&lpar;block&period;data&comma;50&rpar;&rpar;&semi;&NewLine;imshow&lpar;Image&lowbar;DCT&rpar;&semi;&NewLine;&NewLine;function data&lowbar;dct&lowbar;out &equals; DCT&lowbar;Top&lowbar;Right&lpar;data&comma; N&rpar;&NewLine; data&lowbar;dct &equals; dct2&lpar;data&rpar;&semi;&NewLine; data&lowbar;dct&lowbar;out &equals; data&lowbar;dct&ast;0&semi;&NewLine; for i &equals; 1&colon;N&NewLine; for j &equals; 1&colon;N&NewLine; data&lowbar;dct&lowbar;out &lpar;i&comma;j&rpar; &equals; data&lowbar;dct&lpar;i&comma;j&rpar;&semi;&NewLine; end&NewLine; end&NewLine; data&lowbar;dct&lowbar;out &equals; idct2&lpar;data&lowbar;dct&lowbar;out&rpar;&semi;&NewLine; data&lowbar;dct&lowbar;out &equals; rescale&lpar;data&lowbar;dct&lowbar;out&rpar;&NewLine;end<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"wp-block-paragraph">可以使用上面的幾種方式分別帶入不同數值交叉驗證,當右下角的高頻被濾掉之後對圖像表現的影響。<&sol;p>&NewLine;

Exit mobile version