直方图均衡
1、统计一帧中各个灰阶值[0~255]各自的个数;
2、从0~255 灰阶排序,计算累加个数,后一个等于前几个之和hist_acc;
3、分别计算各个累加和的概率; hist_acc[i]/Size ,其中i = 0~255
4、映射个灰阶值: hist_value[i] =255*hist_acc[i]/Size; 其中i = 0~255
5、输出映射值 NewData = hist_value[data_i];
一下为参考资料:
直方图均衡化的数学原理
https://blog.****.net/superjunenaruto/article/details/52431941直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布【1】。有关直方图均衡化的深入介绍,可以参考作者的另一篇博客直方图匹配的数学原理。
下图为直方图均衡化的过程,体现了“均衡”的含义:(概率密度的均匀)
网上可以查阅到关于直方图均衡化的各种解释、用法、程序、优缺点,这里只关注直方图均衡化的数学原理(可以参阅【1】)。
我们知道直方图变换其实是一种灰度变换,灰度变换的变换函数决定了输入随机变量与输出随机变量之间的关系,也就是两个随机变量的关系;一副图像是二维离散的数据,不利于使用数学的工具进行处理,在数字图像处理中,我们通常是采用连续的变量进行推导,最后在推广到离散的情况。
以下我们介绍:1.图像直方图的定义 2.直方图变换的理论基础(为什么介绍它?直方图变换是直方图均衡化的基础)3.概率知识-随机变量的函数分布 4.直方图均衡化的理论基础 5.离散形式的直方图均衡化。
一、图像直方图的定义
1.定义(1):
2.定义(2):
3.比较:
二、直方图变换的理论基础
注意:T(r)为单值单调增加(此为数字图像处理-冈萨雷斯-第二版中的表述),在第三版中有一些变化,具体的可以查阅此书的对应章节。
三、概率论的知识-随机变量的函数的分布
这一块涉及了概率论的知识-随机变量的函数的分布:
四、直方图均衡化的理论基础
五、离散形式的直方图均衡化
六、例子
---------------------------------------------------------------------------------------------------------------------------------
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分量