天天看點

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

            灰階變換,屬于一個非常重要的概念。這裡主要參考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。書中所有的實驗與數學式都采用了8-bit 圖像的灰階範圍,也就是0到255這樣一個範圍,這是本書不合理的一個地方。首先,這樣做并不泛用,圖檔不一定是8-bit的。其次,在做某些變換的時候,可能會導緻溢出。比如,伽馬變化,假設伽馬值為2,那麼灰階為255的像素點,其變換之後值為65025,這裡就溢出了。當然,要是使用Matlab計算,肯定會處理的非常好,直接使用mat2gray函數就能将其壓縮回0到255。但是要是其他嵌入式平台處理的時候,直接套用不友善不說,直接按照8-bit的圖來了解很不直覺。是以,我将數學式做了改變,讓其輸入為0到1的浮點數,其輸出也是0到1的浮點數,這樣友善了解。

      本文所使用的圖檔,均來源于《Digital Image Processing》的首頁 http://www.imageprocessingplace.com/

       圖像反轉

       圖像反轉,這個翻譯還是很不恰當的。這裡應該了解為負片變換,負片變換如下所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

負片變換,主要用于觀察過黑的圖檔,負片變換之後,友善觀察。很簡單的變換。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       對數變換

       對數變換主要用于将圖像的低灰階值部分擴充,将其高灰階值部分壓縮,以達到強調圖像低灰階部分的目的。變換方法由下式給出。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

這裡的對數變換,底數為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

,實際計算的時候,需要用換底公式。其輸入為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

,其輸出也為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

。對于不同的底數,其對應的變換曲線如下圖所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

底數越大,對低灰階部分的強調就越強,對高灰階部分的壓縮也就越強。相反的,如果想強調高灰階部分,則用反對數函數就可以了。看下面的實驗就可以很直覺的了解,下圖是某圖像的二維傅裡葉變換圖像,其為了使其灰階部分較為明顯,一般都會使用灰階變換處理一下。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       實作對數變換的Matlab代碼如下:

close all;
clear all;

%% -------------Log Transformations-----------------
f = imread('DFT_no_log.tif');
f = mat2gray(f,[0 255]);

v = 10;
g_1 = log2(1 + v*f)/log2(v+1);

v = 30;
g_2 = log2(1 + v*f)/log2(v+1);

v = 200;
g_3 = log2(1 + v*f)/log2(v+1);

