2016-07-23 98 views
2

我想通過我自己對直方圖均衡進行編碼,但結果與matlab histeq中的內置函數不同。任何建議爲什麼會發生這種情況?我附上了代碼和結果。 output imagesoutput histograms直方圖均衡結果

%% Histogram Equalization 
close all 
clear all 
%% 
I = imread('Iris_virginica.jpg'); 
grayI = rgb2gray(I); 
[m,n] = size(grayI); 
L = 256; 
[counts,x] = imhist(grayI); 
myCDF = cumsum(counts)/(m*n); 
equalizedI = (L-1)*myCDF(double(grayI)+1); 
equalizedI = uint8(equalizedI); 
histMyOut = imhist(equalizedI); 
builtInEqualizationI = histeq(grayI); 
histBuiltInEqu = imhist(builtInEqualizationI); 
%% 
figure 
subplot(1,3,1), stem(x,counts), title('Histogram'); 
subplot(1,3,2), stem(x,myCDF), title('Commulative Distribution'); 
subplot(1,3,3), stem(x,imhist(equalizedI)), title('Equalized'); 

figure 
subplot(1,3,1),imshow(grayI), title('Input image'); 
subplot(1,3,2), imshow(equalizedI), title('Equalized image (mine)'); 
subplot(1,3,3), imshow(builtInEqualizationI), title('Equalized image (matlab)'); 

figure 
subplot(1,3,1), stem(x,counts), title('Histogram'); 
subplot(1,3,2), stem(x,histMyOut), title('Equalized Histogram (mine)'); 
subplot(1,3,3), stem(x,histBuiltInEqu), title('Equalized Histogram (matlab)'); 

difference = abs(equalizedI-builtInEqualizationI); 
figure, imshow(difference,[]); 

回答

2

histeq默認使用64個箱,以均衡的直方圖。您正在使用默認實現histeq。試試看:

builtInEqualizationI = histeq(grayI, 256); 

...指定256個bin用於均衡,因爲您的手動代碼正在使用該許多bin進行均衡。第二個參數將覆蓋默認值,並通知histeq使用該許多分檔執行均衡。

+0

是的,結果現在非常接近,但兩幅圖像之間的差異仍然不爲零。 – Misaki

+0

可能是由於浮點錯誤。然後更新你的帖子。 – rayryeng

+0

我計算了matlab函數中直方圖中的非零元素,它們不是32 !.我如何在我的實現中添加箱數? – Misaki