(近期有用到灰度直方图的情况,就稍微做了一点点小总结,第一次总结,借鉴了很多博主的文章,下面会码出链接,膜拜大佬~)
MATLAB实现图像灰度直方图
1. 图像灰度直方图
1.1 概述
灰度直方图是将数字图像中所有像素按灰度值的大小,统计每种像素值出现的频率。
此处以uint8类的图像为例,该类图像具有2^8=256级亮度,不同亮度对应的像素数不同,统计得到256级亮度分别对应的像素数并绘制出直观的图表,其横坐标对应灰度值(0为黑色,255为白色),纵坐标对应每种像素出现的次数。
1.2 效果展示
从图像灰度级的分布可以看出一幅图像的灰度分布特性。例如,图1,2给出的是未经处理的原始图像及其对应灰度直方图:
Fig.1 原始图像
Fig.2 原始图像对应灰度直方图
如下图3,4是以调低亮度的图像(过暗图像)作为输入所对应的灰度直方图:
Fig.3 过暗图像
从图中可以看出,图3的输入图像较暗,因此其像素灰度值大多分布在较暗区域。
Fig.4 过暗图像对应灰度直方图
下图5,6是以增强亮度的图像(过亮图像)作为输入所对应的灰度直方图:
Fig.5 过亮图像
Fig.6 过亮图像对应灰度直方图
可以看出,图5的图像特性偏亮,因此其像素灰度值集中分布在亮区。
2. 相关函数
主要是在提取图像灰度直方图过程中涉及的一些MATLAB函数及其部分使用方法,具体可通过文末给出的【MATLAB函数查询】链接查询。
2.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.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 图像灰度化处理
2.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)
2.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
2.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为对应灰度值出现的频数
2.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均衡化效果图
Fig.11 均衡化后对应直方图
2.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均衡化效果图
2.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均衡化效果图
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函数的使用及图像直方图的概念】链接。
4. 附注
MATLAB函数查询
参考源:
Matlab图像处理转灰度图,绘制直方图,直方图均衡化
MATLAB自适应直方图均衡—adapthisteq
对比度增强方法
Matlab中imhist函数的使用及图像直方图的概念