(近期有用到灰度直方图的情况,就稍微做了一点点小总结,第一次总结,借鉴了很多博主的文章,下面会码出链接,膜拜大佬~)

1. 图像灰度直方图

灰度直方图是将数字图像中所有像素按灰度值的大小,统计每种像素值出现的频率。
此处以uint8类的图像为例,该类图像具有2^8=256级亮度,不同亮度对应的像素数不同,统计得到256级亮度分别对应的像素数并绘制出直观的图表,其横坐标对应灰度值(0为黑色,255为白色),纵坐标对应每种像素出现的次数。
从图像灰度级的分布可以看出一幅图像的灰度分布特性。例如,图1,2给出的是未经处理的原始图像及其对应灰度直方图:
Fig.1 原始图像
原图
Fig.2 原始图像对应灰度直方图
原始图像的灰度直方图
如下图3,4是以调低亮度的图像(过暗图像)作为输入所对应的灰度直方图:
Fig.3 过暗图像过暗图像
从图中可以看出,图3的输入图像较暗,因此其像素灰度值大多分布在较暗区域。
Fig.4 过暗图像对应灰度直方图
过暗图像对应灰度直方图
下图5,6是以增强亮度的图像(过亮图像)作为输入所对应的灰度直方图:
Fig.5 过亮图像
过亮图像
Fig.6 过亮图像对应灰度直方图
过亮图像对应灰度直方图
可以看出,图5的图像特性偏亮,因此其像素灰度值集中分布在亮区。

2. 相关函数

主要是在提取图像灰度直方图过程中涉及的一些MATLAB函数及其部分使用方法,具体可通过文末给出的【MATLAB函数查询】链接查询。
1. imread() —— 图像读入函数

A = imread(‘filename’) ;
从 filename 指定的文件读取图像,并从文件内容推断出其格式。如果 filename 为多图像文件,则 imread 读取该文件中的第一个图像。

使用imread()读取图像,括号内应用引号给出图像文件的全名字符串(包括任何可用的扩展名,比如图像类型),但采用这条语句,其输入图片必须与.m文件在同一目录下(同一文件夹中),例如语句1:

f = imread('PicName.jpg');

也可读取其他文件夹中的图像,例如语句2:

f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');

此处给出一组代码1,实现读取一幅图像并显示,设置标题为Pic:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径读入图像
figure,imshow(f);title('Pic');	% 显示图像并设置标题为Pic

Fig.7 读取并显示图像
读取并显示图像
2.rgb2gray() —— 真彩图像灰度化函数

I = rgb2gray(RGB);
rgb2gray函数通过消除色调和饱和度信息,同时保留亮度,将RGB图像转换为灰度图。

通过对输入的RGB图像进行灰度化处理,获取对应的灰度图像。如下给出一组代码2,实现对RGB图像的读取、灰度化、显示、并设置标题:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径读入图像
gray_f = rgb2gray(f);	% 灰度化处理
figure,
subplot(121);imshow(f);title('Org');	% 显示图像并设置标题为Org
subplot(122);imshow(gray_f);title('Gray');	% 显示图像并设置标题为Gary

Fig.8 图像灰度化处理
图像灰度化处理
3.imwrite() —— 图像写入函数

imwrite(A,‘filename’);
将图像数据A写入filename指定的文件,并从扩展名推断出文件格式。imwrite在当前文件夹中创建新文件,输出图像的位深度取决于A的数据类型和文件格式。
imwrite(A,map,‘filename’);
将A中的索引图像及其关联的颜色图写入由 map filename 指定的文件。

使用imwirte()函数将图像以指定名称及格式写入当前目录,如下代码3所示,实现将灰度处理后的图像数据命名为GrayImg,并以JPG格式存入指定目录:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径(E:\matlab\2020a\cx\pic)读入图像
gray_f = rgb2gray(f);	% 灰度化处理
imwrite(gray_f,'E:\matlab\2020a\cx\pic\GrayImg.jpg');	% 将灰度处理后的图像数据命名为GrayImg并以JPG格式存入指定目录(E:\matlab\2020a\cx\pic)

4.imshow() —— 图像显示函数

imshow(I);
在图窗中显示灰度图像I。imshow使用图像数据类型的默认显示范围,并优化图窗、坐标区和图像对象属性以便显示图像。
imshow(‘filename’);
显示存储在由filename指定的图形文件中的图像。

使用imshow()函数显示图像,如下代码4所示,实现读取图像并显示出来,设置标题为Org:

close all;clear all;clc 
I = imread('E:\matlab\2020a\cx\pic\PicName1.jpg');	% 从目标路径读入图像
figure,
imshow(I);title('Org');	% 显示图像并设置标题为Org

5.imhist() ——绘制图像直方图函数

imhist(I) ;
绘制灰度图像I的图像直方图,可直接显示。
imhist(I,n);
指定灰度级的数目为n,n默认为256.。
[counts,x] = imhist(I);
计算灰度图像I的直方图,并返回直方图的数据(出现的灰度级与其出现次数),并通过stem(x,counts)可绘制直方图。

