直方圖在數字圖像處理中應用的很廣泛,是圖像空域處理中很重要的增強手段;除了應用在圖像增強領域,直方圖技術還經常應用在二值化中,用於閾值的選擇。
下面簡單介紹並實現圖像的直方圖:
圖像直方圖就是一個對不同像素點出現的次數統計求和過程,很簡單。在matlab中有很多方法可以實現,我這裏列舉我比較喜歡的兩種方法。
第一種:
for i = 0 : 255 % 對於灰度圖像,只有256個灰度級
sumPix(i + 1) = sum( img(:) == i );
end
第二種:
for i = 0 : 255
sumPix(i + 1) = length( find( img == i) );
end
得到像素點的分佈之後,下面就是直方圖顯示問題,這裏可以有很多方式來顯示,有:plot,bar,stem三種方式
下面貼出我自己所有的源代碼(因爲自己也是學習過程,想盡量多弄懂一些函數用法,所以源碼有點亂)
%function [ sumPix pix ] = My_hist( img )
% test: img = imread('4.bmp');
%
img = imread('4.bmp');
classin = class(img);
if strcmp( classin, 'uint8' )
pix = [0:255];
elseif strcmp( classin, 'double' )
pix = [0: 65535];
elseif strcmp( classin, 'logical')
pix = [ 0: 1];
end
%第一步:進行像素灰度統計;
% 方法一:
for i = 0 : pix(end)
sumPix(i + 1) = sum( img(:) == i );
end
% 方法二:
% for i = 0 : pix(end)
% sumPix(i + 1) = length( find( img == i) );
% end
%繪製直方圖方法一: bar
bar( pix, sumPix, 0);axis([0 pix(end) 0 max(sumPix)]);title('MyHist');
figure;
bar( pix, sumPix, 0);axis([0 pix(end) 0 max(sumPix)]);
set(gca, 'xtick', 0: 75: pix(end) ); % gca:"獲得當前座標軸",xtick和ytick按所示的間隔設置水平軸和垂直軸的刻度
set(gca, 'ytick', 0: 1000: max(sumPix) );
text(100, 15000, 'This is my 統計直方圖函數顯示結果');
title('bar');
%繪製直方圖方法二: stem
figure;
stem( pix, sumPix, 'fill');
ylim('auto');
xlim('auto');
text(100, 15000, 'This is my 統計直方圖函數顯示結果');
title('stem');
%繪製直方圖方法三: plot(將這一組點用線連接起來)
figure;plot(pix, sumPix);
title('plot');
%end
4.bmp
運行結果圖:
有點多,就不貼出來了,想搞的自己回去運行就出來了。