【OpenCV 例程 300 篇】109. 几何均值滤波

该博客介绍了图像复原的概念,特别是通过几何均值滤波和维纳滤波来改善退化图像的质量。通过实例展示了如何使用OpenCV实现这些滤波方法,包括运动模糊图像的生成、高斯噪声的添加以及滤波器的应用。最终,对比了不同噪声水平下两种滤波器的效果。
摘要由CSDN通过智能技术生成

专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』

【第 7 章:图像复原与重建】
106. 退化图像的逆滤波
107. 退化图像的维纳滤波
108. 约束最小二乘方滤波
109. 几何均值滤波


【youcans 的 OpenCV 例程 300 篇】109. 几何均值滤波


6. 退化图像复原

图像复原是对图像退化的过程进行估计,并补偿退化过程造成的失真,以便获得未经退化的原始图像或原始图像的最优估值,从而改善图像质量的一种方法。

典型的图像复原方法是根据图像退化的先验知识建立退化模型,以退化模型为基础采用滤波等手段进行处理,使复原后的图像符合一定的准则,达到改善图像质量的目的。

因此,图像复原是沿着质量降低的逆过程来重现真实的原始图像,通过去模糊函数而去除图像模糊。


6.4 几何均值滤波

几何均值滤波器是维纳滤波的推广,其传递函数由括号内幂次分别为 α \alpha α 1 − α 1-\alpha 1α 的两个表达式组成:
F ^ ( u , v ) = [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 ] α   [ H ∗ ( u , v ) ∣ H ( u , v ) ∣ 2 + β [ S η ( u , v ) / S f ( u , v ) ] ] 1 − α   G ( u , v ) \hat{F}(u,v) = \Bigg[ \frac{H^*(u,v)}{|H(u,v)|^2} \Bigg] ^{\alpha} \ \Bigg[\frac{H^*(u,v)}{|H(u,v)|^2 + \beta [S_{\eta} (u,v) /S_f(u,v)]}\Bigg]^{1-\alpha}\ G(u,v) F^(u,v)=[H(u,v)2H(u,v)]α [H(u,v)2+β[Sη(u,v)/Sf(u,v)]H(u,v)]1α G(u,v)
式中,$ \alpha$ 和 β \beta β 是非负的实常数。

α = 1 / 2 \alpha=1/2 α=1/2 时几何均值滤波器是幂次相同的两个量的乘积,这就是几何均值的含义。

α = 1 / 2 , β = 1 \alpha=1 / 2, \beta=1 α=1/2,β=1 时,称为频谱均衡滤波器。当 α = 1 \alpha=1 α=1 时,简化为逆滤波器;当 α = 0 \alpha=0 α=0 时,简化为带参数的维纳滤波器,并在 β = 1 \beta=1 β=1 时成为标准维纳滤波器。


