1. 程式人生 > >《數字影象處理》——直方圖統計

《數字影象處理》——直方圖統計

       直方圖在數字影象處理中應用的很廣泛,是影象空域處理中很重要的增強手段;除了應用在影象增強領域,直方圖技術還經常應用在二值化中,用於閾值的選擇。

   下面簡單介紹並實現影象的直方圖:

影象直方圖就是一個對不同畫素點出現的次數統計求和過程,很簡單。在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


執行結果圖:

有點多,就不貼出來了,想搞的自己回去執行就出來了。