直方图均衡化原理及编码实现
- 格式:pdf
- 大小:573.58 KB
- 文档页数:4
图像处理中直方图均衡化的使用教程图像处理中的直方图均衡化是一种常用的增强图像对比度的方法。
通过对图像的像素值进行重新分布,直方图均衡化可以使图像中的明暗区域更具有对比度,从而提高图像的质量和清晰度。
本文将介绍直方图均衡化的原理、应用场景以及具体的步骤。
1. 直方图均衡化的原理直方图均衡化的原理基于对图像的灰度级进行重新分布。
它通过将原始图像的像素值映射到新的像素值上,使得直方图在整个灰度范围内得到均匀分布。
这样就能够增强图像中的低对比度区域,提高图像的视觉效果。
2. 直方图均衡化的应用场景直方图均衡化在图像处理领域有着广泛的应用。
下面列举了一些常见的应用场景:- 增强图像的对比度:直方图均衡化可以使得图像中的亮度值更加均匀分布,提高图像的对比度,使得图像变得更加清晰。
- 增强图像的细节:直方图均衡化通过增强图像中的低对比度区域,可以使得细节更加显著,提高图像的可视化效果。
- 降低图像的噪声:直方图均衡化可以将图像中的噪声分布均匀化,从而减少噪声对图像质量的影响。
3. 直方图均衡化的步骤下面是使用直方图均衡化对图像进行处理的具体步骤:步骤 1: 将彩色图像转换为灰度图像如果原始图像是彩色图像,我们需要将其转换为灰度图像。
这是因为直方图均衡化是针对灰度级进行处理的。
步骤 2: 计算原始图像的像素值分布使用图像处理工具,计算原始图像中每个像素值的出现频率。
这样可以得到一个直方图,该直方图显示了原始图像中像素值的分布情况。
步骤 3: 计算累积分布函数通过对原始图像的直方图进行累积求和,得到一个累积分布函数。
该函数显示了每个像素值的累积出现频率。
步骤 4: 计算新的像素值根据累积分布函数,计算每个像素值的新的映射像素值。
这个计算公式可以根据具体的图像处理工具而有所不同。
步骤 5: 创建均衡化后的图像使用新的像素值替换原始图像中的像素值,将得到的图像称为均衡化后的图像。
4. 注意事项在使用直方图均衡化时,需要考虑以下几个注意事项:- 直方图均衡化可能会改变图像的整体亮度。
实验三图像直方图与均衡化一、实验原理离散图像用直方图表示该图像中各个不同灰度级像素出现的相对频率。
灰度直方图是简单且实用的工具,对图像的采集、处理和分析都可以有效地利用直方图。
灰度直方图反映了数字图像中的每一灰度级与其出现的频率间的关系。
直方图均衡化是通过对原图形进行某种变换,使图像的直方图变为均匀分布的直方图,从而达到增强的效果。
二、实验设备MATLAB软件三、实现程序:pic=imread('football.jpg');imshow(pic)imwrite(rgb2gray(PS),'football.bmp');pic=rgb2gray(pic);figure,imshow(pic)[m,n]=size(pic);S0=zeros(1,256);for k=0:255S0(k+1)=length(find(pic==k))/(m*n);endfigure,bar(0:255,S0,'g')S1=zeros(1,256);for i=1:256for j=1:iS1(i)=S0(j)+S1(i);endendS2=round(S1*256);for i=1:256S0eq(i)=sum(S0(find(S2==i)));endfigure,bar(0:255,S0eq,'b')Img=pic;for i=0:255Img (find(pic==i))=S2(i+1);endfigure,imshow(Img);四、运行结果:原图像的直方图均衡化后图像的直方图原图像均衡化后的图像。
C语⾔数字图像处理之直⽅图均衡化本⽂实例为⼤家分享了C语⾔直⽅图均衡化的具体代码,供⼤家参考,具体内容如下原理直⽅图均衡化(Histogram Equalization) ⼜称直⽅图平坦化,实质上是对图像进⾏⾮线性拉伸,重新分配图像象元值,使⼀定灰度范围内象元值的数量⼤致相等。
这样,原来直⽅图中间的峰顶部分对⽐度得到增强,⽽两侧的⾕底部分对⽐度降低,输出图像的直⽅图是⼀个较平的分段直⽅图:如果输出数据分段值较⼩的话,会产⽣粗略分类的视觉效果。
直⽅图是表⽰数字图像中每⼀灰度出现频率的统计关系。
直⽅图能给出图像灰度范围、每个灰度的频度和灰度的分布、整幅图像的平均明暗和对⽐度等概貌性描述。
灰度直⽅图是灰度级的函数, 反映的是图像中具有该灰度级像素的个数, 其横坐标是灰度级r, 纵坐标是该灰度级出现的频率( 即像素的个数) pr( r) , 整个坐标系描述的是图像灰度级的分布情况, 由此可以看出图像的灰度分布特性, 即若⼤部分像素集中在低灰度区域, 图像呈现暗的特性; 若像素集中在⾼灰度区域, 图像呈现亮的特性。
灰度数字图像是每个像素只有⼀个采样颜⾊的图像。
这类图像通常显⽰为从最暗⿊⾊到最亮的⽩⾊的灰度。
灰度图像与⿊⽩图像不同,在计算机图像领域中⿊⽩图像只有⿊⽩实现流程:1)统计每个灰度级像素点的个数2)计算灰度分布密度3)计算累计直⽅图分布4)累计分布取整,保存计算出来的灰度映射关系处理图⽚规格800*600 8位灰度单通道原图直⽅图均衡化分析:本次实验中,我故意把原图调暗,进⾏直⽅图均衡化后可以明显感受到整幅图像亮度增⼤了,⽽且某些细节⽅⾯更加突出。
出现问题最初进⾏直⽅图均衡化时,输出结果如下:经分析,是没有对数组初始化置零导致的。
Hist数组是进⾏⼀个统计像素点个数的数组,最初倘若不置零,结果必然毫⽆意义。
故⽽添加数组内存置零的操作:经测试,问题解决。
附代码#include <stdio.h>#include <stdlib.h>#include <memory.h>#define height 600#define width 800typedef unsigned char BYTE; // 定义BYTE类型,占1个字节int main(void){FILE *fp = NULL;//BYTE Pic[height][width];BYTE *ptr;BYTE **Pic = new BYTE *[height];for (int i = 0; i != height; ++i){Pic[i] = new BYTE[width];}fp = fopen("weiminglake_huidu.raw", "rb");ptr = (BYTE*)malloc(width * height * sizeof(BYTE));//创建内存for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){fread(ptr, 1, 1, fp);Pic[i][j] = *ptr; // 把图像输⼊到2维数组中,变成矩阵型式ptr++;}}fclose(fp);int hist[256];float fpHist[256];float eqHistTemp[256];int eqHist[256];int size = height *width;int i, j;memset(&hist, 0x00, sizeof(int) * 256);memset(&fpHist, 0x00, sizeof(float) * 256);memset(&eqHistTemp, 0x00, sizeof(float) * 256);for (i = 0; i < height; i++) //计算差分矩阵直⽅图直⽅图统计每个灰度级像素点的个数{for (j = 0; j < width; j++){unsigned char GrayIndex = Pic[i][j];hist[GrayIndex] ++;}}for (i = 0; i< 256; i++) // 计算灰度分布密度{fpHist[i] = (float)hist[i] / (float)size;}for (i = 0; i< 256; i++) // 计算累计直⽅图分布{if (i == 0){eqHistTemp[i] = fpHist[i];}else{eqHistTemp[i] = eqHistTemp[i - 1] + fpHist[i];}}//累计分布取整,保存计算出来的灰度映射关系for (i = 0; i< 256; i++){eqHist[i] = (int)(255.0 * eqHistTemp[i] + 0.5);}for (i = 0; i < height; i++) //进⾏灰度映射均衡化{for (j = 0; j < width; j++){unsigned char GrayIndex = Pic[i][j];Pic[i][j] = eqHist[GrayIndex];}}fp = fopen("output.raw", "wb");for (i = 0; i < height; i++){for (j = 0; j < width; j++){fwrite(&Pic[i][j], 1, 1, fp);}}fclose(fp);return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
直方图均衡化的原理和作用直方图均衡化是一种常见的图像处理技术,用于增强图像的对比度和视觉效果。
它的原理是通过重新分布图像的灰度级别,使得图像中的像素灰度值分布更加均匀,从而改善图像的视觉效果。
在进行直方图均衡化时,首先需要获取图像的灰度直方图,然后根据灰度直方图的累积概率密度函数对图像的像素进行重新分配。
直方图均衡化的作用主要体现在以下几个方面:1. 增强图像的对比度:直方图均衡化可以有效地增强图像的对比度,使得图像中不同区域的灰度级别更加明显,从而使得图像的细节更加清晰。
2. 提高图像的视觉效果:通过直方图均衡化,图像的灰度级别分布更加均匀,可以使得图像看起来更加自然和真实,同时增强了图像的视觉效果,使得观看者更容易理解和分析图像内容。
3. 抑制背景噪声:在图像处理中,背景噪声往往会影响图像的清晰度和质量。
通过直方图均衡化可以有效地抑制背景噪声,使得图像更加清晰和易于分析。
4. 增强图像的细节:直方图均衡化可以增强图像的细节,使得图像中的纹理和结构更加清晰和突出,同时也能够凸显出图像中的一些微弱的特征。
直方图均衡化的原理是基于图像的灰度级别分布的重新分配,其具体操作过程如下:1. 获取图像的灰度直方图:首先需要对图像进行灰度化处理,然后统计不同灰度级别的像素点数量,从而得到图像的灰度直方图。
2. 计算灰度直方图的累积概率密度函数:根据图像的灰度直方图,可以计算出每个灰度级别对应的累积概率密度函数,即将原始的灰度级别映射到新的灰度级别上。
3. 根据累积概率密度函数对像素进行重新分配:根据计算得到的累积概率密度函数,可以将图像中的每个像素的灰度级别重新映射到新的灰度级别上,从而得到均衡化后的图像。
通过以上操作,可以实现直方图均衡化,从而改善图像的对比度和视觉效果。
需要注意的是,直方图均衡化可能会增强图像中的噪声和细小的纹理,因此在实际应用中需要结合具体的图像特性进行调整,以达到最佳的效果。
总之,直方图均衡化是一种有效的图像处理技术,通过重新分配图像的灰度级别,可以增强图像的对比度,改善图像的视觉效果,并抑制背景噪声,使得图像更加清晰和易于分析。
图像编码中的直方图均衡化方法探究一、引言图像编码是一种将图像转换为数字数据以便存储或传输的过程。
在图像编码中,直方图均衡化是一种常用的图像增强方法。
通过对图像的像素值进行变换,直方图均衡化可以增强图像的对比度和细节,并改善图像的视觉效果。
本文将探讨直方图均衡化方法在图像编码中的应用。
二、直方图均衡化的基本原理直方图均衡化是通过对图像像素值进行变换,将原始图像的像素值分布转换为均匀分布,以实现对比度的增强。
在直方图均衡化过程中,首先需要计算图像的灰度直方图,即统计图像中各个灰度级别的像素数量。
然后,通过归一化直方图将像素值映射到[0,1]的范围内。
最后,通过累积概率函数将归一化后的直方图变换为均匀分布的直方图。
三、直方图均衡化的优点直方图均衡化具有以下几个优点:1.增强对比度:直方图均衡化可以通过增大灰度级别之间的差异来增强图像的对比度,使得图像中的细节更加清晰。
2.增强细节:直方图均衡化可以通过增大较低灰度级别的像素值来提高图像中的细节。
这对于一些细节丰富但对比度较低的图像特别有效。
3.适应不同场景:直方图均衡化可以适应不同场景下的图像,不受光照条件的影响。
它可以将图像的整体亮度分布进行调整,以适应不同的光照条件。
四、直方图均衡化的应用直方图均衡化在图像编码中有着广泛的应用。
下面将介绍两种常见的图像编码方法,以及在这两种方法中直方图均衡化的应用。
1.离散余弦变换(DCT)编码离散余弦变换(DCT)是一种基于空间频率的图像编码方法。
在DCT编码中,直方图均衡化可以应用于DCT系数的量化过程。
通过对DCT系数的直方图进行均衡化处理,可以提高编码后的图像的清晰度和对比度。
2.小波变换编码小波变换是一种多分辨率分析方法,常用于图像压缩编码中。
在小波变换编码中,直方图均衡化可以应用于小波系数的量化过程。
通过对小波系数的直方图进行均衡化处理,可以增强编码后的图像的细节和对比度,并减少编码后的图像中的噪声。
五、直方图均衡化方法的改进传统的直方图均衡化方法存在一些问题,比如在图像具有大片连续区域相同灰度的情况下,会产生明显的噪点。
Python图像直⽅图、⾼斯滤波、直⽅图均衡化的结果及基本原理⼀、图像直⽅图1、基本原理 直⽅图的定义:图像的直⽅图⽤来表⽰该图像像素值的分布情况。
⽤⼀定数⽬的⼩区间(bin)来指定表征像素值的范围,每个⼩区间会得到落⼊该⼩区间表⽰范围的像素数⽬。
绘制图像直⽅图: ⼀幅数字图像在[0,G]的范围内总共有L个灰度级,其直⽅图定义为下列离散函数:h(r k) = n k 式⼦中,r k 是区间[0,G]内的第k级灰度,n k为图像中出现r k 这种灰度级的像素数量。
对于uint8类图像,G的值为255;对于uint16类图像,G的值为65535;对于浮点图像,G的值为1.0。
注意,对于uint8类和uint16类图像,G=L-1。
图像的直⽅图可以使⽤ hist() 函数绘制。
hist() 函数的第⼆个参数指定⼩区间的数⽬。
需要注意的是,因为 hist() 只接受⼀维数组作为输⼊,所以我们在绘制图像直⽅图之前,必须先对图像进⾏压平处理。
flatten() ⽅法将任意数组按照⾏优先准则转换成⼀维数组。
2、相关代码:(参考课本)from array import arrayfrom PIL import Imagefrom pylab import *# 添加中⽂字体⽀持from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)im = array(Image.open('../images/02.jpg').convert('L')) # 打开图像,并转成灰度图像figure()subplot(121)gray()contour(im, origin='image')axis('equal')axis('off')title(u'图像轮廓', fontproperties=font)subplot(122)hist(im.flatten(), 128)title(u'图像直⽅图', fontproperties=font)plt.xlim([0, 260])plt.ylim([0, 11000])show()3、运⾏结果:⼆、⾼斯滤波1、基本原理 ⾼斯滤波的定义:它是⼀种线性平滑滤波,能够有效的抑制⾼斯噪声,⼴泛应⽤于图像处理的减噪过程。
直⽅图均衡化(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.直方图均衡化:对原始图像的像素灰度做某种映射变换,使变换后图像直方图的概率密度呈均匀分布,即变换后图像的灰度级均匀分布。
2. 步骤:(1).统计原图像每一灰度级的像素数和累积像素数。
(2).计算每一灰度级xa均衡化后对应的新值,并对其四舍五入取整,得到新灰度级xb。
(3).以新值替代原灰度值,形成均衡化后的新图像。
(4).根据原图像像素统计值对应找到新图像像素统计值,作出新直方图。
四、实验思路五、 实验步骤1.新建项目文件:本实验选用的语言是C#,开发工具是VisualStudio2010,通过“文件—新建—项目—C#—Windows 窗体应用程序”,命名“直方图均衡化”即可;2.编写代码:由实验思路中的思维导图可得知,本实验步骤与“绘制直方图实验非常类似”,只是中间加了对原始图像灰度值统计数据进行了均衡化处理这一步骤,因此,只需在它的基础上进行改动和添加部分代码即可,具体如下:(1).编写头文件读取代码:由于以前的实验已有该代码,那么只需,导入其所在的“.cs ”类文件即可;(2).编写读取图像灰度值代码:将“绘制任意图像灰度值”实验该部分功能“.cs ”类文件导入即可;(3).编写统计灰度值代码:载入该功能所在“.cs ”类文件即可;(4).编写直方图均衡化代码:由实验原理里的直方图均衡化步骤可知它对应的代码部分应该有:统计像素累计数,这个只需利用已有的灰度值及其频数所在的Hashtable 哈希表数据即可;将原始灰度级映射到新的值,只需编写一个 对应方法,再对新的灰度级频数进行统计即可,具体代码将后文;(5).编写绘制直方图代码:导入已有的代码所在“.cs ”类文件即可。
3.编译与调试:通过VS2010断点等调试工具,可查看、排除程序错误,无语法、逻辑错误后,编译生成程序文件即可;4.运行程序查看结果:运行程序,加载实验数据,查看绘制出的直方图,然后再通过ENVI 的“Enhance-Interactive Stretching ”工具选择“SretchType ”为“Equalization ”执行后显示的直方图对比,看是否准确;六、 结果与分析1. 结果程序界面()01kja a j L h x N =-∑2.分析在对灰度级进行映射转换时一定要进行四舍五入运算,否则会有误差。
简述直方图均衡化的基本原理。
直方图均衡化是图像处理领域广泛使用的一种技术,它主要用来平衡图像中各个亮度区域。
它可以改善图像的质量,提高图像的局部对比度,而且,这种技术很简单,易于实现。
1.什么是直方图均衡化直方图均衡化是一种用于改善图像质量的算法,能够提高图像的局部对比度和细节,这也是为什么会有这么大的流行度的原因之一。
按照其基本思想,直方图均衡化的目的是改善图像中暗部和亮部的区分度,使其直方图更平坦,从而改善图像的局部对比度。
2.直方图均衡化的原理直方图均衡化是基于直方图概率分布转换(HDPT)实现的,它使原本呈现出偏好的直方图(例如不均衡或不清晰)变得更加均匀。
具体来说,直方图均衡化通过对图像的每个像素的亮度值进行重新映射,以实现直方图的均衡化。
首先,计算出每个像素的累积直方图(CDH),并将其映射到(0,255)的范围内。
然后,将每个像素的亮度值重新映射为与 CDH应的亮度值,从而实现直方图的均衡化。
3.方图均衡化的优势直方图均衡化具有很多优点,下面列举其中几点:(1)改善图像质量:直方图均衡化可以提高图像的局部对比度,可以改善图像的质量;(2)易于实现:直方图均衡化算法非常简单,它只需要更改图像的像素值,而不需要昂贵的计算资源;(3)对不同亮度区域均衡:直方图均衡化可以使不同亮度区域之间的光照差异更加均衡,从而提高图像的整体质量;(4)减少图像噪声:由于直方图均衡化可以改变图像中各个亮度区域之间的差异,因此可以减少图像噪声的影响,从而提高图像质量。
4.直方图均衡化的应用直方图均衡化主要用于图像处理,有助于改善图像的质量,尤其是失真或模糊的图像。
此外,它还可以用于多媒体处理,如视频传输,视频压缩,图像压缩等,以提高这些多媒体文件的质量。
此外,直方图均衡化还可以用于计算机视觉,机器学习等领域。
以上是关于直方图均衡化的基本原理和其相关应用的简单介绍。
随着技术的进步,直方图均衡化将会得到更加深入的研究,以提高图像处理技术的效率和质量。
图像编码中的直方图均衡化方法探究引言:图像编码是将图像转化为数字信号的过程,通过减少冗余信息和压缩数据,实现图像的存储和传输。
在图像编码中,直方图均衡化是一种常用的方法,用于增强图像的对比度和色彩平衡。
本文将探究直方图均衡化的原理、方法和应用,并介绍一些相关的进展和问题。
一、直方图均衡化的原理直方图是图像在亮度上的分布情况的统计图表。
直方图均衡化的原理是通过对图像的像素值进行变换,使得图像的直方图尽可能接近均匀分布,从而增强图像的对比度。
这一过程主要包括以下三个步骤:计算直方图、计算累积分布函数和建立映射关系。
计算直方图直方图的计算是通过统计图像中每个像素值的数量来实现的。
对于灰度图像,像素值取值范围通常是0到255。
统计每个像素值的数量,就得到了图像的直方图。
计算累积分布函数累积分布函数是描述直方图中像素值累计分布情况的函数。
通过将直方图中每个像素值的数量累加,得到累积分布函数。
累积分布函数的取值范围是0到1。
建立映射关系建立映射关系是将原始图像的像素值映射到均衡化后的像素值的过程。
根据像素值的累积分布函数,将原始图像的像素值转换为对应的均衡化后的像素值。
这样,就完成了直方图均衡化的过程。
二、直方图均衡化的方法直方图均衡化有多种方法,包括全局均衡化、局部均衡化和自适应均衡化。
全局均衡化全局均衡化是指对整个图像进行直方图均衡化的方法。
全局均衡化的优点是操作简单,适用于对整个图像进行对比度增强的情况。
然而,全局均衡化有一个缺点,即可能会导致图像的平均亮度过大或过小。
局部均衡化局部均衡化是指将图像分成多个子图像,然后对每个子图像进行直方图均衡化的方法。
局部均衡化的优点是可以保持图像的局部细节信息,提高对比度的同时保留图像特征。
然而,局部均衡化的缺点是计算复杂度较高。
自适应均衡化自适应均衡化是指根据图像的局部特性来调整直方图均衡化的方法。
自适应均衡化不同于全局均衡化和局部均衡化,它根据图像的像素值范围和分布情况,动态地选择合适的均衡化方法。
灰度图的直⽅图均衡化(HistogramEqualization)原理与Python实现原理 直⽅图均衡化是⼀种通过使⽤图像直⽅图,调整对⽐度的图像处理⽅法;通过对图像的强度(intensity)进⾏某种⾮线性变换,使得变换后的图像直⽅图为近似均匀分布,从⽽,达到提⾼图像对⽐度和增强图⽚的⽬的。
普通的直⽅图均衡化采⽤如下形式的⾮线性变换: 设f 为原始灰度图像,g 为直⽅图均衡化的灰度图像,则g 和f 的每个像素的映射关系如下: 其中,L 为灰度级,通常为 256,表明了图像像素的强度的范围为 0 ~ L-1; p n 等于图像f 中强度为 n 的像素数占总像素数的⽐例,即原始灰度图直⽅图的概率密度函数;f i,j 表⽰在图像f 中,第 i ⾏,第 j 列的像素强度;g i,j 表⽰在图像g 中,第 i ⾏,第 j 列的像素强度.Python 实现#!/usr/bin/env python# -*- coding: utf8 -*-"""# Author: klchang# Date: 2018.10# Description:histogram equalization of a gray image."""from__future__import print_functionimport numpy as npimport matplotlib.pyplot as pltdef histequ(gray, nlevels=256):# Compute histogramhistogram = np.bincount(gray.flatten(), minlength=nlevels)print ("histogram: ", histogram)# Mapping functionuniform_hist = (nlevels - 1) * (np.cumsum(histogram)/(gray.size * 1.0))uniform_hist = uniform_hist.astype('uint8')print ("uniform hist: ", uniform_hist)# Set the intensity of the pixel in the raw gray to its corresponding new intensityheight, width = gray.shapeuniform_gray = np.zeros(gray.shape, dtype='uint8') # Note the type of elementsfor i in range(height):for j in range(width):uniform_gray[i,j] = uniform_hist[gray[i,j]]return uniform_grayif__name__ == '__main__':fname = "320px-Unequalized_Hawkes_Bay_NZ.png"# Gray image# Note, matplotlib natively only read png images.gray = plt.imread(fname, format=np.uint8)if gray is None:print ("Image {} does not exist!".format(fname))exit(-1)# Histogram equalizationuniform_gray = histequ(gray)# Display the resultfig, (ax1, ax2) = plt.subplots(1, 2)ax1.set_title("Raw Image")ax1.imshow(gray, 'gray')ax1.set_xticks([]), ax1.set_yticks([])ax2.set_title("Histogram Equalized Image")ax2.imshow(uniform_gray, 'gray')ax2.set_xticks([]), ax2.set_yticks([])fig.tight_layout()plt.show()原始图⽚ 320px-Unequalized_Hawkes_Bay_NZ.png结果显⽰参考资料[1]. Histogram_equalization - Wikipedia. https:///wiki/Histogram_equalization[2]. Histogram Equalization. https:///icamp/courses/math77c/demos/hist_eq.pdf。
数字图像处理之直⽅图均衡化直⽅图均衡化是图像处理领域中利⽤图像直⽅图对对⽐度进⾏调整的⽅法。
直⽅图均衡化要达到的效果:基本思想:把原始图的直⽅图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围,从⽽达到增强图像整体对⽐度的效果使⽤的⽅法是灰度级变换: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. 计算图像的灰度直方图,统计每个像素灰度级的出现频率;2. 根据灰度级的频率,计算每个灰度级的累积分布函数;3. 根据累积分布函数,将原图像中的每个像素灰度级映射到新的灰度级,使得新的灰度级分布均匀。
二、直方图均衡化的优点1. 提高图像的对比度:通过直方图均衡化,可以使得图像的灰度级在整个灰度范围内分布均匀,从而增强图像的细节和纹理,提高图像的对比度。
2. 改善图像的视觉效果:直方图均衡化可以使得图像的亮度分布更加均匀,使得图像的整体亮度更加自然和舒适。
三、直方图均衡化的局限性1. 过度增强图像细节:直方图均衡化方法在提高图像对比度的同时,可能会过度增强图像的细节,导致图像变得过于锐利,出现噪点。
2. 对于某些图像效果不佳:直方图均衡化方法对于某些特殊的图像效果,如阴影、强光等情况,可能会产生不佳的效果,使图像失去原有的意境和氛围。
四、直方图均衡化的应用领域1. 图像增强:直方图均衡化方法可以广泛应用于图像增强领域,特别是在医学影像、航空影像等领域,可以提高图像的对比度和细节,帮助医生或专业人士进行更准确的诊断和分析。
2. 视频压缩:直方图均衡化方法也可以应用于视频压缩领域,在编码过程中通过直方图均衡化预处理图像,提高图像的对比度,从而降低图像编码的复杂度和存储空间。
结论直方图均衡化方法是一种常用的图像编码处理方法,通过调整图像的灰度分布,可以提高图像的对比度和视觉效果。
然而,直方图均衡化方法也存在一些局限性,可能会过度增强图像细节或者不适用于某些特殊图像效果。
1 直方图均衡化原理、目标、应用及编程实现1.1 直方图均衡化原理直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
直方图规定化直方图均衡化的优点是能自动增强整个图像的对比度,但它的具体增强效果不易控制,处理的结果总是得到全局的均衡化的直方图.实际工作中,有时需要变换直方图使之成为某个特定的形状,从而有选择地增强某个灰度值范围内的对比度,这时可采用比较灵活的直方图规定化方法.直方图规定化增强处理的步骤如下:令Pr (r )和Pz (z )分别为原始图像和期望图像的灰度概率密度函数。
如果对原始图像和期望图像均作直方图均衡化处理,应有⎰==x r dr r P r T S 0)()((1) ⎰==xz dzz p Z G V 0)()((2) )(1V G Z -= (3)由于都是进行均衡化处理,处理后的原图像概率密度函数Ps (S )及理想图像概率密度函数PV (V )是相等的。
于是,我们可以用变换后的原始图像灰度级S 代替(2)式中的V 。
即Z = G - 1(S ) (4)这时的灰度级Z 便是所希望的图像的灰度级。
此外,利用(1)与(3)式还可得到组合变换函数Z = G - 1[T (r )] (5) 对连续图像,重要的是给出逆变换解析式。
对离散图像而言,有n n Z P ii Z =)( (6)∑-===10)()(l i i z i i Z P Z G V (7))]([)(11i i i r T G S G Z --== (8)1.2直方图均衡化目标及应用这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。