基于频谱信息的图像去噪与恢复——使用约束最小二乘方滤波法

      大家好,我是带我去滑雪!

      随着科学技术的不断发展,信息的交流和获取已不再受到时空的限制,已经成为人们日常生活中不可或缺的一部分。图像作为人类信息交流中的重要载体,起着不可替代的作用。频谱图像去噪复原方法是一种基于频域的图像处理技术,通过对图像的频谱进行分析和修复来实现去噪和复原。其基本原理是利用图像的频谱特性对噪声进行滤波或修复,然后通过逆变换将处理后的频谱转换回空域得到修复后的图像。在频域中,可以分析图像的频谱特性。频谱表示了图像中不同频率成分的能量分布情况。通过观察频谱,可以了解图像中的噪声和信号特征,从而有针对性地进行修复。根据噪声的特征,在频域中对图像的频谱进行滤波,可以设计相应的滤波器来减弱或去除噪声成分。常用的频域滤波方法包括低通滤波、高通滤波、带通滤波等,它们可以根据噪声频率范围选择适当的滤波器。

       本期使用约束最小二乘方滤波法对图像进行去噪还原,该方法基于最小二乘方准则,可以有效克服逆波算法的不稳定性,并在应用滤波过程中加入一些额外的约束条件,以改善噪声去除效果。下面开始python实战!

(1)导入相关模块

import cv2

import numpy as np

from PIL import Image

import matplotlib.pyplot as plt

(二)自定义约束最小二乘方滤波函数

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):

            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):

        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 getPuv(image):

        h, w = image.shape[:2]

        hPad, wPad = h - 3, w - 3

        pxy = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])

        pxyPad = np.pad(pxy, ((hPad//2, hPad - hPad//2), (wPad//2, wPad - wPad//2)), mode='constant')

        fftPuv = np.fft.fft2(pxyPad)

        return fftPuv

    def leastSquareFilter(image, PSF, eps, gamma=0.01):

        fftImg = np.fft.fft2(image)

        fftPSF = np.fft.fft2(PSF)

        conj = fftPSF.conj()

        fftPuv = getPuv(image)

        # absConj = np.abs(fftPSF) ** 2

        Huv = conj / (np.abs(fftPSF)**2 + gamma * (np.abs(fftPuv)**2))

        ifftImg = np.fft.ifft2(fftImg * Huv)

        ifftShift = np.abs(np.fft.fftshift(ifftImg))

        imgLSFilter = np.uint8(cv2.normalize(np.abs(ifftShift), None, 0, 255, cv2.NORM_MINMAX))

        return imgLSFilter

(3)导入需要去噪的图片和设置相应参数

    img = cv2.imread('Fig0526a.png',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) 

    imgLSFilter = leastSquareFilter(imgBlurNoisy, PSF, scale, gamma=0.01)

    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("least square filter"), plt.axis('off'), plt.imshow(imgLSFilter, '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)

    imgLSFilter = leastSquareFilter(imgBlurNoisy, PSF, scale, gamma=0.1)

    plt.subplot(234), plt.title("blurred image (dev=0.1)"), plt.axis('off'), plt.imshow(imgBlurNoisy, 'gray')

(4)保存图片

   plt.subplot(235), plt.title("Wiener filter"), plt.axis('off'), plt.imshow(imgWienerFilter, 'gray')

    plt.subplot(236), plt.title("least square filter"), plt.axis('off'), plt.imshow(imgLSFilter, 'gray')

    plt.tight_layout()

    plt.savefig("squares2.png",

            bbox_inches ="tight",

            pad_inches = 1,

            transparent = True,

            facecolor ="w",

            edgecolor ='w',

            dpi=300,

            orientation ='landscape')

输出结果:

dc9a895608b046538e2a5bdf55f73951.png


更多优质内容持续发布中,请移步主页查看。

若有问题可邮箱联系:1736732074@qq.com 

博主的WeChat:TCB1736732074

   点赞+关注,下次不迷路!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

带我去滑雪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值