【2020最新智库】直方图均衡化计算公式
图像直方图均衡化
目录摘要 (I)1 引言 (1)2 直方图均衡化原理及过程 (3)2.1 直方图均衡化原理 (3)2.2 直方图的均衡化 (4)2.3 直方图均衡化的算法步骤 (5)3 程序设计 (6)3.1利用库函数的设计 (6)3.2不用库函数的设计 (6)4 实验结果及分析 (9)5 心得体会 (12)参考文献 (13)摘要直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地砸直方图上分布。
这样就额可以拥有增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
本文分析和总结了灰度直方图的均衡化算法并通过MATLAB实验验证了该方法能有效达到图像图像增强的目的。
关键词:直方图;均衡化;图像增强1 引言在现实之中,往往所采集的图像,由于光照、噪声等种种原因,图像的质量往往不能令人满意。
例如,曝光过度;图像太暗;图像的失真、变形等等。
所以图像往往需要采取一些手段进行改善以求达到较好的效果.图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。
直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。
直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
缺点:1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
图像增强——直方图均衡化
图像增强——————直方图均衡化摘要图像增强是指按特定的需要突出一幅图像的某些信息,削弱或消除不需要信息的处理方法。
处理的结果使图像更适合于人的视觉特性或机器的识别系统。
本文主要采用直方图均衡化、中值滤波的方法对图像进行处理,通过对处理结果进行比较,从而加深对图像增强的理解及应用。
一、图像增强在获取图像的过程中,由于多种因素的影响导致图像无法达到令人满意的视觉效果。
对原始图像做一些改善,从而实现人眼观察或者机器自动分析、识别的目的的行为,就叫做图像增强。
图像增强的主要内容⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎧⎪⎪⎪⎩⎪⎪⎪⎨⎧⎪⎪⎩⎪⎪⎨⎧⎪⎩⎪⎨⎧⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧⎩⎨⎧⎪⎪⎩⎪⎪⎨⎧⎩⎨⎧代数运算彩色变换增强彩色平衡假彩色增强常规处理彩色图像增强伪彩色增强彩色增强同态滤波增强低通滤波高通滤波频率域图像锐化图像平滑局部运算局部统计法规定化均衡化直方图修正法灰度变换点运算空间域图像增强二、直方图均衡化1.直方图均衡化是通过累积函数对灰度值进行调整以实现对比度的增强,具体地说就是把给定图像的直方图分布改变成近似均匀分布的直方图。
2.直方图均衡化的过程如下:①计算原图像的灰度直方图;②计算原图像的灰度累积分布函数,进一步求出灰度转换表; ③根据灰度转换表,将原图像各灰度级映射为新的灰度级。
3.直方图均衡化的优点:扩张了像素值的动态范围。
直方图均衡化后,图像的概率密度函数近似服从均匀分布,灰度几乎是均匀的分布在整个范围内,图像明暗分明,对比度很大,图像比较清晰明亮,很好的改善了原始图的视觉效果。
2.1原理及计算过程先讨论连续图像的均衡化问题。
设变量r 和s 代表原图像灰度和经直方图修正后的的图像灰度。
在图像中,像素的灰度级可作归一化处理,这样r,s 的值将限定在下述范围之内:0≤r,s ≤1,r=0代表黑,r=1代表白,可以对[0,1]区间内的任一个值进行如下变换:s=T(r)变换函数T 应满足下列条件:(1)在0≤r ≤1区间内T[r]单值单调增加; (2)对于0≤r ≤1,有0≤s ≤1。
直方图均衡化
直方图均衡化
直方图的均衡实验结果
每个输出结果中从左到右依次是原图,原图的直方图,均衡后的相应图像,均衡后图像的直方图
源代码
此源代码运行一次可输出原图,原图的直方图以及均衡后的相应图像和其直方图。
通过修改文件名’3.16.tif’导入其他原图像。
I=imread('3.16.tif');
[X,Y]=size(I);
k=1:256;
H=zeros(256,1);
S=zeros(256,1);
sum=0;
h1=subplot(1,4,1); %显示I图
imshow(I);
h2=subplot(1,4,2); %显示I的直方图
imhist(I);
%计算不同灰度级出现的频数
for i=1:X
for j=1:Y
H(I(i,j)+1)=H(I(i,j)+1)+1;
end
end
%求出映射的值域
for k=1:256
sum=0;
for j=1:k
sum=sum+H(j);
end
S(k)=sum/(X*Y);
end
%将原图中不同的灰度级映射成新的灰度级
for i=1:X
for j=1:Y
I(i,j)=S(I(i,j)+1)*255;
end
end
h3=subplot(1,4,3); %显示均衡化之后的I图
imshow(I);
h4=subplot(1,4,4); %显示I的直方图
imhist(I);
imwrite(I,'3.16_2.tif'); %将均衡化之后的I图写入3.16_2.tif文件中。
图像处理中直方图均衡化的使用教程
图像处理中直方图均衡化的使用教程图像处理中的直方图均衡化是一种常用的增强图像对比度的方法。
通过对图像的像素值进行重新分布,直方图均衡化可以使图像中的明暗区域更具有对比度,从而提高图像的质量和清晰度。
本文将介绍直方图均衡化的原理、应用场景以及具体的步骤。
1. 直方图均衡化的原理直方图均衡化的原理基于对图像的灰度级进行重新分布。
它通过将原始图像的像素值映射到新的像素值上,使得直方图在整个灰度范围内得到均匀分布。
这样就能够增强图像中的低对比度区域,提高图像的视觉效果。
2. 直方图均衡化的应用场景直方图均衡化在图像处理领域有着广泛的应用。
下面列举了一些常见的应用场景:- 增强图像的对比度:直方图均衡化可以使得图像中的亮度值更加均匀分布,提高图像的对比度,使得图像变得更加清晰。
- 增强图像的细节:直方图均衡化通过增强图像中的低对比度区域,可以使得细节更加显著,提高图像的可视化效果。
- 降低图像的噪声:直方图均衡化可以将图像中的噪声分布均匀化,从而减少噪声对图像质量的影响。
3. 直方图均衡化的步骤下面是使用直方图均衡化对图像进行处理的具体步骤:步骤 1: 将彩色图像转换为灰度图像如果原始图像是彩色图像,我们需要将其转换为灰度图像。
这是因为直方图均衡化是针对灰度级进行处理的。
步骤 2: 计算原始图像的像素值分布使用图像处理工具,计算原始图像中每个像素值的出现频率。
这样可以得到一个直方图,该直方图显示了原始图像中像素值的分布情况。
步骤 3: 计算累积分布函数通过对原始图像的直方图进行累积求和,得到一个累积分布函数。
该函数显示了每个像素值的累积出现频率。
步骤 4: 计算新的像素值根据累积分布函数,计算每个像素值的新的映射像素值。
这个计算公式可以根据具体的图像处理工具而有所不同。
步骤 5: 创建均衡化后的图像使用新的像素值替换原始图像中的像素值,将得到的图像称为均衡化后的图像。
4. 注意事项在使用直方图均衡化时,需要考虑以下几个注意事项:- 直方图均衡化可能会改变图像的整体亮度。
直方图均衡化教案
直方图均衡化教案1. 直方图是多种空间域处理技术的基础。
直方图操作能有效地用于图像增强。
灰度直方图灰度直方图是灰度值的函数,它描述了图像中各灰度值的像素个数。
通常用横坐标表示像素的灰度级别,纵坐标表示对应的灰度级出现的频率(像素的个数)。
频率的计算公式为:p(r)=nr. nr是图像中灰度为r的像素数。
常用的直方图是规格化和离散化的,即纵坐标用相对值表示。
设图像总像素为N,某一级灰度像素数为nr,则直方图表示为:p(r)=nr/N. 灰度直方图反映了一幅图像的灰度分布情况。
2.直方图均衡化通过把原图像的直方图通过变换函数修正为分布比较均匀的直方图,从而改变图像整体偏暗或整体偏亮,灰度层次不丰富的情况,这种技术叫直方图均衡化。
直方图均衡化过程解析:设r和s分别表示原图像灰度级和经直方图均衡化后的图像灰度级。
为便于讨论,对r和s进行归一化,使:0≤r,s≤1.对于一幅给定的图像,归一化后灰度级分布在0≤r≤l范围内。
对[0,1]区间内的任一个r值进行如下变换:s=T(r). 变换函数s=T(r)应满足下列条件:(1)在0≤r≤1的区间内,T(r)单值单调增加。
保证图像的灰度级从白到黑的次序不变。
(2)对于0≤r≤1,有0≤T(r)≤1。
保证映射变换后的像素灰度值在允许的范围内。
3.直方图均衡化的计算步骤及实例假设64×64的灰度图像,共8个灰度级,其灰度级分布见下表,现要求对其进行均衡化处理。
000011101()()()0.19()()()()0.190.250.44rjrj rjrrj s T r P r P r s T r P r P r P r =========+=+=∑∑ 依此类推可计算得:s2=0.65;s3=0.81;s4=0.89;s5=0.95;s6=0.98;s7=1对k s 进行舍入处理,由于原图像的灰度级只有8级,因此上述各需用1/7为量化单位进行舍入运算,得到如下结果:k s 的最终确定,由k s 的舍入结果可见,均衡化后的灰度级仅有5个级别,分别是:s0=1/7,s1=3/7,s2=5/7,s3=6/7,s4=1/7。
直方图均衡化计算公式
直方图均衡化(色调均化)“图像(Image)>调整(Adjust)”菜单的功能色调均化(Equalize)Photoshop菜单:图像>调整>色调均化公式:(公式中Sk表示均衡化后的灰度值,∑表示总和,nj是原图中某个灰度色阶j 的像素数量,j的范围是0~k,N是图像像素总数。
)“色调均化”命令重新分布图像中像素的亮度值,以便它们更均匀地呈现所有范围的亮度级。
使用此命令时,Photoshop尝试对图像进行直方图均衡化(Histogram Equalization),即在整个灰度范围中均匀分布每个色阶的灰度值。
当扫描的图像显得比原稿暗,而您想平衡这些值以产生较亮的图像时,可以使用“色调均化”命令。
配合使用“色调均化”命令和“直方图”命令,可以看到亮度的前后比较。
使用“色调均化”命令:1. 选择菜单图像>调整>色调均化。
2. 如果已选择一个图像区域,在弹出的对话框中选择要均化的内容,然后点按“好”。
•“仅色调均化所选区域”只均匀地分布选区的像素。
•“基于所选区域色调均化整个图像”基于选区中的像素均匀分布所有图像的像素。
原理直方图均衡化是一种灰度变换算法,所以我们重点研究灰度图像的直方图均衡化。
绝对的均匀图A是一个黑白灰均匀渐变,0~255的每一个色阶的灰度数量都是相同的。
图B 的是图A的像素打乱了顺序随机分布的,每种灰度的数量都与图A的相同,因而它的直方图也与图A的相同。
图A和图B的直方图。
每种灰度数量是相同的,直方图呈一个黑色矩形。
近似的均匀对于一般的图像,由于每种灰度的像素数量并不相同,我们没办法把每种灰度的分量调得像图A、B那么均匀,但是可以做到近似的均匀。
也就是说,把直方图横向平均分成几份之后,使每一份的像素数量大致相等。
下面是一幅图片的直方图,共有19200个像素,从左到右平均分成三份。
均衡化之后,每份的像素数量都在6400左右。
手工调整方法我们拍摄或扫描的照片往往会由于光线太强或太弱,使图像对比度减弱,细节分辨不清。
直方图的均衡化
cdf(i)=cdf(i-1)+tmhist(i);
End
bar(t,cdf);
%step3:run point operation
for i=1:m
for j=1:n
k=plane(i,j);
plane_equ(i,j)=cdf(k)*256/(m*n);
end
end
1
3
5
6 确定映射对应关系(Sk-->Tk) 0-》1 1-》3 2-》5
7 统计新直方图各灰度级象素数Nk
790
8 用式计算新直方图(图3)
0.19
步骤和结果
3
4
656 329
0.16 0.08
0.81 0.89
6
6
3,4-》6
1023
0.25
5
6
7
245 122 81
0.06 0.03 0.02
从概率的观点来理解,灰度出现的频率可看作 其出现的概率,这样直方图就对应于概率密度 函数pdf,而概率分布函数就是直方图的累积 和,即概率密度函数的积分,如下图所示:
r
dP(r)
P(r) p(r)dr
0
,
p(r)
dr
若直接从代表每种灰度的 象素数目的直方图来观察, 常用如下的表示:
二、直方图的均衡化
直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较 集中的某个灰度区间变成在全部灰度范围内的均匀分布。
对图像空间域点的增强过程是通过增强函数t=EH(s)来完成的, t、s分别为目标图像和原始图像上的像素点(x,y)处的灰度值。
在进行均衡化处理时,增强函数EH需要满足两个条件: 1)、增强函数EH(s)在0≤s≤L-1的范围内是一个单调递增函数,
clahe公式
clahe公式
CLAHE,全称为Contrast Limited Adaptive Histogram Equalization,即对比度受限的自适应直方图均衡化。
它是直方图均衡化(HE)的改进算法,能够更好地保留图像的全局对比度和局部细节信息。
CLAHE的计算公式为:
对于一张灰度图像I(x,y),它的CLAHE处理结果为I'(x,y),则有:
1. 首先将图像分成若干个大小相等的小块,每个小块的大小为NxN。
2. 对每个小块进行直方图均衡化,得到均衡化后的像素值。
3. 然后对均衡化后的像素值进行限制,避免像素值过于集中或过于分散。
具体来说,就是在直方图均衡化后的像素值中,将高于某一阈值的像素值进行平均分配到周围的小块中,以达到对比度受限的效果。
4. 最后将处理后的小块重新拼接成一张图像即为CLAHE处理后的结果。
总之,CLAHE算法是一种非常有效的图像增强方法,适用于各种不同的图像处理场景。
- 1 -。
直方均衡化算法
直方均衡化算法直方均衡化(Histogram Equalization)是一种常用的图像增强方法,用于改善图像的对比度和亮度分布。
该算法通过对图像的灰度直方图进行变换,使得图像的灰度级均匀分布在整个灰度范围内。
直方均衡化算法的步骤如下:1.计算直方图:对输入的灰度图像计算其灰度直方图,即统计每个灰度级的像素数量。
2.计算累积分布函数(CDF):将直方图归一化后,计算累积分布函数,即计算每个灰度级的累积概率值。
CDF可以通过累积前一灰度级的概率值与当前灰度级的概率值之和来计算。
3.灰度级映射:将CDF值映射到指定的灰度范围内。
通常将CDF值乘以最大灰度级数目,然后取整,得到对应的新灰度级。
4.重建图像:使用映射后的灰度级替代原始图像中对应的灰度值,重建均衡化后的图像。
直方均衡化的优点是简单易懂,能够增强图像的对比度和细节。
然而,该方法可能会增加图像噪声的影响,并且对于图像中过于亮或过于暗的区域效果不佳。
需要注意的是,对于彩色图像,可以将直方均衡化应用到每个颜色通道上,并将处理后的通道重新组合以得到整个彩色图像的均衡化效果。
以下是一个基于JavaScript的简单直方均衡化算法的代码示例:// 灰度图像的直方均衡化算法function histogramEqualization(imageData) {const hist = computeHistogram(imageData);const cdf = computeCDF(hist, imageData.width * imageData.height);const histEQ = equalizeHistogram(hist, cdf);// 重建图像const newImageData = new ImageData(imageData.width, imageData.height);for (let i = 0; i < imageData.data.length; i += 4) {const grayValue = imageData.data。
直方图均衡化(histogramequalization)
直⽅图均衡化(histogramequalization)⼀. 原理直⽅图均衡化是想要将聚集在某⼀区间内分布的灰度值,变为均匀的在所有区间内分布。
为了达到这⼀⽬的,我们需要找出⼀个函数T,将r(原图像灰度)映射到s(新图像灰度)上。
同时,由于不想将图像反转,我们需要保证函数单调不减(若需要逆运算,则要严格单调递增)s=T(r)设p r(r)为r的概率分布函数,p s(s)为s的概率分布函数,则两者关系如下p s(s)=p r(r)|dr ds|也就是说,T(r)这个函数现在要满⾜条件:单调递增值域范围为[0,L-1]p s(s)为⼀个常函数(表⽰每⼀个灰度值的概率都相等)现在给出⼀个函数(⾄于为什么是这个函数,我也不知道啊,哪位看官可以帮忙推导⼀下QAQ):s=T(r)=(L−1)∫r0p r(w)dw我们将逐步证明,以上三点成⽴由于此函数为积分所得,因此函数单调递增由于p r(r)为概率密度函数,因此,积分区间为[0,1],乘以常数,区间为[0,L-1]推导过程:ds=dT(r)=d((L−1)∫r0p r(w)dw)=(L−1)p r(r)drp s(s)=p r(r)|drds|=pr(r)|1(L−1)p r(r)|=1L−1此时p s(s)为⼀个均匀密度函数,符合对于离散值,计数每个不⼤于r的概率和,就是这个r对应的ss k=T(r k)=(L−1)k∑j=0p r(r j)⼆. 代码img = imread("14.jpeg");r = img(:,:,1);g = img(:,:,2);b = img(:,:,3);p = stat(r);map = cal(p);img_equa = my_hist_equation(r,map); % 画图%原图subplot(331)imshow(r);title('原图');subplot(332)imhist(r);title('原图直⽅图');%⾃⼰的直⽅图均衡化图subplot(334)imshow(img_equa);title('my直⽅图均衡化图');subplot(335)imhist(img_equa);title('my直⽅图均衡化直⽅图'); subplot(336)plot((0:255)/255,map/255);title('my函数');%标准的直⽅图均衡化图[std_img,T] = histeq(r);subplot(337)imshow(std_img);title('标准直⽅图均衡化图');subplot(338)imhist(std_img);title('标准直⽅图均衡化图直⽅图'); subplot(339)plot((0:255)/255,T);Processing math: 100%title('std函数');figureplot((0:255)/255,map/255);figureplot((0:255)/255,T);%计算图像的分布function p=stat(img)[r,c] = size(img);p = linspace(0,0,256);for i=1:1:rfor j=1:1:cp(img(i,j)+1)= p(img(i,j)+1)+1;endendp = p/(r*c);end%计算r与s的对应关系,矩阵坐标为r,值为s(动态规划) function s=cal(probality)s=probality;l = length(probality);for i=2:ls(i) = s(i-1)+s(i);ends = round(s*255);end%将图⽚根据映射函数,映射function img_equa=my_hist_equation(img,map)[r,c] = size(img);img_equa = zeros(r,c);for i=1:rfor j=1:cimg_equa(i,j) = map(img(i,j)+1);endendimg_equa = uint8(img_equa);end放⼤我的映射函数图⽚为:matlab⾃建的映射函数为:对⽐两个映射函数可以看出来,⾃⼰实现的为⽐较连续的,⽽matlab⾃建的为阶段性的。
直方图均衡化
图像的灰度直方图是一个1-D的离散函数
h h ((ff)) n nf f ff 0, 0, 1, 1, ,, L L 1 1
灰度累积直方图也是一个1-D的离散函数
c( f ) n i
i 0 f
f 0, 1,
, L 1
直方图均衡化
直方图均衡化主要用于增强动态范围偏小的图像 的反差。
直方图均衡化
原始图像各灰度级对应的概率分布
例
灰度级
0
1
2
3
4
5
6
7
像素
概率
790
1023 850
656
329
245
122
0.03
81
0.02
0.19 0.25
0.21 0.16
0.08 0.06
18
直方图均衡化
图像直方图均衡化过程如下:
(1)得到变换后的值:
例解:
t 0 T ( s0 ) t1 T (s1 )
我们注意到在暗色的图像中,直 方图的组成成分集中在灰度级低 (暗)的一侧;反之,明亮的图 像的直方图的组成成分则集中在 灰度级高(亮)的一侧;动态范 围小,也就是对比度小,这种图 像直方图集中于灰度级的中部; 动态范围正常的图像直方图的成 分覆盖了灰度级很宽的范围。 直观上,若一图像像素占有全部 可能的灰度级并且分布均匀,则 图像有高的对比度和多变的灰度 色调,即,可通过改变直方图的 形状来达到增强图像对比度。
nk Pr ( rk ) 0 rk 1 n k 0, 1, 2 , , l 1
式中,nk为图像中出现rk 这种灰度的像素数,n 是 图像中像素总数,而 n k 就是概率论中所说的频数。 n 在直角坐标系中作出 rk 与Pr(rk) 的关系图形,这个图 形称为直方图。
直方图处理(均衡化与匹配)解析
0 r
上式表明,当变换函数为r的累积直方图函数 时,能达到直方图均衡化的目的。
对于离散的数字图像,用频率来代替概率 , 则 变换函数T(rk)的离散形式可表示为:
sk T (rk ) pr (rj )
j 0 j 0 k k
nj n
上式表明,均衡后各像素的灰度值 sk 可直接由 原图像的直方图算出。
一幅图像的sk与rk之间的关系称为该图像的累积灰 度直方图。
Pr(rk) 1.0 S(rk)
rk 1.0 1.0
rk
直方图均衡化的计算 直方图均衡化过程(算法):
(1) 列出原始图灰度级rk;
0 1 1 2
0 1 1 2
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
3
3 3 5 7 7
k rk , k 0,1, , L 1 L 1 求得:rk=0,1/7,2/7, …, 6/7
3.3 直方图处理
一、灰度直方图 直方像图反映了图的像素的灰度分布是反映一幅图像 中的灰度级与出现这种灰度级的像素的概率之间关系 的图形。 直方图的横坐标为灰度级(用r表示),纵坐标是具 有该灰度级的像素个数或出现此灰度级的概率P(rk)。 设N(=a×b)为一幅图像中像素总数,nk为第k级灰 度的像素数;r k表示第k个灰度级。则: P(rk)= nk /N (归一化后k级灰度像素数) 定义:反映各灰度级出现频数的分布情况,进而反映 图像对(清晰)度,但不反映各灰度级的空间位置分 布。
数字图像处理课程设计报告---直方图均衡化
设计题目:直方图均衡化1、直方图的理论基础:(1)直方图概念:灰度直方图表示图像中每种灰度出现的频率。
(2)直方图的作用: 反映一幅图像的灰度分布特性(3)直方图的计算: 式中:n k 为图像中出现r k 级灰度的像素数,n 是图像像素总数,而n k /n 即为频数。
2、设计目的: 产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。
3、直方图均衡化的效果 :1)变换后直方图趋向平坦,灰级减少,灰度合并。
2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。
同时,也增加了图象的可视粒度。
4、离散情况下的直方图均衡化的算法:A 、列出原始图像的灰度级B 、统计各灰度级的像素数目C 、计算原始图像直方图各灰度级的频数D 、计算累积分布函数F 、应用以下公式计算映射后的输出图像的灰度级,P 为输出图像灰度级的个数,其中INT 为取整符号:G 、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。
3、源程序代码// cqxhistView.cpp : implementation of the CCqxhistView class#include "stdafx.h"#include "cqxhist.h"#include "cqxhistDoc.h"#include "cqxhistView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CCqxhistView1,,1,0,-=L j f j 1,,1,0,-=L j n j 1,,1,0,/)(-==L j n n f P j j f 1,,,1,0,)()(0-==∑=L k j f P f C k j j f ]5.0)()[(min min max ++-=g f C g g INT g i nn r p k k =)(1,,2,1,010-=≤≤l k r kIMPLEMENT_DYNCREATE(CCqxhistView, CView)BEGIN_MESSAGE_MAP(CCqxhistView, CView)//{{AFX_MSG_MAP(CCqxhistView)ON_COMMAND(ID_OPEN_IMAGE, OnOpenImage)ON_COMMAND(ID_HIST_IMAGE, OnHistImage)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CCqxhistView construction/destructionCCqxhistView::CCqxhistView(){// TODO: add construction code here}CCqxhistView::~CCqxhistView(){}BOOL CCqxhistView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////// // CCqxhistView drawingvoid CCqxhistView::OnDraw(CDC* pDC){CCqxhistDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereif(m_dib.m_bLoaded==true) //判断是否加载图像{//获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();// 显示图像(具体的参数见CDIB类的该函数说明)m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI); }if(m_bHist==true){//绘制原图像的直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 画坐标轴// 绘制坐标轴pDC->MoveTo(410,nh+20); //(410,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(410,nh+200);//(410,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(710,nh+200);//(710,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(410, nh+200+10, str);str.Format("50");pDC->TextOut(460, nh+200+10, str);str.Format("100");pDC->TextOut(510, nh+200+10, str);str.Format("150");pDC->TextOut(560, nh+200+10, str);str.Format("200");pDC->TextOut(610, nh+200+10, str);str.Format("255");pDC->TextOut(665, nh+200+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(705,nh+200-5);pDC->LineTo(710,nh+200);pDC->LineTo(705,nh+200+5);// 绘制y轴箭头pDC->MoveTo(410,nh+20);pDC->LineTo(405,nh+20+5);pDC->MoveTo(410,nh+20);pDC->LineTo(415,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_yuan[i]>max)max=m_yuan[i];for(i=0;i<256;i++){pDC->MoveTo(410+i,nh+200);pDC->LineTo(410+i,nh+200-(m_yuan[i]*160/max));}}if(m_bHist==true){//绘画直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 画坐标轴// 绘制坐标轴pDC->MoveTo(10,nh+20); //(10,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(10,nh+200);//(10,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(310,nh+200);//(310,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(10, nh+200+10, str);str.Format("50");pDC->TextOut(60, nh+200+10, str);str.Format("100");pDC->TextOut(110, nh+200+10, str);str.Format("150");pDC->TextOut(160, nh+200+10, str);str.Format("200");pDC->TextOut(210, nh+200+10, str);str.Format("255");pDC->TextOut(265, nh+200+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(305,nh+200-5);pDC->LineTo(310,nh+200);pDC->LineTo(305,nh+200+5);// 绘制y轴箭头pDC->MoveTo(10,nh+20);pDC->LineTo(5,nh+20+5);pDC->MoveTo(10,nh+20);pDC->LineTo(15,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_hist[i]>max)max=m_hist[i];for(i=0;i<256;i++){pDC->MoveTo(10+i,nh+200);pDC->LineTo(10+i,nh+200-(m_hist[i]*160/max));}}}///////////////////////////////////////////////////////////////////////////// // CCqxhistView printingBOOL CCqxhistView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CCqxhistView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CCqxhistView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}///////////////////////////////////////////////////////////////////////////// // CCqxhistView diagnostics#ifdef _DEBUGvoid CCqxhistView::AssertValid() const{CView::AssertValid();}void CCqxhistView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CCqxhistDoc* CCqxhistView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCqxhistDoc)));return (CCqxhistDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CCqxhistView message handlersvoid CCqxhistView::OnOpenImage(){// TODO: Add your command handler code here// TODO: Add your command handler code herestatic char szFilter[]="BMP文件(*.bmp)|*.bmp||"; //定义过滤文件的类型 CFileDialog dlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);//定义文件对话框对象 CString filename;int ret=dlg.DoModal(); //运行打开文件对方框if(ret==IDOK){filename=dlg.GetFileName(); //获取所选择图像的路径 m_dib.LoadFromFile(filename); //加载图像if(!m_dib.m_bLoaded) //判断是否加载图像成功{AfxMessageBox("图像打不开");return;}for(int i=0;i<256;i++) //初始化直方图数组{ m_hist[i]=0;m_yuan[i]=0;}m_bHist=false;}{int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();for(int j=0;j<nh;j++)for(int i=0;i<nw;i++){BYTE temp=m_dib.m_pdata[j*nw+i];m_yuan[temp]++;}}Invalidate(1); //刷新屏幕}void CCqxhistView::OnHistImage(){// TODO: Add your command handler code here//功能:实现直方图均衡化////////////////////////////判断图像是否打开,没打开,则弹出提示框并退出函数if(!m_dib.m_bLoaded){AfxMessageBox("图像还打开,请先打开图像!");return;}//获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j,k;int count[256]={0};//定义一个数组,用于存放灰度级个数 float p[256];//定义一个数组,用于存放灰度级出现频率//对图像进行直方图均衡化处理for(i=0;i<nh;i++)for(j=0;j<nw;j++){k=m_dib.m_pdata[i*nw+j];//计算灰度级个数count[k]++;}for(k=0;k<256;k++)p[k]=count[k]/(nw*nh*1.0f);float c[256]={0};float sum=0.0;int ngray[256];//新的灰度级for(k=0;k<256;k++)//计算累积频率{sum+=p[k];c[k]=sum;ngray[k]=(int)(255.0*c[k]+0.5);}for(i=0;i<nh;i++)for(j=0;j<nw;j++){k=m_dib.m_pdata[i*nw+j];m_dib.m_pdata[i*nw+j]=ngray[k];}{int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();for(int j=0;j<nh;j++)for(int i=0;i<nw;i++){BYTE temp=m_dib.m_pdata[j*nw+i];m_hist[temp]++;}}//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果m_dib.UpdateData();m_bHist=true;//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果 m_dib.UpdateData();//刷新屏幕Invalidate();}4、实验结果C++编程结果:。
数字图像处理之直方图均衡化
数字图像处理之直⽅图均衡化直⽅图均衡化是图像处理领域中利⽤图像直⽅图对对⽐度进⾏调整的⽅法。
直⽅图均衡化要达到的效果:基本思想:把原始图的直⽅图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围,从⽽达到增强图像整体对⽐度的效果使⽤的⽅法是灰度级变换:s = T(r)原理:s=T(r) 0≤r≤1T(r)满⾜下列两个条件:(1)T(r)在区间0≤r≤1中为单值且单调递增(2)当0≤r≤1时,0≤T(r) ≤1条件(1)保证原图各灰度级在变换后仍保持从⿊到⽩(或从⽩到⿊)的排列次序条件(2)保证变换前后灰度值动态范围的⼀致性Pr(r)是r的概率密度函数,Ps(s)是s的概率密度函数,Pr(r)和T(r)已知,且T-1(s) 满⾜上述条件(1),所以有已知⼀种重要的变换函数:关于上限的定积分的导数就是该上限的积分值(莱布尼茨准则)对于离散值:其中r k 是第k个灰度级,k = 0,1,2,…,L-1. n k是图像中灰度级为r k的像素个数. n是图像中像素的总数.已知变换函数的离散形式为:sk称作直⽅图均衡化将输⼊图像中灰度级为rk(横坐标)的像素映射到输出图像中灰度级为sk (横坐标)的对应像素得到.实现代码:/******************************************************************************* 作⽤: 灰度均衡函数* 参数:* pixel 原始像素数组* tempPixel 保存变换后图像的像素数组* width 原始图像宽度******************************************************************************/void GrayEqualize(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height){// 灰度映射表BYTE map[256];long lCounts[256];memset(lCounts, 0, sizeof(long) * 256);// 计算各灰度值个数for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];lCounts[x]++;}// 保存运算中的临时值long lTemp;for (int i = 0; i < 256; i++){lTemp = 0;for (int j = 0; j <= i; j++)lTemp += lCounts[j];map[i] = (BYTE)(lTemp * 255.0f / width / height);}// 变换后的值直接在映射表中查找for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];tempPixel[i*4] = tempPixel[i*4+1] = tempPixel[i*4+2] = pixel[i * 4]; tempPixel[i*4+3] = 255;}}View Code彩⾊图直⽅图均衡化:更清晰:opencv代码:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace cv;using namespace std;int main( int argc, const char** argv ){Mat img = imread("MyPic.JPG", CV_LOAD_IMAGE_COLOR); //open and read the imageif (img.empty()) //if unsuccessful, exit the program{cout << "Image cannot be loaded..!!" << endl;return -1;}vector<Mat> channels;Mat img_hist_equalized;cvtColor(img, img_hist_equalized, CV_BGR2YCrCb); //change the color image from BGR to YCrCb formatsplit(img_hist_equalized,channels); //split the image into channelsequalizeHist(channels[0], channels[0]); //equalize histogram on the 1st channel (Y)merge(channels,img_hist_equalized); //merge 3 channels including the modified 1st channel into one imagecvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR); //change the color image from YCrCb to BGR format (to display image properly)//create windowsnamedWindow("Original Image", CV_WINDOW_AUTOSIZE);namedWindow("Histogram Equalized", CV_WINDOW_AUTOSIZE);//show the imageimshow("Original Image", img);imshow("Histogram Equalized", img_hist_equalized);waitKey(0); //wait for key pressdestroyAllWindows(); //destroy all open windowsreturn0;}View Code代码中使⽤的函数:New OpenCV functionscvtColor(img, img_hist_equalized, CV_BGR2YCrCb)This line converts the color space of BGR in 'img' to YCrCb color space and stores the resulting image in 'img_hist_equalized'.In the above example, I am going to equalize the histogram of color images. In this scenario, I have to equalize the histogram of the intensity component only, not the color components. So, BGR format cannot be used because its all three planes represent color components blue, green and red. So, I have to convert the original BGR color space to YCrCb color space because its 1st plane representsthe intensity of the image where as other planes represent the color components.void split(const Mat& m, vector<Mat>& mv )This function splits each channel of the 'm' multi-channel array into separate channels and stores them in a vector, referenced by 'mv'. Argument listconst Mat& m - Input multi-channel arrayvector<Mat>& mv - vector that stores the each channel of the input arrayequalizeHist(channels[0], channels[0]);Here we are only interested in the 1st channel (Y) because it represents the intensity information whereas other two channels (Cr and Cb) represent color components. So, we equalize the histogram of the 1st channel using OpenCV in-built function, 'equalizeHist(..)' and other two channels remain unchanged.void merge(const vector<Mat>& mv, OutputArray dst )This function does the reverse operation of the split function. It takes the vector of channels and create a single multi-channel array. Argument listconst vector<Mat>& mv - vector that holds several channels. All channels should have same size and same depthsOutputArray dst - stores the destination multi-channel arraycvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR)This line converts the image from YCrCb color space to BGR color space. It is essential to convert to BGR color space because 'imshow(..)' OpenCV function can only show images with that color space.This is the end of the explanation of new OpenCV functions, found in the above sample code. If you are not familiar with other OpenCV functions, please refer to the previous lessons.参考博客:http://opencv-srf.blogspot.jp/2013/08/histogram-equalization.html。
图像处理——直方图均衡化
图像处理——直⽅图均衡化图像处理——直⽅图均衡化⼀、直⽅图⼀、直⽅图 直⽅图就是之图像中各像素的统计值。
反映图象中每种灰度出现的频率。
直⽅图的性质:直⽅图就是之图像中各像素的统计值。
反映图象中每种灰度出现的频率。
直⽅图的性质:1)表征了图像的⼀维信息。
只反映图像中像素不同灰度值出现的次数(或频数)⽽未反映像素所在位置。
1)表征了图像的⼀维信息。
只反映图像中像素不同灰度值出现的次数(或频数)⽽未反映像素所在位置。
2)与图像之间的关系是多对⼀的映射关系。
⼀幅图像唯⼀确定出与之对应的直⽅图,但不同图像可能有相同的直⽅图。
2)与图像之间的关系是多对⼀的映射关系。
⼀幅图像唯⼀确定出与之对应的直⽅图,但不同图像可能有相同的直⽅图。
3)⼦图直⽅图之和为整图的直⽅图。
3)⼦图直⽅图之和为整图的直⽅图。
⼆、直⽅图均衡化⼆、直⽅图均衡化直⽅图均衡化处理的“中⼼思想”是把原始图像的灰度直⽅图从⽐较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直⽅图均衡化直⽅图均衡化处理的“中⼼思想”是把原始图像的灰度直⽅图从⽐较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直⽅图均衡化就是对图像进⾏⾮线性拉伸,重新分配图像像素值,使⼀定灰度范围内的像素数量⼤致相同。
直⽅图均衡化就是把给定图像的直⽅图分布改就是对图像进⾏⾮线性拉伸,重新分配图像像素值,使⼀定灰度范围内的像素数量⼤致相同。
直⽅图均衡化就是把给定图像的直⽅图分布改变成“均匀”分布直⽅图分布。
变成“均匀”分布直⽅图分布。
(I )直⽅图均衡化的过程:(I )直⽅图均衡化的过程:1)列出原始图像和变换后图像的灰度级(L 是灰度级的个数);1)列出原始图像和变换后图像的灰度级(L 是灰度级的个数);2)统计原图像中各灰度级的像素个数;2)统计原图像中各灰度级的像素个数;3)计算原始图像直⽅图P(i)=Ni/N ;3)计算原始图像直⽅图P(i)=Ni/N ;4)计算累计直⽅图P(j)=P(1) + P(2) + P(3) +…+ P(i);4)计算累计直⽅图P(j)=P(1) + P(2) + P(3) +…+ P(i);5)利⽤灰度值变换函数计算变换后的灰度值,并四舍五⼊取整;j=INT[(L-1)Pj+0.5]5)利⽤灰度值变换函数计算变换后的灰度值,并四舍五⼊取整;j=INT[(L-1)Pj+0.5]6)确定灰度变换关系i →j ,据此将原图像的灰度值f (m,n )=i 修正为g (m ,n )=j ;6)确定灰度变换关系i →j ,据此将原图像的灰度值f (m,n )=i 修正为g (m ,n )=j ;7)统计变换后各灰度级的像素个数Nj ;7)统计变换后各灰度级的像素个数Nj ;8)计算变换后图像的直⽅图Pj=Nj/N 8)计算变换后图像的直⽅图Pj=Nj/N(II )图像均衡化后的缺点:(II )图像均衡化后的缺点:1)变换后图像的灰度级减少,某些细节消失;1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直⽅图有⾼峰,经处理后对⽐度不⾃然的过分增强。
直方均衡化算法
直方均衡化算法
直方图均衡化是一种常用的图像处理算法,用于改善图像的对比度。
在直方图均衡化过程中,算法会重新映射图像的像素值,使图像的灰度直方图变为均匀分布的形式,从而增强图像的对比度。
这种算法常用于图像处理和计算机视觉领域。
直方图均衡化的步骤包括:
1. 统计图像中每个灰度级像素的数量。
2. 计算每个灰度级的频率,并计算累计频率。
3. 将图像进行映射,新的像素值等于原像素值乘以累计频率。
使用累计频率的原因在于,它能够保证映射后的像素值仍然保持原来的灰度值大小关系,即亮的区域依旧是亮的,暗的区域依旧是暗的,不会将亮的区域变为暗的。
同时,由于像素值的灰度值范围在0~255之间,与累计分布
频率相乘之后灰度值范围不变,不会出现越界的情况。
以上信息仅供参考,如有需要,建议查阅图像处理专业书籍或咨询专业人士。
直方图平均数的计算公式
直方图平均数的计算公式直方图平均数是一种常用的概率统计分析方法,它可以有效地快速统计某一类样本的概率分布及其总体特性。
直方图平均数被广泛应用于多种领域,如工程和科学研究、教育、健康等。
本文将简要介绍直方图平均数的计算公式及其应用。
一、直方图平均数的计算公式1.直方图平均数的定义直方图平均数是指曲线状的起伏上方,其中百分比较低的处最低,而百分比较高的处最高。
它是用于确定一类样本中的基础概率分布的标准,它可以帮助人们快速发现统计数据中的规律和趋势。
公式表达式如下:直方图平均数=∑(百分比×数值)/∑(百分比)其中,百分比表示某一类样本中该值的百分比,数值表示该样本的数值。
2.直方图平均数的计算公式有时,我们想知道一类样本中的数值的平均值,可以使用以下计算公式:直方图平均数=∑(百分比×数值)/∑(百分比)若已知某一类样本中包含5个数值(x1,x2,x3,x4,x5),同时该类样本中各数值所占的百分比为P1,P2,P3,P4,P5,则该类样本的直方图平均数为:直方图平均数=[P1×(x1)+ P2×(x2)+ P3×(x3)+ P4×(x4)+ P5×(x5)]/(P1+P2+P3+P4+P5)二、直方图平均数的应用1.工程和科学研究直方图平均数可以帮助工程和科学研究者们更有效地分析采集的数据。
例如,可以使用直方图平均数来分析风能利用率、电子设备性能、汽车发动机效率等。
2.教育教育领域中,直方图平均数可以帮助教师们有效地评估学生在测试中的表现。
通过评估统计,可以对整班学生的总体表现进行分析,并且可以发现班级中比较突出的个体和学科表现。
3.健康在健康领域,直方图平均数可以帮助医护人员们评估某一病症的流行率以及其危害程度。
通过对病症受累人群的亚群分析,可以获得有效的统计数据,并且可以清晰地看到每个亚群中存在哪些差异。
三、总结本文介绍了直方图平均数的计算公式及其应用。
直方图均衡化
一种基于直方图均衡化的图像增强方法摘要:直方图均衡化就是把一已知灰度概率分布的图像经过一种变换,使之演变成一幅具有均匀灰度概率分布的新图像。
它是以累积分布函数变换法为基础的直方图修正法。
本文分析和总结了灰度直方图的均衡化算法并通过MA TLAB实验验证了该方法能有效达到图像增强的目的。
关键词:直方图;均衡化;图像增强A Method On Histogram Equalization For Image EnhancementAbstract:As is known about the probability distribution of gray scale of an image ,histogram equalization is to make the image got transformed by a kind of transformation, and to make it turned into a new image with the probability of gray scale distributed evenly. It is a method of histogram modification based on the method of transformation on cumulative distribution function. This paper analyzes and summarizes the equalization algorithm of gray histogram and testifies the validity of this algorithm by MATLAB experiment and it shows that this method can effectively achieve the purpose of image enhancement.Keywords: Histogram; Equalization; Iamge Ehancement1、引言在实际应用中,无论采用何种输入装置采集的图像,由于光照、噪声等原因,图像的质量往往不能令人满意。
直方图均衡大总结
直方图均衡总结一、什么是直方图一个灰度级在范围[0,L-1]的数字图像的直方图是一个离散函数p(r k) = n k/MNMN是图像中像素的总数n k是图像中灰度级为r k的像素个数r k是第k个灰度级,其中k=0,1,2,……,L-1。
由直方图的定义可见:该定义其实是图像灰度级的概率密度函数,表明图像中某一个灰度级出现的概率,取值范围是[0,1]什么是直方图均衡一个“好”的图像,我们希望其:图像的像素占有全部的优先级,并且分布均匀,这样图像就有高的对比度。
也就是说我们要把图像的直方图(概率密度函数)尽量变成均匀分布的直方图,以使图像变“好”。
这个过程就是直方图均衡。
如何实现直方图均衡假设变换:s = T(r), 0≤r≤L-1T(r)需要满足以下条件:1、T(r)需要在区间[0,L-1]内为单值,且是单调递增的2、当0≤r≤L-1时,0≤T(r)≤L-1也就是说,像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;另外,如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。
综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的变换函数是累积分布函数。
累积分布函数是概率密度函数的积分,对连续函数,它是所有小于等于a 的值,其出现概率的和,F(a)=P(x<=a)。
若累积分布函数 F 是连续的严格增函数,则存在其反函数。
累积分布函数的反函数可以用来生成服从该随机分布的随机变数。
回到刚才的变换函数,我们采用了累积分布函数来做变换函数, s = T(r) = (L −1)∫pr (w )dw r 0其离散形式为:s k = T(r k ) = (L −1)∑p (rj )=L−1MN ∑nj k 0k j=0, k = 0, 1, 2,……,L-1其中s k 称为直方图均衡化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
直方图均衡化(色调均化)
“图像(Image)>调整(Adjust)”菜单的功能
色调均化(Equalize)
Photoshop菜单:图像>调整>色调均化
公式:
(公式中Sk表示均衡化后的灰度值,∑表示总和,nj是原图中某个灰度色阶j 的像素数量,j的范围是0~k,N是图像像素总数。
)
“色调均化”命令重新分布图像中像素的亮度值,以便它们更均匀地呈现所有范围的亮度级。
使用此命令时,Photoshop尝试对图像进行直方图均衡化(HistogramEqualization),即于整个灰度范围中均匀分布每个色阶的灰度值。
当扫描的图像显得比原稿暗,而您想平衡这些值以产生较亮的图像时,可以使用“色调均化”命令。
配合使用“色调均化”命令和“直方图”命令,可以看到亮度的前后比较。
使用“色调均化”命令:
1.选择菜单图像>调整>色调均化。
2.如果已选择一个图像区域,于弹出的对话框中选择要均化的内容,然后点按“好”。
•“仅色调均化所选区域”只均匀地分布选区的像素。
•“基于所选区域色调均化整个图像”基于选区中的像素均匀分布所有图像的像素。
原理
直方图均衡化是一种灰度变换算法,所以我们重点研究灰度图像的直方图均衡化。
绝对的均匀
图A是一个黑白灰均匀渐变,0~255的每一个色阶的灰度数量均是相同的。
图B 的是图A的像素打乱了顺序随机分布的,每种灰度的数量均与图A的相同,因而它的直方图也与图A的相同。
图A和图B的直方图。
每种灰度数量是相同的,直方图呈一个黑色矩形。
近似的均匀
对于一般的图像,由于每种灰度的像素数量且不相同,我们没办法把每种灰度的分量调得像图A、B那么均匀,但是可以做到近似的均匀。
也就是说,把直方图横向平均分成几份之后,使每一份的像素数量大致相等。
下面是一幅图片的直方图,共有19200个像素,从左到右平均分成三份。
均衡化之后,每份的像素数量均于6400左右。
手工调整方法
我们拍摄或扫描的照片往往会由于光线太强或太弱,使图像对比度减弱,细节分辨不清。
这样的图像直方图灰度往往均集中于某一色阶范围之内,我们需要将这些灰度拉伸到整个灰度级上,且使它们于直方图中均匀的分布,以达到增强图像的目的。
现于我们要通过Photoshop的曲线调整(图像>调整>曲线)来把一幅图片的灰度分布调整均匀。
上图的直方图图形可以近似地看成三个高峰两个低谷。
先把曲线的起点和终点(黑白场)拉到与图形等宽,再通过曲线把两个低谷拉高一些,这时灰度分布就显得比较均匀了。
调整之后的图像和直方图。
直方图均衡化就是要通过某种算法来实现上面手工调整的效果。
算法
经典算法
下面以一幅3*2像素的简单图片(图C)为例,来说明灰度直方图均衡化的算法。
(图C)
图C的直方图:
注意看百分位(Percentile)这一项。
一般软件的百分位是当前色阶的像素数量÷总像素数量,而Photoshop不同,Photoshop显示的是当前色阶与前面色阶的所有像素数量÷总像素数量。
因此图C色阶为100时的百分位就是
(3+2)/6=5/6=83.33%,这个百分位其实就是我们要求的灰度值(范围0~1),把它转换成0~255的范围,要再乘255。
求出每个色阶的百分位之后,再乘255,就可以求出与其对应的灰度值来。
色阶数量出现频率百分位255*百分位
根据每个色阶的色阶->255*百分位的对应关系组成一个灰度映射表,然后根据映射表来修改原来图片每个像素的灰度值。
对于图C,用128替换50,用212替换100,用255替换200。
这样,灰度直方图的均衡化就完成了。
Photoshop的算法
经过经典算法均衡化的图片,最亮的像素值总是255,因为最后一级色阶(255)的百分位一定是100%。
而最暗的是由色阶0的数量决定的,像素值不一定是0。
Photoshop通过对比度拉伸的方法使最暗的像素值变为0,其它像素也相应变暗,最亮的像素保持255不变。
对比度拉伸后的效果可能会比经典算法稍显偏暗。
对比度拉伸的算法,类似于使用色阶调整命令把黑场设成Min时的效果,Min是指像素数量不为0的第一个色阶。
对比度拉伸的公式:C=(Level-Min)*Scale=(Level-Min)*255/(255-Min)
图C均衡化之后的灰度值分别是128、212、255,为了精确,我们使用保留2位小数的形式(127.50、212.42、255.00)来进行对比度拉伸的计算。
Min=127.50'均衡化之后的最小值
Scale=255/(255-Min)=2
(127.50-Min)*Scale=0*2=0
(212.42-Min)*Scale=84.92*2=170
(255.00-Min)*Scale=127.5*2=255
'新的映射表:
50->0
100->170
200->255
经典算法和Photoshop算法的直方图比较。
彩色算法
彩色的直方图均衡化其实就是对图像某个或多个颜色通道进行灰度直方图均衡化运算,常见的有以下几种方法:
1.统计所有RGB颜色通道的直方图的数据且做均衡化运算,然后根据均衡化
所得的映射表分别替换R、G、B通道颜色值。
2.分别统计R、G、B颜色通道的直方图的数据且做均衡化运算,然后根据R、
G、B的映射表分别替换R、G、B通道颜色值。
3.用亮度公式或求RGB的平均值的方式计算亮度通道,然后统计亮度通道的
直方图的数据且做均衡化运算,然后根据映射表分别替换R、G、B通道颜色值。
Photoshop用的是第一种方法。
总结
直方图均衡化是灰度变换的一个重要应用,它高效且易于实现,广泛应用于图像增强处理中。
图像的像素灰度变化是随机的,直方图的图形高低不齐,直方图均衡化就是用一定的算法使直方图大致平和。
均衡化处理后的图象只能是近似均匀分布。
均衡化图象的动态范围扩大了,但其本质是扩大了量化间隔,而量化级别反而减少了,因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。
如果原始图像对比度本来就很高,如果再均衡化则灰度调和,对比度降低。
于泛白缓和的图像中,均衡化会合且一些象素灰度,从而增大对比度。
均衡化后的图片如果再对其均衡化,则图像不会有任何变化。
灰度直方图均衡化的算法,简单地说,就是把直方图的每个灰度级进行归一化处理,求每种灰度的累积分布,得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素。
经典的直方图均衡化算法可能存于以下一些不足:
1.输出图像的实际灰度变化范围很难达到图像格式所允许的最大灰度变化
范围。
2.输出图像的灰度分布直方图虽然接近均匀分布,但其值与理想值1/n仍有
可能存于较大的差异,且非是最佳值。
3.输出图像的灰度级有可能被过多地合且。
由于灰度的吞噬也易造成图像信
息的丢失。
为此人们提出了许多改进的直方图均衡算法,详细内容请参阅本文末尾提供的参考资料。
公式
要写论文的同学可能需要用数学的方式来描述,下面我把前面讲的内容概括成公式,以供参考。
概率密度函数(PDF)
为了计算方便,我们需要将直方图归一化,即把灰度范围由0~255变为0~1。
归一化后的直方图其实就是一个概率密度函数
(PDF,probabilitydensityfunction),均衡化就是令概率密度为1。
我们用Pr(r)来表示原图像的PDF,用Ps(s)表示均衡化之后的PDF,r、s分别代表均衡化前后的灰度值,r,s∈[0,1]。
根据概率论的知识,可得出:
公式中T-1(s)代表T(r)的逆变换函数。
因为我们要求的概率密度为1,即:
因此:
由此得出:
等式两边对r积分,即可得出PDF的均衡化公式:
公式中T(r)代表r的灰度变换函数,∫表示积分,w为假设变量。
累积分布函数(CDF)
对于图像而言,我们需要使用离散形式的公式(DiscreteFormulation)。
某个灰度级像素出现的概率为:
Pr(rk)是原图像第k个灰度级像素出现的概率,rk是第k个灰度级,即当前色阶k,k∈[0,1]。
nk是rk像素数量。
N是图像像素总数(图像大小),N=∑knk。
图像的灰度直方图均衡化公式:
公式中,T(rk)来表示原图像的第k个灰度级的转换函数。
∑表示总和。
∑nj/N 表示0~j个灰度级的像素数量总和与像素总数的比值,也就是前面讲过的百分位(当前色阶与前面色阶的所有像素数量÷总像素数量)。
∑Pr(rk)表示第0~k的灰度级出现概率累积相加。
因为s是归一化的数值(s∈[0,1]),要转换为0~255的颜色值,需要再乘上255,即S=∑Pr(rk)*255。
这个转换公式也被称为图像的累积分布函数
(CDF,cumulativedistributionfunction)。
感谢您的阅读。