如代码5,实现获取图像的灰度直方图:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径读入图像
gray_f = rgb2gray(f);	% 灰度化处理
figure,
subplot(121);imshow(gray_f);title('灰度图像');
subplot(122);imhist(gray_f);title('Gray Histogram');	% 绘制并显示灰度直方图

Fig.9 获取灰度直方图
获取灰度直方图
代码6,实现获取图像的灰度直方图统计信息:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径读入图像
gray_f = rgb2gray(f);	% 灰度化处理
[Cot,Val] = imhist(gray_f);	% 获取直方图统计信息,Val为出现的灰度值,Cot为对应灰度值出现的频数

6.histeq()——直方图均衡化函数
直方图均衡化是一种利用灰度变换自动调节图像对比度质量的方法,基本思想是通过灰度级的概率密度函数求出灰度变换函数,是一种以累计分布函数变换法为基础的直方图修正法。
在MATLAB图像处理工具箱中提供了函数histeq()进行直方图均衡化处理。

J = histeq(I,n);
变换灰度图像I,返回具有n个离散灰度级的直方图均衡化后的灰度图像J,n默认为64。该变换使映射到J的n个灰度级中每个级别的像素个数大致相等,直方图大致平坦,且当n<<I中的离散灰度级数时,直方图更平坦。
J = histeq(I,hgram);
直方图规定化,hgram为一个整数向量,以使输出灰度图像J具有length(hgram)个bin的直方图近似匹配目标直方图hgram。
[J,T] = histeq(I);
返回灰度变换T,该变换将图像I中的灰度级映射到J中的灰度级。

通过函数histeq()对图像进行直方图均衡化处理,其具体实现如下代码7所示:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径读入图像
gray_f = rgb2gray(f);	% 灰度化处理
hgram = ones(1,256);
J = histeq(gray_f);	% 使用直方图均衡增强强度图像的对比度(默认n=64)
T = histeq(gray_f,hgram);	% 直方图规定化
figure,
subplot(131);imshow(uint8(gray_f));title('原始灰度图像');		% 显示灰度原始图像
subplot(132);imshow(uint8(J));title('histeq均衡化结果');		% 显示均衡化后的结果图像
subplot(133);imshow(uint8(T));title('直方图规定化结果');		% 显示规定化均衡后的结果图像
figure,
subplot(131);imhist(gray_f);title('灰度图像直方图');		% 显示原始图像的直方图
subplot(132);imhist(J);title('histeq均衡化直方图');		% 显示均衡化后的直方图
subplot(133);imhist(T);title('规定化均衡后直方图');		% 显示规定化均衡后的直方图

Fig.10 histeq均衡化效果图
histeq均衡化效果图
Fig.11 均衡化后对应直方图
均衡化后对应直方图

7.adapthisteq()——直方图均衡化函数
与histeq()函数不同,adapthisteq()的处理目标是图片的小块区域的数据,而非整幅图像的对比度增强,使输出区域的直方图大约匹配指定的直方图,相邻的小块采用双线性插值混合,以消除人工诱导的边界。

J = adapthisteq(I);
使用限制对比度的自适应直方图均衡化 (CLAHE) 来变换值,从而增强灰度图像I的对比度。

具体参考文末链接【MATLAB自适应直方图均衡—adapthisteq】。
如下给出一组代码8,实现采用adapthisteq()对图像灰度直方图的均衡化处理:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径读入图像
gray_f = rgb2gray(f);	% 灰度化处理
F = adapthisteq(gray_f);		% adapthisteq均衡后的直方图
figure,
subplot(221);imshow(gray_f);title('灰度图像');
subplot(222);imshow(F);title('均衡化后图像');   % adapthisteq均衡后效果图
subplot(223);imhist(gray_f);title('Gray Histogram');     % 绘制并显示灰度直方图
subplot(224);imhist(F);title('Histogram Equalization');  % 绘制并显示均衡化后的灰度直方图

Fig.12 adapthisteq均衡化效果图
adapthisteq均衡化效果图

8.imadjust()——图像灰度值调整函数

J = imadjust(I);
对图像I进行灰度调整。将灰度图像I中的强度值映射到J中的新值,默认对所有像素值中最低的1%和最高的1%进行饱和处理,提高输出图像J的对比度。
J = imadjust(I,[low_in high_in]);
[low_in high_in]为原图像中要变换的灰度范围。该处理将I中的强度值映射到J中的新值,使low_in和high_in之间的值映射到0到1之间的值。
J = imadjust(I,[low_in high_in],[low_out high_out]);
[low_in high_in]为原图像中要变换的灰度范围,[low_out high_out]为变换后的灰度范围。该处理将I中的强度值映射到J中的新值,使low_in和high_in之间的值映射到low_out到high_out之间的值。
J = imadjust(I,[low_in high_in],[low_out high_out],gamma);
将I中的强度值映射到J中的新值,其中gamma为映射方式,指定了描述I和J中的值之间关系的曲线形状,默认值为1,即线性映射,当gamma≠1时为非线性映射
RGB2 = imadjust(RGB1,[low_in high_in],___);
对彩色图像RGB1进行调整。将真彩色图像RGB1中的值映射到J中的新值,可为每个颜色通道应用相同的映射或互不相同的映射。

