直方图在数字图像处理中应用的很广泛,是图像空域处理中很重要的增强手段;除了应用在图像增强领域,直方图技术还经常应用在二值化中,用于阈值的选择。
下面简单介绍并实现图像的直方图:
图像直方图就是一个对不同像素点出现的次数统计求和过程,很简单。在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
运行结果图:
有点多,就不贴出来了,想搞的自己回去运行就出来了。