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


          大家好,我是带我去滑雪

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

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

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

  • 相关阅读:
    Krylov matrix
    贝恩解密NFT区块链游戏和收藏品市场
    Vue的模板语法(下)
    语言模型和编解码模型
    Leetcode143. 重排链表
    顺序表基本操作-查找
    OCC教学:拓扑
    【Hugging Face】如何下载模型文件
    visionTransformer window平台下报错
    吗西香豆素,CAS号:17692-56-7
  • 原文地址:https://blog.csdn.net/qq_45856698/article/details/132921142