【數字影象處理】Intensity Transformations and Histogram Equalization
阿新 • • 發佈:2018-12-20
實驗要求:
該實驗使用強度變換方法對影象進行增強。實驗影象為圖 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程式