提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
上一章中,我们讨论了局部直方图均衡化,这对于增强图像的局部细节非常有用,这一节我们将一个效果更好的局部增强方式,直方图统计量增强。直方图统计量增强,是基于直方图的统计量信息(如均值和方差)对图像的灰度和对比度进行调整。直方图统计量不仅用于图像的全局增强,在图像局部增强中更加有效。
1. 原理说明
直方图统计量局部增强的公式如下:
g
(
x
,
y
)
=
{
C
f
(
x
,
y
)
条件成立
f
(
x
,
y
)
条件不成立
g(x,y) = \begin{cases} Cf(x,y) & 条件成立\\ f(x,y) & 条件不成立 \\ \end{cases}
g(x,y)={Cf(x,y)f(x,y)条件成立条件不成立
条件:
(
k
0
∗
m
G
<
=
m
R
<
=
k
1
∗
m
G
)
a
n
d
(
k
2
∗
σ
G
<
=
σ
R
<
=
k
3
∗
σ
G
)
条件:(k_0*m_G <= m_R <= k_1*m_G) and (k_2*\sigma_G <=\sigma_R<=k_3*\sigma_G)
条件:(k0∗mG<=mR<=k1∗mG)and(k2∗σG<=σR<=k3∗σG)
其中:
k
0
,
k
1
,
k
2
,
k
3
,
C
是常数
m
G
,
σ
G
是全局均值和全局方差
m
R
,
σ
R
是局部均值和局部方差
其中:\\ k_0,k_1,k_2,k_3,C是常数 \\ m_G,\sigma_G是全局均值和全局方差 \\ m_R,\sigma_R是局部均值和局部方差
其中:k0,k1,k2,k3,C是常数mG,σG是全局均值和全局方差mR,σR是局部均值和局部方差
说明:
- 遍历图像的像素点,计算像素邻域的局部均值和局部方差,配合参数判断是否需要增强。
- 局部均值和方差是根据像素邻域特征进行灰度调整的基础。像素邻域的局部均值是平均灰度的测度,局部方差是对比度的测度。使用局部均值和方差可以开发出简单而强大的图像局部增强算法。
2. 案例展示
2.1 代码
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
def localHistogramStatisticsEnhancer(img, kernelSize):
"""
局部直方图统计量增强
:param img: 输入图像
:param kernelSize: 邻域的大小
:return: 输出图像
"""
dst = np.copy(img)
# 图像尺寸
rows, cols = img.shape[:2]
# 先准备参数,公式的参数,不明白什么意思可以去看书
k0, k1, k2, k3, C = 0, 0.25, 0, 0.1, 20
# 填充边界,以避免边界效应
padSize = kernelSize // 2
paddedImg = cv.copyMakeBorder(img, padSize, padSize, padSize, padSize, cv.BORDER_REFLECT)
# 计算全局平均值和全局标准差
mean_G = np.mean(paddedImg)
std_G = np.std(paddedImg)
for row in range(rows):
for col in range(cols):
region = paddedImg[row:row + kernelSize, col:col + kernelSize]
# 计算局部均值和标准差
mean_R = np.mean(region)
std_R = np.std(region)
# 判断是否进行局部增强,下面公式看不懂可以看书去
if (k0 * mean_G <= mean_R <= k1 * mean_G) and (k2 * std_G <= std_R <= k3 * std_G):
dst[row][col] = C * img[row][col]
return dst
if __name__ == '__main__':
img = cv.imread('Image/Fig0406.tif')
dst = localHistogramStatisticsEnhancer(img, 15)
# 显示图像
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(11, 6))
plt.subplot(121)
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.axis('off')
plt.title('Original Image')
plt.subplot(122)
plt.imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
plt.axis('off')
plt.title('直方图统计量增强')
plt.tight_layout()
plt.savefig('Image/tmp.png', transparent=True)
plt.show()
2.2 效果图

可以看出直方图统计量增强对局部细节的增效果非常好
1463



被折叠的 条评论
为什么被折叠?