通过imadjust()函数调整灰度范围,给出的原图像的灰度范围为0~255,设置待变换的范围为[0.2 0.5],变换后的范围为[0 1],即将小于51(=255×0.2)的灰度值设置为0,将大于127.5(=255×0.5)的灰度值设置为255。
其中,可通过参数gamma调整图像亮度,若gamma<1,加强亮色值输出;gamma>1,加强暗色值输出。
具体实现如下代码9所示:

close all;clear all;clc 
f = imread('E:\matlab\2020a\cx\pic\PicName.jpg');	% 从目标路径读入图像
gray_f = rgb2gray(f);	% 灰度化处理
J = imadjust(gray_f);	% 默认调整灰度值
T = imadjust(gray_f,[0.2 0.5],[0 1]);	% 调整灰度值 
G = imadjust(gray_f,[0.2 0.5],[0 1],0.4);	% 调整灰度值并提高亮度
D = imadjust(gray_f,[0.2 0.5],[0 1],4);	% 调整灰度值并降低亮度
figure,
subplot(231);imshow(f);title('原图');
subplot(232);imshow(gray_f);title('灰度图像');
subplot(233);imshow(J);title('默认调整后效果图');
subplot(234);imshow(T);title('调整灰度值范围效果图');
subplot(235);imshow(G);title('调整灰度值范围并提高亮度效果图');
subplot(236);imshow(D);title('调整灰度值范围并降低亮度效果图');
figure,
subplot(231);imhist(gray_f);title('灰度图像直方图');
subplot(232);imhist(J);title('默认调整后直方图');
subplot(233);imhist(T);title('调整灰度值范围直方图');
subplot(234);imhist(G);title('调整灰度值范围并提高亮度直方图');
subplot(235);imhist(D);title('调整灰度值范围并降低亮度直方图');

Fig.13 adapthisteq均衡化效果图
 adapthisteq均衡化效果图
Fig.14 均衡化后对应直方图
在这里插入图片描述
上述6~8函数均能够实现增强图像对比度,具体内容参考文末给出的【对比度增强方法】链接。

3. 代码实现与结果

MATLAB实现对目标图像灰度化处理,计算并显示其灰度直方图,后分别采用histeq()、adapthisteq()、imajust()函数处理原灰度图像,计算并显示其灰度直方图。

% Gray histogram Test Function

close all;clear all;clc

%% 1.读入图像:打开指定路径图片
f = imread('E:\matlab\2020a\cx\Bookei\Gray histogram\pic\nor.jpg');    % 读图

%% 2.灰度化
gray_f = rgb2gray(f);	% 灰度化处理

%% 3.保存图片
imwrite(gray_f,'E:\matlab\2020a\cx\fuzhuang\paper\Gray histogram\pic\11.jpg');

%% 4.读取图片信息(可要可不要)
info = imfinfo('E:\matlab\2020a\cx\fuzhuang\paper\Gray histogram\pic\11.jpg');

%% 5.histeq均衡化处理(默认n=64)
R1 = histeq(gray_f);	% 使用直方图均衡增强灰度图像的对比度

%% 6.adapthisteq均衡化处理
R2 = adapthisteq(gray_f);   % adapthisteq均衡后的直方图

%% 7.imadjust灰度范围调整
R3 = imadjust(gray_f,[0.2 0.5],[0 1]);	% 调整灰度值 

%% 8.效果图显示
figure,
subplot(231);imshow(f);title('原图');
subplot(232);imshow(gray_f);title('灰度图像');
subplot(233);imshow(R1);title('histeq均衡化结果图(默认n=64)');
subplot(234);imshow(R2);title('adapthisteq均衡化结果图');
subplot(235);imshow(R3);title('imadjust灰度范围调整结果图');

%% 9.直方图显示
figure,
subplot(221);imhist(gray_f);title('Gray Histogram');       % 绘制并显示灰度直方图
subplot(222);imhist(R1);title('histeq均衡化直方图');        % 显示histeq均衡化后的直方图
subplot(223);imhist(R2);title('adapthisteq均衡化直方图');	    % 显示adapthisteq均衡化后的直方图
subplot(224);imhist(R3);title('imadjust灰度范围调整后直方图');	% 显示imadjust灰度范围调整后的直方图

Fig.15 效果图显示
效果图显示
Fig.16 直方图显示

直方图显示
除了能用函数imhist绘制直方图以外,还能使用函数bar、stem、plot绘制图像的直方图,具体参考文末【Matlab中imhist函数的使用及图像直方图的概念】链接。

MATLAB函数查询
参考源:
Matlab图像处理转灰度图,绘制直方图,直方图均衡化
MATLAB自适应直方图均衡—adapthisteq
对比度增强方法
Matlab中imhist函数的使用及图像直方图的概念

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