灰度直方图
直白的说就是图像灰度值的统计函数图像,统计图像中各个灰度值(黑白图像中点的颜色深度,范围一般从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. 一般直方图
实验所用到的图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段小区间');
实验结果
由图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); % 绘制归一化直方图
运行结果如图
总的来说,分析图像的灰度直方图可以得到很多有效的信息,如可以很直观的了解图像的亮度和对比度等信息。
直方图的峰值分布可以反映图像的亮暗:如果图像较亮,则峰值出现在直方图的靠右部分;如果图像较暗,则峰值出现在直方图的靠左部分。如果直方图只在中间一小段有非零值,则图像的对比度较低;如果直方图的非零值分布广泛且比较均匀,则图像的对比度较高。