直方图均衡

直方图均衡化一般用来增长图像的全局对比度。 这种方法对于背景和前景都太亮或者太暗的图像很是有用。
主要优点  :一个至关直观的技术而且是可逆操做,若是已知均衡化 函数 ,那么就能够恢复原始的直方图,而且计算量也不大。
 缺点        :对处理的数据不加选择,它可能会增长背景噪声的对比度而且下降有用信号的对比度。

一、统计一帧中各个灰阶值[0~255]各自的个数;html

二、从0~255 灰阶排序,计算累加个数,后一个等于前几个之和hist_acc;java

三、分别计算各个累加和的几率; hist_acc[i]/Size ,其中i = 0~255算法

四、映射个灰阶值: hist_value[i] =255*hist_acc[i]/Size; 其中i = 0~255函数

五、输出映射值 NewData = hist_value[data_i];工具


一下为参考资料:测试

直方图均衡化的数学原理

https://blog.csdn.net/superjunenaruto/article/details/52431941

直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在所有灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,从新分配图像像素值,使必定灰度范围内的像素数量大体相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布【1】。有关直方图均衡化的深刻介绍,能够参考做者的另外一篇博客直方图匹配的数学原理ui

下图为直方图均衡化的过程,体现了“均衡”的含义:(几率密度的均匀)spa


网上能够查阅到关于直方图均衡化的各类解释、用法、程序、优缺点,这里只关注直方图均衡化的数学原理(能够参阅【1】)。.net

咱们知道直方图变换实际上是一种灰度变换,灰度变换的变换函数决定了输入随机变量与输出随机变量之间的关系,也就是两个随机变量的关系;一副图像是二维离散的数据,不利于使用数学的工具进行处理,在数字图像处理中,咱们一般是采用连续的变量进行推导,最后在推广到离散的状况。3d

如下咱们介绍:1.图像直方图的定义 2.直方图变换的理论基础(为何介绍它?直方图变换是直方图均衡化的基础)3.几率知识-随机变量的函数分布 4.直方图均衡化的理论基础 5.离散形式的直方图均衡化

1、图像直方图的定义

1.定义(1):


2.定义(2):


3.比较:


2、直方图变换的理论基础



注意:T(r)为单值单调增长(此为数字图像处理-冈萨雷斯-第二版中的表述),在第三版中有一些变化,具体的能够查阅此书的对应章节。


3、几率论的知识-随机变量的函数的分布

这一块涉及了几率论的知识-随机变量的函数的分布:



4、直方图均衡化的理论基础





5、离散形式的直方图均衡化


6、例子











---------------------------------------------------------------------------------------------------------------------------------

https://www.2cto.com/kf/201602/488456.html

对于彩色图像而言,你可能会想到分别对R、G、B三个份量来作处理,这也确实是一种方法。但有些时候,这样作颇有可能致使结果图像色彩失真。所以有人建议将RGB空间转换为HSV以后,对V份量进行直方图均衡处理以保存图像色彩不失真。下面咱们来作一些对比实验。待处理图像是标准的图像处理测试用图couple图,以下所示。

\

首先,咱们分别处理R、G、B三个份量,为了简便咱们直接使用matlab中的函数histeq()。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
a = imread( 'couple.tiff' );
R = a(:,:, 1 );
G = a(:,:, 2 );
B = a(:,:, 3 );
 
R = histeq(R, 256 );
G = histeq(G, 256 );
B = histeq(B, 256 );
 
a(:,:, 1 ) = R;
a(:,:, 2 ) = G;
a(:,:, 3 ) = B;
imshow(a)

下面的代码使用了另一种方式,即将色彩空间转换到HSV后,对V通道进行处理。因为代码基本与前面介绍的一致,这里咱们再也不作过多解释了。

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Img = imread( 'couple.tiff' );
hsvImg = rgb2hsv(Img);
V=hsvImg(:,:, 3 );
[height,width]=size(V);
 
V = uint8(V* 255 );
NumPixel = zeros( 1 , 256 );
for i = 1 :height
     for j = 1 : width
     NumPixel(V(i,j) + 1 ) = NumPixel(V(i,j) + 1 ) + 1 ;
     end
end
 
 
ProbPixel = zeros( 1 , 256 );
for i = 1 : 256
     ProbPixel(i) = NumPixel(i) / (height * width * 1.0 );
end
 
CumuPixel = cumsum(ProbPixel);
CumuPixel = uint8( 255 .* CumuPixel + 0.5 );
 
for i = 1 :height
     for j = 1 : width
         V(i,j) = CumuPixel(V(i,j));
     end
end
  
V = im2double(V);
hsvImg(:,:, 3 ) = V;
outputImg = hsv2rgb(hsvImg);
imshow(outputImg);


 

最后,来对比一下不一样方法对彩色图像的处理效果。下面的左图是采用R、G、B三份量分别处理获得的结果。右图是对HSV空间下V通道处理之结果。显然,右图的效果更理想,而左图则出现了必定的色彩失真。事实上,对彩色图像进行直方图均衡是图像处理研究领域一个看似简单,可是一直有人在研究的话题。咱们所说的对HSV空间中V份量进行处理的方法也是比较基本的策略。不少相关的研究文章都提出了更进一步的、适应性更强的彩色图像直方图均衡化算法。有兴趣的读者能够参阅相关文献以了解更多。

 

\

分别处理R、G、B三个份量之结果 转换到HSV空间后处理V份量