1. 程式人生 > >【影象處理】影象強度變換、直方圖均衡化(Image Intensity Transformations and Histogram Equalization)

【影象處理】影象強度變換、直方圖均衡化(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