直方图均衡化
Posted 小龙呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直方图均衡化相关的知识,希望对你有一定的参考价值。
步骤:
(1)统计原始图象的直方图:
p
r
(
r
k
)
=
n
k
n
p_r (r_k)=\\fracn_kn
pr(rk)=nnk
r
k
是输入图象灰度级
r_k是输入图象灰度级
rk是输入图象灰度级
(2)计算直方图累积分布曲线:
s
k
=
T
(
r
k
)
=
∑
j
=
0
k
p
r
(
r
j
)
=
∑
j
=
0
k
n
j
n
s_k=T(r_k)=\\sum_j=0^k p_r(r_j)=\\sum_j=0^k \\fracn_jn
sk=T(rk)=j=0∑kpr(rj)=j=0∑knnj
(3)用累积分布函数作变换函数计算图像变换后的灰度级:
扩展取整:
S
(
k
)
=
i
n
t
[
(
m
a
x
(
r
k
)
−
m
i
n
(
r
k
)
⋅
s
k
+
0.5
]
扩展取整:S(k)=int[(max(r_k)-min(r_k)\\cdot s_k + 0.5]
扩展取整:S(k)=int[(max(rk)−min(rk)⋅sk+0.5]
(4)建立输入图像与输出图像灰度级之间的对应关系,变换后灰度级范围应该和原来的范围一致。
例子:
程序实现
import cv2
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读入图像
img1 = cv2.imread('afterglow.jpeg', 0)
img2 = img1.copy()
gray_level = add_histogram = np.zeros(256) #存放灰度值个数以及累计直方图
# 统计灰度值(0-255)的个数
for i in range(1080):
for j in range(1418):
gray_level[img1[i, j]] += 1
# 灰度直方图
gray_histogram = gray_level / (1080*1418)
# 累计直方图
for u in range(256):
a = 0
for v in range(u+1):
a += gray_histogram[v]
add_histogram[u] = a
# 取整扩展
for k in range(256):
add_histogram[k] = int(255*add_histogram[k] + 0.5)
# 确定映射
map = pd.Series(add_histogram, np.arange(256))
# 直方图均衡化
for o in range(1080):
for p in range(1418):
if img2[o, p] in map.index:
img2[o, p] = map[img2[o, p]]
# 显示图像
plt.figure(figsize=(10,4),dpi=120)
plt.subplot(221),plt.imshow(img1, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(222),plt.imshow(img2, cmap = 'gray')
plt.title('histogram equalization'), plt.axis('off')
# 直方图显示
plt.subplot(223),plt.hist(img1.ravel(), bins=256)
plt.subplot(224),plt.hist(img2.ravel(), bins=256)
plt.show()
本文代码已开源,欢迎大家进行二次开发:
https://gitee.com/xiaolong_ROS/Graphics-Processing-and-Machine-Vision
如有错误或者不足之处,欢迎大家留言指正!
以上是关于直方图均衡化的主要内容,如果未能解决你的问题,请参考以下文章
跟我学Python丨图像增强及运算:局部直方图均衡化和自动色彩均衡化处理
跟我学Python丨图像增强及运算:局部直方图均衡化和自动色彩均衡化处理