灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中每种灰度出现的频率,如图所示。灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频度,它是图像最基本的统计特征。
即三步:
1.首先需要统计它的灰度级
2.统计各个灰度级想像素个数
3.以图的形式来表示,横坐标灰度级,纵坐标概率或像素个数
横坐标的r代表图像中像素灰度级,作归一化处理后,范围在[0, 1]之间。在灰度级中,r=0代表黑,r=1代表白。对于一幅给定的图像来说,每一个像素取得[0, 1]区间内的灰度级是随机的,也就是说r是一个随机变量。假定对每一瞬间,它们是连续的随机变量,那么就可以用概率密度函数pr ( r )来表示原始图像的灰度分布。如果用直角坐标系的横轴代表灰度级r,用纵轴代表灰度级的概率密度函数pr( r ),这样就可以针对一幅图像在这个坐标系中作出一条曲线来。这条曲线在概率论中就是概率密度曲线,如图所示。
灰度直方图的计算非常简单,依据定义,在离散形式下,用rk代表离散灰度级,用pr(rk)代表pr( r ),并且有下式成立:
式中:nk为图像中出现rk级灰度的像素数,n是图像像素总数,而nk/n即为频数。在直角坐标系中做出rk与pr(rk)的关系图形,即称为该图像的直方图。
(1)直方图与图像不是一一对应的:一幅图像对应一个直方图,但直方图并不一定只对应一幅图像。
(2)直方图仅能统计灰度像素出现的概率,反映不出该像素在图像中的位置,即在直方图中,没有体现图像所具有的空间信息。
(3)灰度直方图能够反映灰度图像的对比度。
(4)利用matlab计算图像直方图函数为imhist();具体用法:
imhist( i );直接显示图像i的灰度直方图;
imhist(i,n)n为指定灰度级显示直方图;
[count, x] = imhist( i ) 获取直方图信息,count为每一级灰度像素个数,x为灰度级,x也可以在imhist(i,x)中指定,可以通过stem(x,count)画相应直方图;
(5)所以说直方图不同,大致的能够反映出图像的视觉效果的好坏。
1.灰度图
%灰度直方图
f=imread('lena.jpg');
subplot(121);imshow(f);title('原图');
subplot(122);imhist(f);title('灰度直方图');
2.柱状直方图
bar(horz,v,width);
v:vertical垂直,向量,包含了将要被绘制的点
horz:horizion水平灰度级间隔,等分成几段来降低分辨率
width:宽度 范围0<=width<=1,默认值0.8
h = imhist(f);
h1 = h(1:10:256);
horz = 1:10:256;%1-256以10刻度画一条柱状
bar(horz,h1);
axis([0 255 0 3000]);#x,y轴的最大最小值范围
set(gca,'xtick',0:50:255);%0-255 坐标间隔50,get CurrentAxes获取当前轴
set(gca,'ytick',0:500:3000);%坐标间隔500
3.杆状图/火柴梗图
stem(horz,v,1,‘color_linestyle_marker’,‘fill’);
v:行向量
horz:水平标度值增量
color_linestyle_marker:线条颜色,线型,标记符号,见下图。
h = imhist(f);
h1 = h(1:10:256);
horz = 1:10:256;%1-256以10刻度画一条柱状
stem(horz,h1,'r--s','fill');%红色虚线方形
axis([0 255 0 3000]);#x,y轴的最大最小值范围
set(gca,'xtick',0:50:255);%0-255 坐标间隔50,get CurrentAxes获取当前轴
set(gca,'ytick',0:500:3000);%坐标间隔500
4.拟合曲线图
plot(horz,v,1,‘color_linestyle_marker’);
h = imhist(f);
plot(h);
axis([0 255 0 15000]);
set(gca,'xtick',0:50:255);
set(gca,'ytick',0:2000:15000);
5.实现灰度直方图的显示
I = imread('beauty.jpg');
J=rgb2gray(I);
imhist(J);