-
2021-03-19 19:57:13
灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。横坐标表示灰度值(灰度级),纵坐标表示具有各个灰度值或者灰度级别的像素在图像中出现的次数或者概率。
Matlab有两个绘制灰度直方图的函数,分别是imhist和histogram
如果直接绘制图像的灰度直方图
A=imread('1.jpg'); subplot(2,2,1); imhist(A); subplot(2,2,2); histogram(A);
imhist的NumBins值是由图像类型决定的。若图像为uint8类型,则bin的数量为256,即[0:1:255]。
histogram的NumBins值可以人为设定,在未指定该参数时,系统将基于图像的灰度分布自动计算NumBins的值。
如果是对处理后的**.mat图像矩阵**绘制灰度直方图
A=importdata('2.mat'); subplot(2,2,1); imhist(uint8(A)); subplot(2,2,2); histogram(A);
可见,histogram可以更清楚的反映出灰度级的分布情况。注:但不能确定灰度值所在图像中的位置。
关于imhist(I,n)的一些用法,可以参考这篇文章:https://blog.csdn.net/weixin_44225182/article/details/100378345
关于hist和histogram的区别可以参考这篇文章:
https://blog.csdn.net/fadbgfnbxb/article/details/93199679更多相关内容 -
图像处理篇-利用matlab绘制灰度直方图
2019-04-21 16:11:40利用matlab绘制灰度直方图 figure; I=imread('G:\matlab\img\1.jpg'); subplot(1,2,1);imshow(I); title('原始图像'); imwrite(I,'test.png'); subplot(1,2,2); imhist(y); title('灰度图像直方图'); ...平台:windows7
软件:matlab 2014b
利用matlab绘制灰度直方图
figure; I=imread('G:\matlab\img\1.jpg'); subplot(1,2,1);imshow(I); title('原始图像'); imwrite(I,'test.png'); subplot(1,2,2); imhist(y); title('灰度图像直方图');
在利用imhist绘制直方图的时候,报错,如图
灰度直方图的绘制需要imhist函数,若直接imhist,由于图像是RGB格式,是3维的,是不能绘制的.
使用rgb2gray将图像转化为灰度图
figure; I=imread('G:\matlab\img\1.jpg'); subplot(1,3,1);imshow(I); title('原始图像'); imwrite(I,'test.png'); subplot(1,3,2); y=rgb2gray(I); imshow(y); title('灰度图'); subplot(1,3,3); imhist(y); title('灰度图像直方图');
-
灰度直方图 MATLAB
2014-10-19 15:53:01简单实用的MATLAB灰度直方图程序代码,统计图像中各个灰度的比例。 -
matlab绘制灰度直方图
2016-12-11 15:15:02大神帮忙看看这个程序 输入一张灰度图 为什么执行到计算灰度直方图处就出错 filename='C:\Users\zaj\Desktop\QQ图片20161211145443.jpg'; %文件路径 imfinfo(filename) %显示图片信息 img=imread(filename); %... -
MATLAB实现图像灰度直方图
2020-09-08 11:21:34MATLAB实现图像灰度直方图 (近期有用到灰度直方图的情况,就稍微做了一点点小总结,第一次总结,借鉴了很多博主的文章,下面会码出链接,膜拜大佬~) 1. 图像灰度直方图 灰度直方图是将数字图像中所有像素按灰度值...(近期有用到灰度直方图的情况,就稍微做了一点点小总结,第一次总结,借鉴了很多博主的文章,下面会码出链接,膜拜大佬~)
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均衡化效果图
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均衡化效果图
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函数的使用及图像直方图的概念】链接。MATLAB函数查询
参考源:
Matlab图像处理转灰度图,绘制直方图,直方图均衡化
MATLAB自适应直方图均衡—adapthisteq
对比度增强方法
Matlab中imhist函数的使用及图像直方图的概念 -
Matlab绘制图像直方图,不使用imhist
2014-02-13 12:31:31不使用imhist绘制灰度直方图,可以自己定义bins的数目 -
matlab灰度直方图均衡化_图像的灰度直方图、直方图均衡化、直方图规定化(匹配)
2020-11-20 08:15:16本文主要介绍了灰度直方图相关的处理,包括以下几个方面的内容:利用OpenCV计算图像的灰度直方图,并绘制直方图曲线直方图均衡化的原理及实现直方图规定化(匹配)的原理及实现图像的灰度直方图一幅图像由不同灰度值的...本文主要介绍了灰度直方图相关的处理,包括以下几个方面的内容:
- 利用OpenCV计算图像的灰度直方图,并绘制直方图曲线
- 直方图均衡化的原理及实现
- 直方图规定化(匹配)的原理及实现
图像的灰度直方图
一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。
图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。
不过通常会将纵坐标归一化到[0,1]区间内,也就是将灰度级出现的频率(像素个数)除以图像中像素的总数。灰度直方图的计算公式如下:
其中,rk是像素的灰度级,nk是具有灰度rk的像素的个数,MN是图像中总的像素个数。
OpenCV灰度直方图的计算
直方图的计算是很简单的,无非是遍历图像的像素,统计每个灰度级的个数。在OpenCV中封装了直方图的计算函数calcHist,为了更为通用该函数的参数有些复杂,其声明如下:
void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate = false );
该函数能够同时计算多个图像,多个通道,不同灰度范围的灰度直方图. 其参数如下
- images,输入图像的数组,这些图像要有相同大大小,相同的深度(CV_8U CV_16U CV_32F).
- nimages ,输入图像的个数
- mask,可选的掩码,不使用时可设为空。要和输入图像具有相同的大小,在进行直方图计算的时候,只会统计该掩码不为0的对应像素
- hist,输出的直方图
- dims,直方图的维度
- histSize,直方图每个维度的大小
- ranges,直方图每个维度要统计的灰度级的范围
- uniform,是否进行归一化,默认为true
- accumulate,累积标志,默认值为false。
为了计算的灵活性和通用性,OpenCV的灰度直方图提供了较多的参数,但对于只是简单的计算一幅灰度图的直方图的话,又显得较为累赘。这里对calcHist进行一次封装,能够方便的得到一幅灰度图直方图。
class Histogram1D{private: int histSize[1]; // 项的数量 float hranges[2]; // 统计像素的最大值和最小值 const float* ranges[1]; int channels[1]; // 仅计算一个通道public: Histogram1D() { // 准备1D直方图的参数 histSize[0] = 256; hranges[0] = 0.0f; hranges[1] = 255.0f; ranges[0] = hranges; channels[0] = 0; } MatND getHistogram(const Mat &image) { MatND hist; // 计算直方图 calcHist(&image ,// 要计算图像的 1, // 只计算一幅图像的直方图 channels, // 通道数量 Mat(), // 不使用掩码 hist, // 存放直方图 1, // 1D直方图 histSize, // 统计的灰度的个数 ranges); // 灰度值的范围 return hist; } Mat getHistogramImage(const Mat &image) { MatND hist = getHistogram(image); // 最大值,最小值 double maxVal = 0.0f; double minVal = 0.0f; minMaxLoc(hist, &minVal, &maxVal); //显示直方图的图像 Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255)); // 设置最高点为nbins的90% int hpt = static_cast(0.9 * histSize[0]); //每个条目绘制一条垂直线 for (int h = 0; h < histSize[0]; h++) { float binVal = hist.at(h); int intensity = static_cast(binVal * hpt / maxVal); // 两点之间绘制一条直线 line(histImg, Point(h, histSize[0]), Point(h, histSize[0] - intensity), Scalar::all(0)); } return histImg; }};
Histogram1D提供了两个方法:getHistogram返回统计直方图的数组,默认计算的灰度范围是[0,255];getHistogramImage将图像的直方图以线条的形式画出来,并返回包含直方图的图像。测试代码如下:
Histogram1D hist; Mat histImg; histImg = hist.getHistogramImage(image); imshow("Image", image); imshow("Histogram", histImg);
直方图均衡化 Histogram Equalization
假如图像的灰度分布不均匀,其灰度分布集中在较窄的范围内,使图像的细节不够清晰,对比度较低。通常采用直方图均衡化及直方图规定化两种变换,使图像的灰度范围拉开或使灰度均匀分布,从而增大反差,使图像细节清晰,以达到增强的目的。
直方图均衡化,对图像进行非线性拉伸,重新分配图像的灰度值,使一定范围内图像的灰度值大致相等。这样,原来直方图中间的峰值部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较为平坦的直方图。
均衡化算法
直方图的均衡化实际也是一种灰度的变换过程,将当前的灰度分布通过一个变换函数,变换为范围更宽、灰度分布更均匀的图像。也就是将原图像的直方图修改为在整个灰度区间内大致均匀分布,因此扩大了图像的动态范围,增强图像的对比度。通常均衡化选择的变换函数是灰度的累积概率,直方图均衡化算法的步骤:
- 计算原图像的灰度直方图
,其中n为像素总数,Nk为灰度级Sk的像素个数
- 计算原始图像的累积直方图
其中Dj为目的图像的像素,
是源图像灰度为i的累积分布,L是图像中最大灰度级(灰度图为255)
其代码实现如下:
- 在上面中封装了求灰度直方图的类,这里直接应用该方法得到图像的灰度直方图;
- 将灰度直方图进行归一化,计算灰度的累积概率;
- 创建灰度变化的查找表
- 应用查找表,将原图像变换为灰度均衡的图像
具体代码如下:
void equalization_self(const Mat &src, Mat &dst){ Histogram1D hist1D; MatND hist = hist1D.getHistogram(src); hist /= (src.rows * src.cols); // 对得到的灰度直方图进行归一化 float cdf[256] = { 0 }; // 灰度的累积概率 Mat lut(1, 256, CV_8U); // 灰度变换的查找表 for (int i = 0; i < 256; i++) { // 计算灰度级的累积概率 if (i == 0) cdf[i] = hist.at(i); else cdf[i] = cdf[i - 1] + hist.at(i); lut.at(i) = static_cast(255 * cdf[i]); // 创建灰度的查找表 } LUT(src, lut, dst); // 应用查找表,进行灰度变化,得到均衡化后的图像}
上面代码只是加深下对均衡化算法流程的理解,实际在OpenCV中也提供了灰度均衡化的函数equalizeHist,该函数的使用很简单,只有两个参数:输入图像,输出图像。下图为,上述代码计算得到的均衡化结果和调用equalizeHist的结果对比
最左边为原图像,中间为OpenCV封装函数的结果,右边为上面代码得到的结果。
直方图规定化
从上面可以看出,直方图的均衡化自动的确定了变换函数,可以很方便的得到变换后的图像,但是在有些应用中这种自动的增强并不是最好的方法。有时候,需要图像具有某一特定的直方图形状(也就是灰度分布),而不是均匀分布的直方图,这时候可以使用直方图规定化。
直方图规定化,也叫做直方图匹配,用于将图像变换为某一特定的灰度分布,也就是其目的的灰度直方图是已知的。这其实和均衡化很类似,均衡化后的灰度直方图也是已知的,是一个均匀分布的直方图;而规定化后的直方图可以随意的指定,也就是在执行规定化操作时,首先要知道变换后的灰度直方图,这样才能确定变换函数。规定化操作能够有目的的增强某个灰度区间,相比于,均衡化操作,规定化多了一个输入,但是其变换后的结果也更灵活。
- 将原始图像的灰度直方图进行均衡化,得到一个变换函数
s = T(r)
其中s是均衡化后的像素,r是原始像素
- 对规定的直方图进行均衡化,得到一个变换函数
v = G(z)
其中v是均衡化后的像素,z是规定化的像素
- 上面都是对同一图像的均衡化,其结果应该是相等的,
详解规定化过程
对图像进行直方图规定化操作,原始图像的直方图和以及规定化后的直方图是已知的。假设
Pr(r)
表示原始图像的灰度概率密度,Pz(z)表示规定化图像的灰度概率密度,(r和z分别是原始图像的灰度级,规定化后图像的灰度级)。
- 对原始图像进行均衡化操作,则有
- 对规定化的直方图进行均衡化操作,则
- 由于是对同一图像的均衡化操作,所以有
- 规定化操作的目的就是找到原始图像的像素sk sk 到规定化后图像像素的zk之间的一个映射。有了上一步的等式后,可以得到sk=G(zk),因此要想找到sk想对应的zk只需要在z进行迭代,找到使式子G(zm)−sk的绝对值最小即可。
- 上述描述只是理论的推导过程,在实际的计算过程中,不需要做两次的均衡化操作,具体的推导过程如下:
上面公式表示,假如$s_k$ 规定化后的对应灰度是$z_m$的话,需要满足的条件是$s_k$的累积概率和$z_m$的累积概率是最接近的。 下面是一个具体计算的例子:
首先得到原直方图的各个灰度级的累积概率$V_s$以及规定化后直方图的各个灰度级的累积概率$V_z$,那么确定$s_k$到$z_m$之间映射关系的条件就是:$$mid V_s - V_z mid$$的值最小。 以$k = 2$为例,其原始直方图的累积概率是:0.65,在规定化后的直方图的累积概率中和0.65最接近(相等)的是灰度值为5的累积概率密度,则可以得到原始图像中的灰度级2,在规定化后的图像中的灰度级是5。
直方图规定化的实现
直方图规定化的实现可以分为一下三步:
- 计算原图像的累积直方图
- 计算规定直方图的累积直方图
- 计算两累积直方图的差值的绝对值
- 根据累积直方图差值建立灰度级的映射
具体代码实现如下:
void hist_specify(const Mat &src, const Mat &dst,Mat &result){ Histogram1D hist1D; MatND src_hist = hist1D.getHistogram(src); MatND dst_hist = hist1D.getHistogram(dst); float src_cdf[256] = { 0 }; float dst_cdf[256] = { 0 }; // 源图像和目标图像的大小不一样,要将得到的直方图进行归一化处理 src_hist /= (src.rows * src.cols); dst_hist /= (dst.rows * dst.cols); // 计算原始直方图和规定直方图的累积概率 for (int i = 0; i < 256; i++) { if (i == 0) { src_cdf[i] = src_hist.at(i); dst_cdf[i] = dst_hist.at(i); } else { src_cdf[i] = src_cdf[i - 1] + src_hist.at(i); dst_cdf[i] = dst_cdf[i - 1] + dst_hist.at(i); } } // 累积概率的差值 float diff_cdf[256][256]; for (int i = 0; i < 256; i++) for (int j = 0; j < 256; j++) diff_cdf[i][j] = fabs(src_cdf[i] - dst_cdf[j]); // 构建灰度级映射表 Mat lut(1, 256, CV_8U); for (int i = 0; i < 256; i++) { // 查找源灰度级为i的映射灰度 // 和i的累积概率差值最小的规定化灰度 float min = diff_cdf[i][0]; int index = 0; for (int j = 1; j < 256; j++) { if (min > diff_cdf[i][j]) { min = diff_cdf[i][j]; index = j; } } lut.at(i) = static_cast(index); } // 应用查找表,做直方图规定化 LUT(src, lut, result);}
上面函数的第二个参数的直方图就是规定化的直方图。代码比较简单,这里就不一一解释了。其结果如下:
左边是原图像,右边是规定化的图像,也就是上面函数的第一个和第二个输入参数。原图像规定化的结果如下:
原图像规定化后的直方图和规定化的图像的直方图的形状比较类似, 并且原图像规定化后整幅图像的特征和规定化的图像也比较类似,例如:原图像床上的被子,明显带有规定化图像中水的波纹特征。
直方图规定化过程中,在做灰度映射的时候,有两种常用的方法:
- 单映射 Single Mapping Law,SML,这种方法也是上面使用的方法,根据累积直方图的差值,从原图像中找到其在规定化图像中的映射。
- 组映射 Group Mapping Law,GML 这种方法较上述方法复杂不少,但是处理效果较好。
对于GML的映射方法,一直没有很好的理解,但是根据其算法描述实现了该方法,代码这里先不放出,其处理结果如下:
其结果较SML来说更为亮一些,床上的波浪特征也更为明显,但是其直方图形状,和规定化的直方图对比,第一个峰不是很明显。
总结
- 图像的灰度直方图能够很直观的展示图像中灰度级的整体分布情况,对图像的后续处理有很好的指导作用。
- 直方图的均衡化的是将一幅图像的直方图变平,使各个灰度级的趋于均匀分布,这样能够很好的增强图像对比度。直方图均衡化是一种自动化的变换,仅需要输入图像,就能够确定图像的变换函数。但是直方图的均衡化操作也有一定的确定,在均衡化的过程中对图像中的数据不加选择,这样有可能会增强图像的背景;变换后图像的灰度级减少,有可能造成某些细节的消失;会压缩图像直方图中的高峰,造成处理后图像对比度的不自然等。
- 直方图规定化,也称为直方图匹配,经过规定化处理将原图像的直方图变换为特定形状的直方图(上面中的示例,就是将图像的直方图变换为另一幅图像的直方图)。它可以按照预先设定的它可以按照预先设定的某个形状来调整图像的直方图,运用均衡化原理的基础上,通过建立原始图像和期望图像
-
matlab灰度直方图的2种绘制方法
2017-10-15 10:16:33matlab灰度直方图的绘制,掌握两种方法: 1 close all,clear all,clc; I=imread('filename.jpg'); row=size(I,1); column=size(I,2);%2→dimision N=zeros(1,256);%zeros(256)生成256x256矩阵 for i=1:row for ... -
绘制数字图像灰度直方图实验报告matlab实现.doc
2021-04-21 02:41:40绘制数字图像灰度直方图实验报告matlab实现数字图像处理实验报告实验一 绘制直方图学号姓名日期实验一 绘制直方图一、实验内容编程绘制数字图像的直方图。直方图均衡处理。二、实验步骤设计思想或者流程图。灰度直方... -
绘制数字图像灰度直方图实验报告matlab实现.pdf
2021-10-13 16:11:45绘制数字图像灰度直方图实验报告matlab实现.pdf -
灰度直方图(MATLAB)
2020-06-11 11:49:22第四章学习笔记:灰度直方图及其绘制 -
MATLAB灰度直方图
2017-11-15 12:12:50MATLAB中的灰度直方图的代码,有一般直方图,归一化直方图,彩色图像读取绘制直方图 -
matlab数字图像灰度分布直方图函数
2020-09-29 15:59:56本文主要介绍数字图像灰度直方分布图的绘制方法,包括使用matlab的imhist函数和自己编写对应的功能程序。 背景知识 数字图像在计算机中的保存形式为矩阵,矩阵中每个元素值保存着图像对应像素的信息。彩色图片为三维... -
MATLAB数字图像处理(二)——图像灰度直方图统计
2020-11-26 09:24:00文章目录绘制灰度直方图均衡化处理生成图像 绘制灰度直方图 计算并绘制原始pout图像的灰度直方图(灰度直方图就是相同灰度像素的数量或占总像素个数的比重的直方图,这里算的是比重)。 grayimage=imread('pout.tif');... -
matlab绘制图像的灰度直方图
2016-07-18 15:01:39需要注意的是,在图像处理中我们经常习惯将图像对应的矩阵元素转化为double的,这时候绘制灰度直方图显示就不正确,也不能说不正确,怎么说呢?唉,反正就应该是如下例子一样,或者说可以在转为uint8格式的。 -
绘制灰度直方图
2019-07-09 14:22:00分别绘制灰度直方图和归一化直方图 pic=imread('data/1.jpg'); gray_pic=rgb2gray(pic); figure(1); imshow(gray_pic); figure(2); imhist(gray_pic); [X,Y]=size(gray_pic); [counts,x] = im... -
Matlab实现图像灰度图,绘制直方图,直方图均衡化
2019-06-24 20:22:131.imread() MATLAB中图像读取函数与OpenCV一样是imread,可以打开指定路径图片,其路径表示方式与OpenCV中有些许不同如: srcImage=imread('E:\MatlabWorkSpace\实验一\实验一图一....2.将打开的图像转换为灰度图r... -
MATLAB中的灰度直方图
2017-10-25 16:21:43灰度直方图 -
绘制数字图像灰度直方图实验报告matlab实现.docx
2020-04-02 09:48:14数字图像处理 实验报告 实验一 绘制直方图 学号 姓名 日期 实验一 绘制直方图 一实验内容 编程绘制数字图像的直方图 直方图均衡处理 二实验步骤 1 设计思想或者流程图 灰度直方图是将数字图像的所有像素按照灰度值的... -
matlab绘制直方图
2021-04-18 05:22:03具有两个纵坐标标度的图形 在 MATLAB 中,如果需要绘制出具有不同纵坐标标度的......MATLAB图形绘制 4.3 常用图形绘制(二)绘制直方图与其正态分布曲线 n=hist(Y) n=hist(Y,nbins) 例4-5:练习并理解教材P.146 例5-2-3 ... -
数字图像处理(15): 灰度直方图(matplotlib 和OpenCV 绘制直方图)
2019-05-04 09:29:221 灰度直方图简介 1.1 灰度直方图概念 1.2 灰度直方图作用 1.3 绘制的直方图 1.4 归一化直方图 2 matplotlib库 绘制直方图-hist() 3 OpenCV库 绘制直方图-calcHist() 参考资料 1 灰度直方图简介 1.1 灰度... -
matlab灰度图直方图均衡化代码
2021-04-29 05:51:17matlab灰度图直方图均衡化代码clear all%一,图像的预处理,读入彩色图像将其灰度化PS=imread('1.jpg'); %读入JPG彩色图像文件imshow(PS) %显示出来title('输入的彩色JPG图像')imwrite(rgb2gray(PS),'PicSampleGray.... -
基于Matlab的遥感影像直方图匹配
2015-11-15 12:13:30基于Matlab的遥感影像直方图匹配,将原图像的每个像素灰度转换为直方图均衡化。 -
huiduzhifangtu.rar_cover81i_if5qw_ifangtu .com_matlab 灰度直方图_图
2022-07-14 19:01:45在matlab中处理图像并绘制图像的灰度直方图 -
Matlab学习6-图像处理之直方图处理、灰度变换
2022-04-17 22:43:031、直方图均衡化 代码 %直方图均衡化 img=imread("img\rice.png"); %显示 subplot(2,2,1),imshow(img),xlabel("原图"); subplot(2,2,2),imhist(img),...subplot(2,2,4),imhist(J),xlabel("均衡化后的图像灰度直方图 -
matlab中的灰度直方图及imhist函数
2018-05-07 15:21:31灰度直方图 灰度直方图描述了一幅图像的绘图统计信息,主要应用于图像分割和图像灰度变换等处理过程中。从数学上说它是一个关于灰度的函数,如令x表示灰度值(一般0≤x≤255),则f(x)表示当x为特定灰度时,一幅图像... -
python如何显示图像的灰度直方图-女性时尚流行美容健康娱乐mv-ida网
2020-11-22 12:57:05女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 python opencv处理 图像 之 图像 直方图... -
【数字图像处理】灰度图像直方图的绘制与图像直方图均衡化增强图像对比度的matlab程序
2022-01-19 17:17:16显示图像的直方图、直方图均衡化用于增强图像的对比度,并显示直方图均衡化前后的图像与图像的直方图的matlab程序 -
数字图像处理Matlab-灰度直方图及直方图均衡化(附代码)
2020-03-26 16:32:09目录1.Objectives:2.Experiment Content:3.Experiment Principle:4.Experiment Steps Result and ...1、 熟悉灰度直方图的概念及计算方法; 2、 熟悉直方图均衡化的计算过程; 3、 计算并绘制图像直方图,实现... -
Matlab图像灰度直方图及边缘提取
2021-01-27 22:04:01灰度直方图 G=imread ('cameraman.tif');%读取图像 figure(1), imhist(G); %灰度直方图 M = size(G,1); %获得矩阵的维度,行数 N = size(G,2); %获得矩阵的维度,列数 G=double(G); %变换图像存储格式 for i=1:M ...