【圖像處理】圖像強度變換、直方圖均衡化(Image Intensity Transformations and Histogram Equalization)

實驗要求

  該實驗使用強度變換方法對圖像進行增強。實驗圖像爲圖3.8(a)

  (1.a) 用公式(3.2-2)所示的對數變換方法進行圖像增強。

  (1.b) 用公式(3.2-3)形式的指數變換方法進行圖像增強。實驗的目的是用(1.a)和(1.b)中的方法獲得最好的可視化增強效果。根據你自己的判斷調整參數,對每一個變換獲得最好的可視化結果,並解釋結果圖像之間產生差異的主要原因。

  (2.a) 編寫一個計算圖像直方圖的程序。

  (2.b) 實現在3.3.1 節中討論的直方圖均衡化技術。

  (2.c) 對圖3.8(a)進行直方圖均衡化增強。

  本實驗報告中至少應包括:原始圖像,原始圖像的直方圖,直方圖均衡化變換函數圖,增強後的圖,增強後圖像的直方圖。用上述實驗數據解釋結果圖像被增強的原因。


技術論述

1、 對數變換

  對數變換的一般表達式爲:

s = c * log(1 + r)

  在灰度對數變換中,c表示爲尺度比例常數,r爲原圖灰度值,s爲變換後的目標灰度值。

  對數變換將輸入中範圍較窄的低灰度值映射爲輸出中較寬範圍的灰度值,相反地,對高的輸入灰度值也是如此。運用對數變換可以擴展圖像中的暗像素的值,同時壓縮更高灰度級的值,使得圖像的灰度分佈更加符合人的視覺特性。

  對數與對比度拉伸是進行動態範圍處理的基本工具。對數變換通過如下表達式實現:

g = c * log ( 1 + double ( f ) )

  當執行一個對數變換時,我們通常期望將壓縮值還原爲顯示的全範圍。對8比特而言,可使用語句:

gs = im2uint8 ( mat2gray ( g ) ) ;   

  使用函數mat2gray可將值限定在範圍[0,1]內,使用函數im2uint8可將值限定在範圍[0,255]內。

2、 指數變換

  指數變換的基本形式爲:

s = c * rγ

  其中,c和γ爲正常數。該表達式也寫作s = c * (r + ε)γ。

  一般,我們稱之爲冪律變換或是伽馬變換。γ值小於1時,會拉伸圖像中灰度級較低的區域,同時會壓縮灰度級較高的部分。γ值大於1時,會拉伸圖像中灰度級較高的區域,同時會壓縮灰度級較低的部分。

3、 圖像直方圖

  圖像直方圖描述了一幅圖像的繪圖統計信息,主要應用於圖像分割和圖像灰度變換等處理過程。

  數學意義上,它是一個關於灰度的函數,以256級灰度級圖像爲例,對於每一個灰度值x∈[0,255],都有相應的f(x)表示該圖像上灰度值爲x的像素的數量。

  從圖形上來說,灰度直方圖是一個二維圖,橫座標表示灰度值(灰度級別),縱座標表示具有各個灰度值或灰度級別的像素在圖像中出現的次數或者概率。

p(rk) = nk/(M * N)

  其中,rk爲第k級灰度值,nk是圖像中灰度爲rk的像素個數,M、N分別爲圖像的行數和列數,p(rk)是灰度級rk在圖像中出現的概率的一個估計。

4、 直方圖均衡化

  直方圖均衡化的基本思想是對圖像中像素個數多的灰度級進行擴展,而對圖像中像素個數少的灰度進行壓縮,從而擴展像素的取值範圍,提高對比度和灰度色調的變化,使圖像更加清晰。

  直方圖均衡化一來可以提高圖像的對比度,二來可以把圖像變換成像素值是幾乎均勻分佈的圖像。

假定r已經標準化在[0,1]區間內,r=0表示黑色,r=1表示白色,變換函數爲:

s=T(r), 0 =< r < = 1,

  滿足以下條件: (a)T(r)是一單值函數,並且在區間[0,1]單調遞增; (b)對 0 <= r <= 1,0<= T(r) <=1。


實驗結果

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述


實驗程序

% 第一個:強度變換方法對圖像進行增強
% 主函數
I = imread('Fig3.08(a).jpg');

% 對數變換
I_log1 = logarithm(I,0.1);
I_log2 = logarithm(I,1);

% 直方圖顯示
I_hist = histogram(I);
I_log1hist = histogram(I_log1);
I_log2hist = histogram(I_log2);

