数字图像处理(3)——频域图像增强

🔥博客主页:是dream

🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发

💘每日语录:贤才,难进易出;庸才,易进易初出;奴才,易进难出。

🎉感谢大家点赞👍收藏⭐指正✍️

 

 

一、实验内容

(1)傅里叶变换

        实验内容:分别使用OpenCV和Numpy工具包中的函数进行傅里叶变换,要求显示图像移中后的幅值谱和相位谱,以及重构后的图像。结果展示部分应包含原图、幅值谱、相位谱、重构图像。

(2)图像加噪和频域滤波

        实验内容:先给图像添加高斯噪声(0均值,0.1方差),再使用理想低通滤波器对图像进行低通平滑滤波,分析不同截止频率的滤波性能。结果展示部分应包括原图、噪声图、频域噪声图幅值谱、滤波后幅值谱、滤波后相位谱、重构图像等。

二、实验环境

        PaddlePaddle 2.3.2,Python==3.7,Numpy,Cv2,Matplotlib,RAM 8GB

三、实验过程

(1)傅里叶变换思路

        首先添加高斯噪声到原始图像。可以使用均值为0和方差为0.1的高斯噪声。进行傅里叶变换,然后计算频域幅值谱和相位谱。设计不同截止频率的理想低通滤波器。可以尝试不同的截止频率值,如r1、r2、r3等。对频域图像进行滤波,将低频部分保留,高频部分丢弃,以实现低通滤波。计算滤波后的频域幅值谱。进行傅里叶逆变换,以重构滤波后的图像。显示一组图像,包括原始图像、噪声图像、频域噪声图幅值谱、不同截止频率下的滤波后幅值谱、滤波后相位谱、重构图像。

        代码实现如下:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties# 1. 读取图像
img = cv.imread('./work/img/paopao.jpg', 0)# 2. 傅里叶变换
# 2.1 正变换
f_transform = np.fft.fft2(img)# 2.2 频谱中心化
f_transform_shifted = np.fft.fftshift(f_transform)# 2.3 计算频谱和相位谱
# 直角坐标转换为极坐标: cv.cartToPolar()函数
magnitude_spectrum, phase_spectrum = cv.cartToPolar(f_transform_shifted.real, f_transform_shifted.imag)# 3. 傅里叶逆变换
# 3.1 反变换
f_transform_unshifted = np.fft.ifftshift(f_transform_shifted)
reconstructed_image = np.fft.ifft2(f_transform_unshifted)# 3.2 计算灰度值
reconstructed_image = np.abs(reconstructed_image).astype(np.uint8)# 4. 图像显示
font = FontProperties(fname="SimHei.ttf")  # 使用系统中的SimHei字体plt.subplot(2, 3, 1), plt.imshow(img, cmap='gray')
plt.title('原始图像', fontproperties=font)plt.subplot(2, 3, 2), plt.imshow(np.log(magnitude_spectrum), cmap='gray')
plt.title('幅值谱', fontproperties=font)plt.subplot(2, 3, 3), plt.imshow(phase_spectrum, cmap='gray')
plt.title('相位谱', fontproperties=font)plt.subplot(2, 3, 4), plt.imshow(reconstructed_image, cmap='gray')
plt.title('重构图像', fontproperties=font)plt.show()

        实验结果: 

(2)图像加噪和频域滤波思路

        首先,读取原始图像,然后添加高斯噪声以模拟实际图像的噪声情况。接下来,进行傅里叶变换,将图像转换到频域,分析其幅值谱和相位谱。然后,设计理想低通滤波器,并应用不同截止频率进行滤波,以比较滤波性能。最后,进行傅里叶逆变换以重构图像。实验结果以一组图像形式呈现,包括原始图像、噪声图、频域噪声图幅值谱、不同截止频率下的滤波后幅值谱、滤波后相位谱以及重构图像,以清晰展示频域滤波在去除噪声和恢复图像方面的效果。

        代码实现:

