1. 程式人生 > >【數字影象處理】Intensity Transformations and Histogram Equalization

【數字影象處理】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)進行直方圖均衡化增強。 本實驗報告中至少應包括:原始影象,原始影象的直方圖,直方圖均衡化變換函式圖,增強後的圖,增強後 影象的直方圖。用上述實驗資料解釋結果影象被增強的原因

實現程式碼:  

Intensity Transformations部分的程式:
%% (1.a)用公式(3.2-2)所示的對數變換方法進行影象增強Log_tranfor.m
function img1 = Log_tranfor(img,C)
%輸入引數:
% img   輸入8bit的影象矩陣
% C     比例常數
% 通過改變參變數C的值來探索最好的影象處理效果
double C;
[x,y]=size(img);
for i=1:x
    for j=1:y
        img1(i,j)=uint8(C*log(double(img(i,j))+1));
    end
end

%% (1.b) 指數變換方法進行影象增強的程式Exp_tranfor.m
function img1 = Exp_tranfor(img,r)
%輸入引數:
% img   輸入8bit的影象矩陣
% r     伽馬引數
% 通過改變參變數r的值來探索最好的影象處理效果
[x,y]=size(img);
C=20;double C;    %C設定為20
for i=1:x
    for j=1:y
        img1(i,j)=uint8(C*double(img(i,j))^r);
    end
End

%% (1.a)、(1.a)對數變換以及指數變換的測試程式intensity_test.m
% 說明:本程式是通過圖3.8(a)用來測試對數變換以及指數變換的
clc;clear all;close all;
m=2;n=3;
img=imread('Fig3.08(a).jpg');
 
%呼叫函式Log_tranfor進行對數變換
C1=30; double C1; img1=Log_tranfor(img,C1);
C2=35; double C2; img2=Log_tranfor(img,C2);
C3=38; double C3; img3=Log_tranfor(img,C3);
C4=40; double C4; img4=Log_tranfor(img,C4);
C5=45; double C5; img5=Log_tranfor(img,C5);
%對數變換顯示
figure;
subplot(m,n,1),imshow(img);title('圖1(a)原始影象');
subplot(m,n,2),imshow(img1);title('圖1(b)對數變換C1=30');
subplot(m,n,3),imshow(img2);title('圖1(c)對數變換C2=35');
subplot(m,n,4),imshow(img3);title('圖1(d)對數變換C3=38');
subplot(m,n,5),imshow(img4);title('圖1(e)對數變換C4=40');
subplot(m,n,6),imshow(img5);title('圖1(f)對數變換C5=45');
 
%呼叫函式Exp_tranfor進行指數變換
r1=0.3; double r1;img1=Exp_tranfor(img,r1);
r2=0.4; double r2;img2=Exp_tranfor(img,r2);
r3=0.5; double r3;img3=Exp_tranfor(img,r3);
r4=0.6; double r4;img4=Exp_tranfor(img,r4);
r5=0.7; double r5;img5=Exp_tranfor(img,r5);
%指數變換顯示
figure;
subplot(m,n,1),imshow(img);title('圖2(a)原始影象');
subplot(m,n,2),imshow(img1);title('圖2(b)指數變換r1=0.3');
subplot(m,n,3),imshow(img2);title('圖2(c)指數變換r2=0.4');
subplot(m,n,4),imshow(img3);title('圖2(d)指數變換r3=0.5');
subplot(m,n,5),imshow(img4);title('圖2(e)指數變換r4=0.6');
subplot(m,n,6),imshow(img5);title('圖2(f)指數變換r5=0.7');

Histogram Equalization部分的程式:
%% (2.a) 計算影象直方圖的程式Calculatel_hist.m
function img_hist = Calculatel_hist(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

% (2.b)直方圖均衡化增強hist_equal.m
function img_equal = hist_equal(img)
% img為輸入影象
% img_equal為直方圖均衡化後的輸出影象
 	[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

% (2.a)、(2.b)、(2.c)直方圖測試程式Histogram_test.m
% 說明:本程式是計算圖3.8(a)的直方圖,並用來測試直方圖均衡化增強技術的
clc;clear all;close all;
m=2;n=3;
img = imread('Fig3.08(a).jpg');
 
img_hist = Calculatel_hist(img)        
 
g = histeq(img,256);                           % matlab自帶直方圖均衡化函式
g_hist = Calculatel_hist(g);                   % 結果直方圖
 
img_equal = hist_equal(img);                   % 自己寫的直方圖均衡化
img_hist1 = Calculatel_hist(img_equal);        % 結果直方圖
 
figure;
subplot(m,n,1);imshow(img);title('(a) 原影象3.8(a)');
subplot(m,n,2);imshow(g);title('(b) matlab工具箱中的直方圖均衡化');
subplot(m,n,3);imshow(img_equal);title('(c) 自己編寫的直方圖均衡化');
subplot(m,n,4);bar(0:255,img_hist,'r');title('(d) 計算的直方圖');   %測試計算原影象直方圖Calculatel_hist.m程式
subplot(m,n,5);bar(0:255,g_hist,'r');title('(e) matlab中的直方圖');
subplot(m,n,6);bar(0:255,img_hist1,'r');title('(f) 自己編寫直方圖');%測試直方圖均衡化hist_equal.m程式