灰度直方图


直白的说就是图像灰度值的统计函数图像,统计图像中各个灰度值(黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0)出现的次数或概率。

MATLAB中imhist可以进行图像的灰度直方图运算:
imhist ( I )
imhist ( I , n )
[ counts , x ] = imhist ( … )

参数说明

  • I 为要计算灰度直方图的图像数据
  • n 为指定灰度级数目。将所有的灰度级均匀的分布在n 个小区间内,如n为32,则可以将0~255总共256个灰度级划分为32个长度为8的灰度空间。调用imhist(I,32)后,此时纵轴分别统计每个长度为8的灰度空间的像素在图像中出现的次数或概率。一般n设为2的整数次幂,这样可以无需圆整

返回值

  • counts为直方图数据向量。counts(i)表示第i个灰度区间的像素数目。
  • x是保存了对应的灰度小区间的向量。
    若调用时不接收这个函数的返回值,则直接显示直方图;在得到这些返回数据之后,可以使用stem(x,counts)来手工绘制直方图。

1. 一般直方图

python 计算灰度直方图 计算灰度直方图matlab_matlab


实验所用到的图1名称qilin.bmp(这里采用的图片其模式都是灰度模式)

对于彩色图片而言可以用下列程序

I=imread('图片名称');    % 读取图片
R=I(:,:,1);             % 获取图片红通道信息
G=I(:,:,2);             % 获取图片绿通道信息
B=I(:,:,3);         	% 获取图片蓝通道信息

得到RGB三原色的各自的灰度分布,然后再用inhist(…)显示出其灰度直方图。

% 一般直方图
clear,clc;
close all;
I = imread('qilin.bmp'); 	% 读取图片
figure; 					% 创建窗口
imshow(I);title('Source'); 	% 显示并命名标题
figure;
subplot(1,2,1);				% 把绘图窗口分成1行2列2块区域,聚焦到第一块区域
imhist(I);title('Histogram未分段');
subplot(1,2,2);				% 把绘图窗口分成1行2列2块区域,聚焦到第二块区域
imhist(I,64);title('Histogram分为64段小区间');

实验结果

python 计算灰度直方图 计算灰度直方图matlab_matlab_02


由图2可见指定了n后,灰度就变得比较离散。

2. 归一化直方图

在imhist函数返回值中,counts得到每个小区间的像素个数,再计算counts与图像中像素总数的比值就可以得到归一化的直方图。

%归一化直方图
clear,clc;
close all;
I = imread('qilin.bmp');	% 读取图片
figure;                     % 创建窗口
[M,N] = size(I);            % 计算图像大小
[counts,x] = imhist(I,32);  % 计算有32个小区间的灰度直方图
counts = counts/(M*N);      % 计算归一化灰度直方图各区间的值
stem(x,counts);             % 绘制归一化直方图

运行结果如图

python 计算灰度直方图 计算灰度直方图matlab_matlab_03


总的来说,分析图像的灰度直方图可以得到很多有效的信息,如可以很直观的了解图像的亮度和对比度等信息。
直方图的峰值分布可以反映图像的亮暗:如果图像较亮,则峰值出现在直方图的靠右部分;如果图像较暗,则峰值出现在直方图的靠左部分。如果直方图只在中间一小段有非零值,则图像的对比度较低;如果直方图的非零值分布广泛且比较均匀,则图像的对比度较高。