import cv2
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="SimHei.ttf")
# 1. 读取图像
img = cv2.imread('./work/img/paopao.jpg',0)# 2. 添加高斯噪声
def addGaussianNoise(image, mean=0, var=0.1):row, col = image.shapesigma = var ** 0.5gauss = np.random.normal(mean, sigma, (row, col))noisy = image + gaussnoisy = np.clip(noisy, 0, 255)noisy = noisy.astype(np.uint8)return noisyimg_noisy = addGaussianNoise(img)# 3. 傅里叶变换
f_transform = np.fft.fft2(img_noisy)
fshift = np.fft.fftshift(f_transform)# 4. 计算幅值谱
magnitude_spectrum0 = 20 * np.log(1 + np.abs(fshift))# 5. 理想低通滤波
r = 20  # 截止频率的设置
[m, n] = fshift.shape
H = np.zeros((m, n), dtype=complex)  # 滤波核
for i in range(m):for j in range(n):d = np.sqrt((i - m/2)**2 + (j - n/2)**2)if d < r:H[i, j] = 1G = fshift * H  # 理想低通滤波
magnitude_spectrum1 = 20 * np.log(1 + np.abs(G))# 6. 傅里叶逆变换
f1 = np.fft.ifftshift(G)
img_reconstructed = np.abs(np.fft.ifft2(f1)).astype(np.uint8)# 7. 图像显示
plt.subplot(2, 3, 1), plt.imshow(img, cmap='gray')
plt.title('原始图像', fontproperties=font)plt.subplot(2, 3, 2), plt.imshow(img_noisy, cmap='gray')
plt.title('噪声', fontproperties=font)plt.subplot(2, 3, 3), plt.imshow(magnitude_spectrum0, cmap='gray')
plt.title('频域噪声图', fontproperties=font)plt.subplot(2, 3, 4), plt.imshow(magnitude_spectrum1, cmap='gray')
plt.title('滤波后的幅值谱', fontproperties=font)plt.subplot(2, 3, 5), plt.imshow(np.angle(fshift), cmap='gray')
plt.title('频谱(有噪声)', fontproperties=font)plt.subplot(2, 3, 6), plt.imshow(img_reconstructed, cmap='gray')
plt.title('最终图像', fontproperties=font)plt.show()

        实验结果: 

四、实验心得 

        在本次实验中,首先读取一张原始图像并添加高斯噪声,以模拟实际噪声情况。然后,进行了傅里叶变换,计算了频域的幅值谱和相位谱。接下来,设计不同截止频率的理想低通滤波器,以控制滤波的效果,并对频域图像进行滤波,保留了低频部分,丢弃高频部分,实现低通滤波。尝试不同的截止频率值以观察滤波性能的变化。然后,计算滤波后的频域幅值谱。最后,进行傅里叶逆变换以重构滤波后的图像,并将一组图像显示出来,包括原始图像、噪声图像、频域噪声图幅值谱、不同截止频率下的滤波后幅值谱、滤波后相位谱、重构图像。

        然后就是如何给图像添加高斯噪声,这是一个常见的图像处理问题。接着使用傅里叶变换技术将图像从空间域转换到频域,以便进行频域滤波操作。通过理想低通滤波器,能够控制截止频率,从而实现不同程度的频域平滑滤波。这对于去除高频噪声或细节以及实现图像平滑非常有用。通过调整截止频率,可以观察到不同滤波效果,这对于理解滤波器设计的重要性非常有帮助。此外,接着就是进行傅里叶逆变换,将滤波后的频域图像恢复到空间域,得到重构图像。这样可以比较原始图像和滤波后的图像,从而评估滤波的效果。 

 

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

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

相关文章

Character Controller Smooth

流畅的角色控制器 Unity的FPS解决方案&#xff01; 它是一种具有非常平滑运动和多种设置的解决方案&#xff1a; - 移动和跳跃 - 坐的能力 - 侧翻角度 - 不平整表面的处理 - 惯性守恒 - 重力 - 与物理物体的碰撞。 - 支持没有家长控制的平台 此解决方案适用于那些需要角色控制器…

Jmeter的安装与快速使用(做并发测试)

1、了解 JMeter是一款开源的性能测试工具&#xff0c;它主要用于模拟多种负载条件下的应用程序或服务器的性能和功能。JMeter可以发送不同类型的请求&#xff0c;如HTTP、HTTPS、FTP、SOAP、REST等&#xff0c;并且可以模拟多种负载类型&#xff0c;例如并发用户、线程组、定时…

正则表达式 详解,10分钟学会

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论正则表达式。 正则表达式是一种用于匹配和操作文本的工具&#xff0c;常用于文本查找、文本替换、校验文本格式等场景。 正则表达式不仅是写代码时才会使用&#xff0c;在平常使用的很多文本编辑软件&#xff0c;都…

关于Python里xlwings库对Excel表格的操作(二十五)

这篇小笔记主要记录如何【如何使用xlwings库的“Chart”类创建一个新图表】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2…

案例分享:Qt多国语言输入法软键盘

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135346374 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

aspose通过开始和结束位置关键词截取word另存为新文件

