原理重述
逆谐波均值滤波器是一种数字图像处理中的滤波器类型,用于去除图像中的噪声或增强图像特定区域的特征。它结合了谐波均值滤波器和逆谐波滤波器的特性。
逆谐波均值滤波器通常用于处理椒盐噪声(Salt-and-Pepper Noise),这种噪声会在图像中随机出现黑白像素点,降低图像质量。这种滤波器采用了两个参数:Q和r。Q代表滤波器的阶数,r代表滤波器的半径。算法基于公式1:
其中,I(x,y) 代表图像中的像素值,S代表以当前像素为中心的滤波器窗口,计算窗口内像素值的 Q 阶次方和。当Q为正数时,逆谐波均值滤波器能够有效去除椒盐噪声,尤其是在噪声像素值明显偏离图像周围像素值时。然而,Q的取值需要谨慎选择,因为过大的Q可能导致滤波器对图像细节的损失。同时,Q为负数时,逆谐波均值滤波器可以增强图像中的边缘信息
实现要求
具体理论知识可参考冈萨雷斯数字图像处理这本书的相关内容。编写python代码,输出如下图所示的结果
注意:
结果显示了分别添加概率为0.1的胡椒和盐粒噪声后的图像及分别用3×3,Q=1.5和-1.5的逆谐波均值滤波器对图像处理后的结果。添加噪声可以用上个实验介绍的skimage.util.random_noise函数完成,逆谐波均值滤波器的公式见公式1。注意观察Q的符号选错时的结果,Q>0适用于胡椒噪声,Q<0适用于盐粒噪声。
在这里插入代import cv2
import numpy as np
import matplotlib.pyplot as plt
def salt(img,n):
for k in range(n):
i = int(np.random.random() * img.shape[1]);
j = int(np.random.random() * img.shape[0]);
if img.ndim == 2:
img[j, i] = 255
elif img.ndim == 3:
img[j, i, 0] = 255
img[j, i, 1] = 255
img[j, i, 2] = 255
return img
img = cv2.imread("D://Fig0507.tif", 0)
result = salt(img, 50000) # 加入椒盐噪声
noise = cv2.medianBlur(result, 5)
# 逆谐波均值滤波均值滤波器:
def HT_mean(img, kernel_size, Q):
G_mean_img = np.zeros(img.shape)
k = int((kernel_size - 1) / 2)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if i < k or i > (img.shape[0] - k - 1) or j < k or j > (img.shape[1] - k - 1):
G_mean_img[i][j] = img[i][j]
else:
result_top = 0
result_down = 0
for n in range(kernel_size):
for m in range(kernel_size):
if Q > 0:
result_top += pow(np.float(img[i - k + n][j - k + m]), Q + 1)
result_down += pow(np.float(img[i - k + n][j - k + m]), Q)
else:
if img[i - k + n][j - k + m] == 0:
G_mean_img[i][j] = 0
break
else:
result_top += pow(np.float(img[i - k + n][j - k + m]), Q + 1)
result_down += pow(np.float(img[i - k + n][j - k + m]), Q)
else:
continue
break
else:
if result_down != 0:
G_mean_img[i][j] = result_top / result_down
G_mean_img = np.uint8(G_mean_img)
return G_mean_img
if __name__ == "__main__":
img = cv2.imread('Fig0507.tif', 0)
G_mean_img_1 = HT_mean(img, kernel_size=3, Q=-1.5)
G_mean_img_2 = HT_mean(img, kernel_size=3, Q=1.5)
G_mean_img_3 = HT_mean(img, kernel_size=3, Q=0)
print(G_mean_img_1.max())
print("test_end")
plt.subplot(2, 2, 1), plt.imshow(G_mean_img_1 , 'gray') # 默认彩色,另一种彩色bgr
plt.subplot(2, 2, 3), plt.imshow(G_mean_img_2, 'gray')
plt.subplot(2, 2, 4), plt.imshow(G_mean_img_3, 'gray')
plt.subplot(2, 2, 2), plt.imshow(noise, 'gray')
plt.show()
运行结果
总结:
逆谐波均值滤波器是一种有用的图像处理工具,但在应用时需要根据具体情况调整参数,以达到最佳的图像处理效果。