% 對數變換輸出結果
subplot(3,2,1);imshow(I);title('原圖像');
subplot(3,2,2);bar(0:255,I_hist,'b');title('原圖像直方圖');
subplot(3,2,3);imshow(I_log1);title('對數變換:c=0.1');
subplot(3,2,4);bar(0:255,I_log1hist,'b');title('對數變換c=0.1後直方圖');
subplot(3,2,5);imshow(I_log2);title('對數變換:c=1');
subplot(3,2,6);bar(0:255,I_log2hist,'b');title('對數變換c=1後直方圖');

% 指數變換
I_exp1 = exponent(I,1,0.3);
I_exp2 = exponent(I,1,0.4);
I_exp3 = exponent(I,1,0.5);
I_exp4 = exponent(I,1,2);
I_exp5 = exponent(I,1,10);

% 直方圖顯示
I_exp1hist = histogram(I);
I_exp2hist = histogram(I_exp2);
I_exp3hist = histogram(I_exp4);
I_exp4hist = histogram(I_exp5);

% 指數變換輸出結果
figure;
subplot(3,2,1);imshow(I,[]);title('原圖像');
subplot(3,2,2);imshow(I_exp1,[]);title('指數變換:γ=0.3');
subplot(3,2,3);imshow(I_exp2,[]);title('指數變換:γ=0.4');
subplot(3,2,4);imshow(I_exp3,[]);title('指數變換:γ=0.5');
subplot(3,2,5);imshow(I_exp4,[]);title('指數變換:γ=2');
subplot(3,2,6);imshow(I_exp5,[]);title('指數變換:γ=10');

figure;
subplot(2,2,1);bar(0:255,I_exp1hist,'b');title('原圖像直方圖');
subplot(2,2,2);bar(0:255,I_exp2hist,'b');title('c=0.4直方圖');
subplot(2,2,3);bar(0:255,I_exp3hist,'b');title('c=2直方圖');
subplot(2,2,4);bar(0:255,I_exp4hist,'b');title('c=10直方圖');
function img_log = logarithm(img,c)
% 灰度對數變換: s=c*log(1+r)
% 第一個參數爲灰度圖像,第二個參數確定尺度比例常數

img_log = c*log(double(img)+1);
img_log = im2uint8(mat2gray(img_log));

end
function img_exp = exponent(img,c,n)
% 指數變換: s = c * r ^ n

img_exp = c*double(img).^n;
img_exp = uint8(img_exp);
end
% 第二個:圖像直方圖及直方圖均衡化

% 主函數
I = imread('Fig3.08(a).jpg');
I_hist = histogram(I);                       % 原圖像直方圖

g = histeq(I,256);                           % matlab自帶直方圖均衡化函數
g_hist = histogram(g);                       % 結果直方圖

I_equal = equalize(I);                       % 自己寫的直方圖均衡化
Ie_hist = histogram(I_equal);                % 結果直方圖

figure;
subplot(3,2,1);imshow(I);title('原圖像');
subplot(3,2,2);bar(0:255,I_hist,'b');title('原圖像直方圖');
subplot(3,2,3);imshow(g);title('matlab自帶直方圖均衡化');
subplot(3,2,4);bar(0:255,g_hist,'b');title('自帶函數直方圖');
subplot(3,2,5);imshow(I_equal);title('自寫直方圖均衡化');
subplot(3,2,6);bar(0:255,Ie_hist,'b');title('自寫均衡化直方圖');
function img_hist = histogram(img)
% 繪製圖像直方圖

[M,N] = size(img);
img_hist = zeros(1,256);

for k = 0:255
    for m = 1:M
        for n = 1:N
            img_hist(k+1) = img_hist(k+1) + (img(m,n) == k);
        end
    end
end

% 第二種方法計算圖像各灰度級的數量
% for k = 0:255
%     H(k+1) = sum(sum(img == k));              % sum(X)是按列求和
% end

end
function img_equal = equalize(img)
% 直方圖均衡化

[M,N] = size(img);
img = double(img);
H = zeros(1,256);

for k = 0:255                                  % 獲取各個灰度級的數量
    for m = 1:M
        for n = 1:N
            H(k+1) = H(k+1) + (img(m,n) == k);
        end
    end
end

P = H/(M*N);                                   % 各個灰度級的概率

for k = 2:256                                  % 灰度級累計概率
    P(k) = P(k) + P(k-1);
end

for k = 1:256                                  % 從[0,1]映射到[0,255]
    I = uint8(round(P.*255));
end

for m = 1:M
    for n = 1:N
        img_equal(m,n) = I(img(m,n)+1);
    end
end

figure;
x = 0:255;
plot(x,P(x+1));
title('直方圖均衡化變換函數圖');

end
發佈了99 篇原創文章 · 獲贊 210 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章