一文搞懂直方图均衡

直方图均衡

定义

根据维基百科上的定义, 直方图均衡(Histogram Equalization)是图像处理领域中利用直方图对对比度进行调整的方法.

顾名思义, 直方图均衡是将直方图的分布(概率密度)调整为均匀分布.

为什么要做直方图均衡

根据信息论, 信息的熵越大, 包含的信息也就越多, 熵的计算公式如下:

H = − ∑ i = 0 n p ( x i ) l o g 2 ( p ( x i ) ) (1) H=-\sum_{i=0}^{n}p(x_i)log_2(p(x_i)) \tag{1} H=i=0np(xi)log2(p(xi))(1)

只有当 p ( x i ) p(x_i) p(xi)​ 均匀分布时, 熵的值最大. 对应到图像上, 当图像直方图均匀分布时, 图像对比度最大. 如下图所示:

蓝色为原始图像直方图, 绿色为均衡后直方图, 对应的处理后的图像为:

可以看到, 直方图均衡处理后, 图像变得更加清晰了.

怎么做直方图均衡

知道了为什么, 就要知道怎么做. 一般直方图均值有以下几个步骤:

  1. 统计图像的直方图, 归一化到[0,1]

p r ( r k ) = n k H ∗ W , k = 0 , 1 , 2 , ⋅ , L − 1 (2) p_r(r_k)=\frac{n_k}{H*W}, k=0,1,2,\cdot,L-1 \tag{2} pr(rk)=HWnk,k=0,1,2,,L1(2)

  1. 计算映射函数

s k = T ( r k ) = ( L − 1 ) ∑ j = 0 k p r ( r j ) (3) s_k=T(r_k)=(L-1)\sum_{j=0}^{k}p_r(r_j) \tag{3} sk=T(rk)=(L1)j=0kpr(rj)(3)

式中, H H H, W W W 分别为图像的高和宽, n k n_k nk 表示灰度值为 r k r_k rk 的像素的个数, s k s_k sk 为变换后的灰度值, T ( r k ) T(r_k) T(rk) 为映射函数, 计算过程使用了累计直方图.

  1. 利用得到的映射函数, 对图像进行处理
  2. 对于RGB图像, 可以转到HSV空间, 对V通道进行均衡后, 转回RGB空间, 如下图所示结果:

为什么可以这么做

知道怎么做了, 就要知道为什么可以这么做. 这里解释下为啥可以这么做, 即公式(3)是怎么得到的.

设原始直方图分为为
p r ( r k ) p_r(r_k) pr(rk)

均衡化后的直方图分布为
p s ( s k ) = 1 L − 1 (4) p_s(s_k)=\frac{1}{L-1} \tag{4} ps(sk)=L11(4)

映射函数为
s k = T ( r k ) s_k=T(r_k) sk=T(rk)

这里映射函数必须为单调递增函数, 满足:

∫ 0 s k p s ( s ) d s = ∫ 0 r k p r ( r ) d r (5) \int_0^{s_k}p_s(s)ds=\int_0^{r_k}p_r(r)dr \tag{5} 0skps(s)ds=0rkpr(r)dr(5)

即对应区域间内像素点的总数是一样的, 如下图红色区域所示:

将公式(4)代入公式(5), 则有:

s k L − 1 = ∫ 0 r k p r ( r ) d r \frac{s_k}{L-1}=\int_0^{r_k}p_r(r)dr L1sk=0rkpr(r)dr

因而, 可以得到:

s k = ( L − 1 ) ∫ 0 r k p r ( r ) d r (6) s_k=(L-1)\int_0^{r_k}p_r(r)dr \tag{6} sk=(L1)0rkpr(r)dr(6)

对应的离散形式为公式(3).

存在问题

  1. 如果映射函数为公式(6), 为连续形式, 这种映射是可逆的, 但更改为离散形式, 公式(3)后, 变成了不可逆的.
  2. 映射变换会丢失信息, 对出现比例很少的灰度进行合并, 从而会丢失部分细节.
  3. 对于占比例较多的灰度, 则会将其拉伸, 而导致其占据了更多的灰度, 压缩了其他灰度.

改进

直方图均衡过度的强调了灰度个数的重要性, 对数量多的灰度过度的进行了增强, 而图像中, 比例比不是很多的灰度往往更重要, 因而改进的方向就是减少数量多的灰度的影响, 我这里想到的有 3 种方法:

  1. 对直方图开根号, 减少数量多灰度的影响;
  2. 对直方图进行截断, 超过部分数量直接去除, 从而减小数量多灰度的影响;
  3. 在第2种方法的基础上, 将超出部分均匀的加到直方图的每个bin上(该想法来源于CLAHE);

这3种方法的映射关系曲线如下所示:

从图中可以看到, 原始的直方图均衡后图像最亮, 如下所示为几种方法的结果对比, 依次为原图, 原始直方图, 改进0, 改进1, 改进2:

可以看到, 直方图可以改善图像整体的质量, 但对于某些局部图像, 则由于直方图的性质导致过亮或者过暗.

小结

这里总结下直方图均衡化的优缺点:

  1. 直方图均衡化算法简单, 速度快;
  2. 可以改善图像整体质量;
  3. 但对于图像局部质量改善效果不是很好;

参考

  1. https://zhuanlan.zhihu.com/p/44918476
  2. https://zhuanlan.zhihu.com/p/78017679
  3. https://zhuanlan.zhihu.com/p/37168516
  4. https://zh.wikipedia.org/wiki/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96
  5. https://blog.csdn.net/yanhe156/article/details/83083659
  • 24
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
CAN(Controller Area Network,控制器局域网)总线协议是一种广泛应用于工业自动化、汽车电子等领域的串行通讯协议。其帧格式如下: <img src="https://img-blog.csdnimg.cn/20200925125252655.png" width="400"> CAN总线协议的帧分为标准帧和扩展帧两种,其中标准帧包含11位标识符,扩展帧包含29位标识符。在CAN总线上,所有节点都可以同时发送和接收数据,因此需要在帧中包含发送方和接收方的信息。 帧格式的具体解释如下: 1. 帧起始符(SOF):一个固定的位模式,表示帧的起始。 2. 报文控制(CTRL):包含几个控制位,如IDE、RTR等。其中IDE表示标识符的类型,0表示标准帧,1表示扩展帧;RTR表示远程请求帧,0表示数据帧,1表示远程请求帧。 3. 标识符(ID):11位或29位的标识符,用于区分不同的CAN消息。 4. 控制域(CTL):包含几个控制位,如DLC、EDL等。其中DLC表示数据长度,即数据域的字节数;EDL表示数据长度是否扩展,0表示标准数据帧,1表示扩展数据帧。 5. 数据域(DATA):0~8字节的数据。 6. CRC:用于校验数据是否正确。 7. 确认位(ACK):由接收方发送的确认信息,表示数据是否正确接收。 8. 结束符(EOF):一个固定的位模式,表示帧的结束。 以上就是CAN总线协议的帧格式。在实际应用中,节点之间通过CAN总线进行数据交换,通过解析帧中的各个字段,可以判断消息的发送方、接收方、数据内容等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yfor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值