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

news2024/11/25 3:03:13

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

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

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

输出结果:


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive【Hive(一)DDL】

前置准备 需要启动 Hadoop 集群,因为我们 Hive 是在 Hadoop 集群之上运行的。 从DataGrip 或者其他外部终端连接 Hive 需要先打开 Hive 的 metastore 进程和 hiveserver2 进程。 Hive DDL 数据定义语言 1、数据库(database) 创建数据库 c…

YOLOv8『小目标』检测指南

前言 目前博主课题组在进行物体部件的异常检测项目,项目中需要先使用 YOLOv8 进行目标检测,然后进行图像切割,最后采用 WinCLIP 模型 进行部件异常检测 但是在实际操作过程中出现问题, YOLOv8 模型目标检测在大目标精确度不错&a…

Vue的详细教程--入门

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Vue是什么 二. Vue的特点及优势 三.使用…

IT运维:利用数据分析平台采集Windows event log数据

概述 本文将介绍如何借助Winlogbeat和Vector在鸿鹄里采集Windows event log数据,使技术人员能够在鸿鹄里更便捷和高效地分析Windows event log数据。 操作步骤 Winlogbeat是一个开源的日志数据采集器,专门用于采集Windows操作系统中的event log数据。它可…

【JAVA数据结构】包装类与认识泛型

作者主页:paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精…

解决 Cannot read property ‘key‘ of undefined

目录 问题解决1解决2最终 问题 现场环境分页查询某些条件项查询时,分页接口获取成功但是数据不渲染,页面像是卡住了: 报错 Cannot read property key of undefined 解决1 有人说 使用的el-pagination在格式化代码的时候layout属性的参数会多加…

vue基础知识十一:Vue组件之间的通信方式都有哪些?

一、组件间通信的概念 开始之前,我们把组件间通信这个词进行拆分 组件通信 都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,…

Gin 框架 解决 跨域问题

Gin 框架解决跨域问题 一点废话 在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的,然后又刚好会一点点 go,就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json 。 这是我的go代码…

堡垒机的相关介绍

描述 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时处理及审…

javafx学习记录

1.布局 2.选择重写或实现方法(select methods to override/implements) ctrl o 3.javafx有init方法,start方法,stop方法 4.定义一个按钮,使用系统默认浏览器访问网站 5.使窗口的关闭栏,缩小扩屏栏,代码是倒数第二行 6.设置模态窗口,默认关闭模态的 下…

Leetcode 剑指Offer

求 12...n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 示例 1: 输入: n 3 输出: 6示例 2: 输入: n 9 输出: 45 一、信息 1.求一个等差数列的求和 2.要求不能使…

dubbo3 遇坑小结

最近给一个dubbo3的应用改名字,发现消费者还是会请求以前的地址。 问题现象 应用部署是k8s容器环境,dubbo版本是3.1.1,应用appA名字改成appB。改完名发现消费者应用appC请求还是会往以前的地址请求(当然是请求不通的) 问题分析 分析日志 d…

算法|Day52 单调栈3

LeetCode 84.柱状图中最大的矩形 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状…

【LeetCode-简单题 KMP匹配算法】28. 找出字符串中第一个匹配项的下标

文章目录 题目方法一:常规做法 一次一次截取再做比较方法二:KMP匹配算法 题目 方法一:常规做法 一次一次截取再做比较 class Solution {public int strStr(String haystack, String needle) {int haylen haystack.length();int neelen need…

【二叉树】的顺序存储(堆的实现)

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

【学习笔记】各类基于决策单调性的dp优化

文章目录 对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类 与图形相结合 决策单调性的常见优化手段二分队列二分栈分治类莫队做法 SMAWKWQS二分WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分…

老挝市场最全开发攻略

本文目录: 1.老挝国家概况 2.老挝节日与禁忌 3.老挝贸易现状与特点 4.老挝热销品类 5.老挝开发渠道 6.老挝注意事项 7.老挝国家冷知识 一、老挝国家概况 老挝人民民主共和国(The Lao People’s Democratic Republic),简称…

基于python求两个数最大公约数函数gcd

一、gcd函数 在Python中,可以使用math模块中的gcd()函数来求两个数的最大公约数。首先需要导入math模块,然后使用gcd()函数来计算最大公约数。 二、示例 以下是使用Python求两个数最大公约数的示例代码: import math # 定义两个数 a 36 …

20230916后台面经整理

1.面对抢优惠券这样的高负载场景,你从架构、负载均衡等方面说一下你的设计? 答了参考Nginx进行负载均衡,然后在每台服务器怎么怎么弄(架构每一层怎么设计) 参考https://toutiao.io/posts/6z3uu2m/preview,h…

go 1.18新特性(泛性 模糊测试 WorkSpace)

文章目录 泛型interface的功能扩展泛型使用 模糊测试模糊测试的使用模糊测试的缺点 Go WorkSpace 泛型 interface的功能扩展 在1.18之前,官方对interface的定义是方法的集合,可以存储实现该方法的任意类型。1.18对interface的定义改为类型集合。接口类…