关键词匹配实体类&#xff1a; Data EqualsAndHashCode(callSuper false) public class TextConfig implements Serializable {private static final long serialVersionUID 1L;/*** 开始关键词&#xff0c;多个逗号分隔*/private String textStart ;/*** 结束关键词&#x…

【操作系统xv6】学习记录4 -CPU上下文:进程上下文、线程上下文、中断上下文

什么是cpu上下文 CPU 寄存器和程序计数器就是 CPU 上下文&#xff0c;因为它们都是 CPU 在运行任何任务前&#xff0c;必须的依赖环境。 什么是 CPU 上下文切换 先把前一个任务的 CPU 上下文&#xff08;也就是 CPU 寄存器和程序计数器&#xff09;保存起来&#xff0c;然后…

Flutter+Go_Router+Fluent_Ui仿阿里网盘桌面软件开发跨平台实战-买就送仿小米app开发

Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发。 Flutter官方介绍&#xff0c;目前Flutte…

ubuntu系统没有网络图标的解决办法

参考文章:https://blog.csdn.net/qq_56922632/article/details/132309643 1. 执行关闭网络服务的命令&#xff0c;关闭网络服务sudo service NetworkManager stop2. 删除网络的状态文件sudo rm /var/lib/NetworkManager/NetworkManager.state3. 修改网络的配置文件sudo vi /etc…

冒泡排序-排序算法

前言 如果有6个人站成一排&#xff0c;要将他们按从矮到高的顺序排列。你可能有多种方式来完成。但是如果其中有一个人特别高&#xff0c;比他身边的人高&#xff0c;在队伍中特别明显&#xff0c;你可以轻易看出那个最高的需要和身边的人交换位置&#xff0c;这是冒泡排序的核…

二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】

目录 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 方法二&#xff1a;传址调用记录节点个数 二、二叉树的最大深度 三、平衡二叉树 四、二叉树遍历 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 计算树的节点数: 函数TreeSize用于…

案例086:基于微信小程序的影院选座系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

履机乘变,轻舟便楫:源启分布式PaaS深度赋能企业级技术平台建设

导语 源启分布式PaaS平台围绕应用视角为用户提供应用运行的全生命周期管控能力&#xff0c;提供注册中心、服务路由、网关、服务治理等中间件技术支持&#xff0c;实现应用之间的联通&#xff0c;解决客户多厂商产品不兼容、产品组合不可选择、孤岛效应等问题&#xff0c;满足…

ros2 基础学习12 分布式通信

智能机器人的功能繁多&#xff0c;全都放在一个计算机里&#xff0c;经常会遇到计算能力不够、处理出现卡顿等情况&#xff0c;如果可以将这些任务拆解&#xff0c;分配到多个计算机中运行岂不是可以减轻压力&#xff1f; 这就是分布式系统&#xff0c;可以实现多计算平台上的任…

android开发百度地图api实现定位图标随手机方向转动

该功能的实现依赖于手机中的传感器元件如陀螺仪、加速度计等&#xff0c;具体开发详见android的官方开发文档&#xff1a; 传感器概览 | Android 开发者 | Android Developershttps://developer.android.com/guide/topics/sensors/sensors_overview?hlzh-cn要自定义一个传…

Hive学习(13)lag和lead函数取偏移量

hive里面lag函数 在数据处理和分析中&#xff0c;窗口函数是一种重要的技术&#xff0c;用于在数据集中执行聚合和分析操作。Hive作为一种大数据处理框架&#xff0c;也提供了窗口函数的支持。在Hive中&#xff0c;Lag函数是一种常用的窗口函数&#xff0c;可以用于计算前一行…

《动手学深度学习》学习笔记 第6章 卷积神经网络

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知道&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器&#xff09; P —— Proportional I —— Integral D —— Derivative 当前误差/过去误差/误差的变化趋势 K p ⋅ e K_{\mathrm{p}}\cdot e Kp​⋅e&#xff1a;比…

golang并发编程-channel

在golang 并发编程里&#xff0c;经常会听到一句话&#xff1a;不要通过共享内存进行通信&#xff0c;通过通信来共享内存。下面我们会介绍下channel, 通过源码的方式去了解channel是怎么工作的。 基本结构 流程图 代码解读 type hchan struct {qcount uint // …

Qt(三):udp组播的发送与接收

1. 创建UDP套接字 使用QUdpSocket类创建一个UDP套接字。 udpSendnew QUdpSocket(this);udpRecenew QUdpSocket(this); 2. 绑定套接字 绑定套接字到一个本地地址和端口。可以使用bind()函数来完成。 如果要在组播中发送数据&#xff0c;可以将套接字绑定到一个通配符地址&#…