逆谐波均值滤波器的python代码实现

原理重述

逆谐波均值滤波器是一种数字图像处理中的滤波器类型,用于去除图像中的噪声或增强图像特定区域的特征。它结合了谐波均值滤波器和逆谐波滤波器的特性。

逆谐波均值滤波器通常用于处理椒盐噪声(Salt-and-Pepper Noise),这种噪声会在图像中随机出现黑白像素点,降低图像质量。这种滤波器采用了两个参数:Q和r。Q代表滤波器的阶数,r代表滤波器的半径。算法基于公式1:
图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()


运行结果

在这里插入图片描述

总结:

逆谐波均值滤波器是一种有用的图像处理工具,但在应用时需要根据具体情况调整参数,以达到最佳的图像处理效果。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值