例程 9.22: 几何均值滤波

    # 9.22: 几何均值滤波器
    def getMotionDsf(shape, angle, dist):
        xCenter = (shape[0] - 1) / 2
        yCenter = (shape[1] - 1) / 2
        sinVal = np.sin(angle * np.pi / 180)
        cosVal = np.cos(angle * np.pi / 180)
        PSF = np.zeros(shape)  # 点扩散函数
        for i in range(dist):  # 将对应角度上motion_dis个点置成1
            xOffset = round(sinVal * i)
            yOffset = round(cosVal * i)
            PSF[int(xCenter - xOffset), int(yCenter + yOffset)] = 1
        return PSF / PSF.sum()  # 归一化

    def makeBlurred(image, PSF, eps):  # 对图片进行运动模糊
        fftImg = np.fft.fft2(image)  # 进行二维数组的傅里叶变换
        fftPSF = np.fft.fft2(PSF) + eps
        fftBlur = np.fft.ifft2(fftImg * fftPSF)
        fftBlur = np.abs(np.fft.fftshift(fftBlur))
        return fftBlur

    def wienerFilter(input, PSF, eps, K=0.01):  # 维纳滤波,K=0.01
        fftImg = np.fft.fft2(input)
        fftPSF = np.fft.fft2(PSF) + eps
        fftWiener = np.conj(fftPSF) / (np.abs(fftPSF)**2 + K)
        imgWienerFilter = np.fft.ifft2(fftImg * fftWiener)
        imgWienerFilter = np.abs(np.fft.fftshift(imgWienerFilter))
        return imgWienerFilter

    def geometricMeanFilter(image, PSF, eps, K=1, alpha=1, beta=1):  # 几何均值滤波器
        fftImg = np.fft.fft2(image)
        fftPSF = np.fft.fft2(PSF)
        conj = fftPSF.conj()
        squarePSF = (fftPSF * conj).real
        Huv = np.power(conj / (squarePSF), alpha) * np.power(conj / (squarePSF + beta * K), 1-alpha)
        ifftImg = np.fft.ifft2(fftImg * Huv)
        ifftShift = np.abs(np.fft.fftshift(ifftImg))
        imgGMFilter = np.uint8(cv2.normalize(np.abs(ifftShift), None, 0, 255, cv2.NORM_MINMAX))  # 归一化为 [0,255]
        return imgGMFilter


    # # 读取原始图像
    img = cv2.imread("../images/Fig0526a.tif", 0)  # flags=0 读取为灰度图像
    hImg, wImg = img.shape[:2]

    # 带有噪声的运动模糊
    PSF = getMotionDsf((hImg, wImg), 45, 100)  # 运动模糊函数
    imgBlurred = np.abs(makeBlurred(img, PSF, 1e-6))  # 生成不含噪声的运动模糊图像

    scale = 0.01  # 噪声方差
    noisy = imgBlurred.std() * np.random.normal(loc=0.0, scale=scale, size=imgBlurred.shape)  # 添加高斯噪声
    imgBlurNoisy = imgBlurred + noisy  # 带有噪声的运动模糊
    imgWienerFilter = wienerFilter(imgBlurNoisy, PSF, scale, K=0.01)  # 对含有噪声的模糊图像进行维纳滤波
    imgGMFilter = geometricMeanFilter(imgBlurNoisy, PSF, scale, K=0.01, alpha=0.5, beta=1)  # 约束最小二乘方滤波

    plt.figure(figsize=(9, 7))
    plt.subplot(231), plt.title("blurred image (dev=0.01)"), plt.axis('off'), plt.imshow(imgBlurNoisy, 'gray')
    plt.subplot(232), plt.title("Wiener filter"), plt.axis('off'), plt.imshow(imgWienerFilter, 'gray')
    plt.subplot(233), plt.title("geometric mean filter"), plt.axis('off'), plt.imshow(imgGMFilter, 'gray')

    scale = 0.1  # 噪声方差
    noisy = imgBlurred.std() * np.random.normal(loc=0.0, scale=scale, size=imgBlurred.shape)  # 添加高斯噪声
    imgBlurNoisy = imgBlurred + noisy  # 带有噪声的运动模糊
    imgWienerFilter = wienerFilter(imgBlurNoisy, PSF, scale, K=0.01)  # 维纳滤波
    imgGMFilter = geometricMeanFilter(imgBlurNoisy, PSF, scale, K=0.01, alpha=0, beta=1)  # 约束最小二乘方滤波

    plt.subplot(234), plt.title("blurred image (dev=0.1)"), plt.axis('off'), plt.imshow(imgBlurNoisy, 'gray')
    plt.subplot(235), plt.title("Wiener filter"), plt.axis('off'), plt.imshow(imgWienerFilter, 'gray')
    plt.subplot(236), plt.title("geometric mean filter"), plt.axis('off'), plt.imshow(imgGMFilter, 'gray')
    plt.tight_layout()
    plt.show()

在这里插入图片描述


(本节完)


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123063149)
Copyright 2022 youcans, XUPT
Crated:2022-2-22


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

youcans_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值