figure();
subplot(1,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');
subplot(1,2,2);
imshow(g_1,[0 1]);
xlabel('b).Log Transformations v=10');

figure();
subplot(1,2,1);
imshow(g_2,[0 1]);
xlabel('c).Log Transformations v=100');

subplot(1,2,2);
imshow(g_3,[0 1]);
xlabel('d).Log Transformations v=200');
           

       伽馬變換

       伽馬變換主要用于圖像的校正,将漂白的圖檔或者是過黑的圖檔,進行修正。伽馬變換也常常用于顯示屏的校正,這是一個非常常用的變換。其變化所用數學式如下所示,

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

其輸入為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

,其輸出也為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

。對于不同的伽馬值,其對應的變換曲線如下圖所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

和對數變換一樣,伽馬變換可以強調圖像的某個部分。根據下面兩個實驗,可以看出伽馬變換的作用。        實驗1:

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

其實作Matlab代碼為:

close all;
clear all;

%% -------------Gamma Transformations-----------------
f = imread('fractured_spine.tif');
f = mat2gray(f,[0 255]);

C = 1;
Gamma = 0.4;
g2 = C*(f.^Gamma);

figure();
subplot(1,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');

subplot(1,2,2);
imshow(g2,[0 1]);
xlabel('b).Gamma Transformations \gamma = 0.4');
           

       實驗2:

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       灰階拉伸

       灰階拉伸也用于強調圖像的某個部分,與伽馬變換與對數變換不同的是,灰階拉升可以改善圖像的動态範圍。可以将原來低對比度的圖像拉伸為高對比度圖像。實作灰階拉升的方法很多,其中最簡單的一種就是線性拉伸。而這裡介紹的方法稍微複雜一些。灰階拉伸所用數學式如下所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

同樣的,其輸入為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

,其輸出也為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

。這個式子再熟悉不過了,跟巴特沃斯高通濾波器像極了,其輸入輸出關系也大緻能猜到是個什麼形狀的。但是,這裡就出現一個問題了,輸入為0時候,式子無意義了。是以,在用Matlab計算的時候,将其變為如下形式。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

這裡的eps,就是Matlab裡面,一個很小數。如此做的話,式子變得有意義了。但是,其輸入範圍為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

的時候,其輸出範圍變為了

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

。輸出範圍大緻為

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

,為了精确起見,使用mat2gray函數将其擴充到精确的

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

。調用格式如下。

g = mat2gray(g,[1/(1+(m/eps)^E) 1/(1+(m/1+eps)^E)]);
           

       輸入輸出問題解決了,還有一個問題,參數的決定。這裡有兩個參數,一個是m(相對于巴特沃斯高通濾波器而言,這個是截止頻率),一個是E(相對于 巴特沃斯高通濾波器而言,這個是濾波器次數)。m可以控制變換曲線的重心,E則可以控制曲線的斜率,如下圖所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

m值的可取圖像灰階分布的中央值,如下式所示,

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       決定m之後,接下來就隻剩E了。灰階拉升的目的就是擴充圖檔的動态範圍,我們想将原本灰階範圍是

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

的圖像變換到

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

内。那麼,就直接取最大值與最小值,帶入式子,解出E就可以了。但是,如之前所說的,我們所用的式子的的輸出範圍達不到

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

,而且,直接取

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

的範圍,會造成E非常大,進而變換曲線的斜率非常大,灰階擴充的結果并不是很好。是以,這裡退一步,取的輸出範圍是

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

。E的取值,如下所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       實驗:

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       從直方圖看,原圖的灰階範圍确實被拉伸了。用上面所說的方法,确定的灰階拉伸的輸入輸出曲線如下圖所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

      其Matlab代碼如下:

close all;
clear all;

%% -------------Contrast Stretching-----------------
f = imread('washed_out_pollen_image.tif');
%f = imread('einstein_orig.tif');
f = mat2gray(f,[0 255]);

[M,N] = size(f);
g = zeros(M,N);

Min_f = min(min(f));
Max_f = max(max(f));
m = (Min_f + Max_f)/2;

Out_put_min = 0.05;
Out_put_max = 0.95;

E_1 = log(1/Out_put_min - 1)/log(m/(Min_f+eps));
E_2 = log(1/Out_put_max - 1)/log(m/(Max_f+eps));
E = ceil(min(E_1,E_2)-1);

g = 1 ./(1 + (m ./ (f+ eps)).^E);
g = mat2gray(g,[1/(1+(m/eps)^E) 1/(1+(m/1+eps)^E)]);

figure();
subplot(2,2,1);
imshow(f,[0 1]);
xlabel('a).Original Image');

subplot(2,2,2);
r = imhist(f)/(M*N);
bar(0:1/255:1,r);
axis([0 1 0 max(r)]);
xlabel('b).The Histogram of a');
ylabel('Number of pixels');

subplot(2,2,3);
imshow(g,[0 1]);
xlabel('c).Results of Contrast stretching');

subplot(2,2,4);
s = imhist(g)/(M*N);
bar(0:1/255:1,s);
axis([0 1 0 max(s)]);
xlabel('b).The Histogram of a');
ylabel('Number of pixels');

in_put = 0:1/255:1;
Out_put1 = 1 ./(1 + (m ./ (double(in_put)+ eps)).^E);
Out_put1 = mat2gray(Out_put1,[1/(1+(m/eps)^E) 1/(1+(m/1+eps)^E)]);

figure();
plot(in_put,Out_put1);
axis([0,1,0,1]),grid;
axis square;
xlabel('Input intensity level');
ylabel('Onput intensity level');
           

       灰階切割

       灰階切割也是一個很簡單,但也很實用的變換。灰階切割,主要用于強調圖像的某一部份,将這個部分賦為一個較高的灰階值,其變換對應關系如下所示。

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

灰階切割有以上兩種方法,一種是特定灰階值的部分指派為一個較高的灰階值,其餘部分為一個較低的灰階值。這樣的方法,得到的結果是一個二值化圖像。另外一種方法,則是僅僅強調部分指派為一個較高的灰階值,其餘的部分不變。        實驗:

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       位圖切割

       位圖切割,就是按照圖像的位,将圖像分層處理。若圖像的某個像素,其bit7為1,則在位面7這個像素值為1,反之則為0。

       實驗:

[數字圖像處理]灰階變換——反轉,對數變換,伽馬變換,灰階拉伸,灰階切割,位圖切割

       由位圖切割的結果,圖像的主要資訊包含在了高4位。僅僅靠高4位,還原的圖像更原圖基本差不多。由此可見,位圖切割主要用于圖像壓縮。

部落格位址:http://blog.csdn.net/thnh169/ 

繼續閱讀