[OpenCv]频域处理

news2024/10/22 14:28:45

目录

前言

一、频域变换

1.傅里叶变换

2.代码实现

二、频域中图像处理

1.理解数字图片的频谱

2.频域图像处理步骤

3.使用低通滤波器实现图像平滑

4.使用高通滤波器实现图像锐化

三、总结


前言

数字图像处理的方法有两大类:一种是空间域处理法,另一种是频域处理法。把图像信号从空间域变化到频域,可以从另外一个角度来分析图像信号的特性。

一、频域变换

1.傅里叶变换

说到频域变化,就不得不提到傅里叶变化了,傅里叶变化是将时域信号转化到频域的一种方法,当然对应的傅里叶反变化就是将频域信号转化到时域的方法。关于傅里叶变化的原理就不在过多解释了,这里给大家推荐一个讲傅里叶变化的Bilibili视频

【知识拼图】傅里叶变换从零到一 03集 从爱因斯坦和梦露讲起。傅里叶变换还能这么用?美颜的底层原理是什么?_哔哩哔哩_bilibili ​​​​​​​

感谢Bilibili up主

@有趣的理工男​​​​​​​

2.代码实现

OpenCv提供了离散傅里叶变换的方法以及频谱平移:

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
# 'pic.png'是图像文件的路径,0表示加载图像时使用灰度模式
image = cv2.imread('pic.png', 0)

# 傅里叶变换
# cv2.dft()函数执行二维傅里叶变换,返回的是复数图像
# np.float32(image)将图像数据转换为浮点数,以便进行复杂的数学运算
# flags=cv2.DFT_COMPLEX_OUTPUT指定返回复数图像
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
# np.fft.fftshift()对变换后的复数图像进行中心偏移,以便后面创建低通滤波器
dft_shift = np.fft.fftshift(dft)

频谱平移之后得到就得到可以使用的频谱了

二、频域中图像处理

1.理解数字图片的频谱

数字图像平移后的频谱中,图像的能量将集中到频谱中心(低频成分),图像上的边缘,线条细节信息(高频成分)将分散在图像频谱的边缘。也就是说,频谱中低频成分代表了图像的概貌,高频成分代表了图像中的细节。

2.频域图像处理步骤

频域处理大概分以下步骤:

1.计算图像的DFT,得到F(u,v)

2.用滤波函数与H(u,v)与F(u,v)相乘,得到结果G(u,v)

3.计算IDFT

4.取IDFT的实部,即为处理后的图像

H(u,v)就是我们常说的滤波器,滤波器一般分为低通滤波器,高通滤波器,带通滤波器,带阻滤波器

3.使用低通滤波器实现图像平滑

顾名思义,低通滤波器允许低频通过而抑制高频。因此它可以去除图片中的噪音,实现图片平滑,当然也会引起图像模糊。这里低通的操作与上文提到的视频中的操作相同:

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
# 'pic.png'是图像文件的路径,0表示加载图像时使用灰度模式
image = cv2.imread('img.png', 0)

# 傅里叶变换
# cv2.dft()函数执行二维傅里叶变换,返回的是复数图像
# np.float32(image)将图像数据转换为浮点数,以便进行复杂的数学运算
# flags=cv2.DFT_COMPLEX_OUTPUT指定返回复数图像
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
# np.fft.fftshift()对变换后的复数图像进行中心偏移,以便后面创建低通滤波器
dft_shift = np.fft.fftshift(dft)

# 低通滤波器
# 获取图像的尺寸
rows, cols = image.shape
# 计算图像中心的坐标
crow, ccol = rows // 2, cols // 2
# 创建一个与图像大小相同的掩码,初始值为0
mask = np.zeros((rows, cols, 2), np.uint8)
# 设置低通滤波器的半径
r = 100
# 定义滤波器的中心坐标
center = [crow, ccol]
# 创建一个坐标网格
x, y = np.ogrid[:rows, :cols]
# 定义滤波器的区域,即圆形区域
mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r
# 将滤波器区域的值设置为1,其余区域为0
mask[mask_area] = 1

# 应用低通滤波器
# 将掩码与复数图像相乘,实现低通滤波
f_shift = dft_shift * mask

# 傅里叶反变换
# 将滤波后的图像进行中心偏移,以便进行反变换
f_ishift = np.fft.ifftshift(f_shift)
# cv2.idft()函数执行二维傅里叶反变换
img_back = cv2.idft(f_ishift)
# 对反变换后的复数图像的实部和虚部取平方根,得到幅度图像
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])

# 显示原始图像和处理后的图像
# 使用matplotlib库显示图像
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Low Pass Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()

4.使用高通滤波器实现图像锐化

import cv2
import numpy as np

# 读取图像
image = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)

# 确保图像维度是2,如果是3通道图像,需要转换为灰度图像
if image.ndim == 3:
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 定义高通滤波器的参数
# 这里使用高斯滤波器作为高通滤波器,大小为(5,5),sigmaX为1.5
# 高斯滤波器的标准差sigmaX决定了滤波器的截止频率
# 值越大,截止频率越低,滤波效果越接近低通滤波器
kernel_size = (5, 5)
sigmaX = 1.5

# 应用高通滤波器
filtered_image = cv2.GaussianBlur(image, kernel_size, sigmaX)

# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)

# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

三、总结

对信号的频域处理已经应用到了各个领域,傅里叶的大名想必也已经那些被傅里叶变化折磨过的大学生深深的记在了脑海中了。

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

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

相关文章

Pytorch学习 day06(torchvision中的datasets、dataloader)

torchvision的datasets 使用torchvision提供的数据集API&#xff0c;比较方便&#xff0c;如果在pycharm中下载很慢&#xff0c;可以URL链接到迅雷中进行下载&#xff08;有些URL链接在源码里&#xff09;代码如下&#xff1a; import torchvision # 导入 torchvision 库 # …

Mac版2024 CleanMyMac X 4.14.6 核心功能详解以及永久下载和激活入口

CleanMyMac 是 macOS 上久负盛名的系统清理工具&#xff0c;2018 年&#xff0c;里程碑式版本 CleanMyMac X 正式发布。不仅仅是命名上的变化&#xff0c;焕然一新的 UI、流畅的动画也让它显得更加精致。新增的系统优化、软件更新等功能&#xff0c;使得在日常使用 macOS 时有了…

C# Mel-Spectrogram 梅尔频谱

目录 介绍 Main features Philosophy of NWaves 效果 项目 代码 下载 C# Mel-Spectrogram 梅尔频谱 介绍 利用NWaves实现Mel-Spectrogram 梅尔频谱 NWaves github 地址&#xff1a;https://github.com/ar1st0crat/NWaves NWaves is a .NET DSP library with a lot …

Springboot 的几种配置文件形式

方式一&#xff1a;多个yml文件 步骤1&#xff1a;创建多个配置文件 application.yml #主配置文件 application-dev.yml #开发环境的配置 application-prod.yml #生产环境的配置 application-test.yml #测试环境的配置步骤2&#xff1a;applicaiton.yml中指定配置 在a…

H3C BGP 基本配置实验

H3C BGP 基本配置实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;R1 和 R5 上使用环回口模拟业务网段&#xff0c;R2&#xff0c;R3&#xff0c;R4 的环回口用于配置 Router-id 和建立 IBGP 邻居AS 200 运行 OSPF 实现内部网络互通R1&#xff0c;R2&#xf…

Python 中实现 CDF 累积分布图的两种方法

什么是累积分布 累积分布函数&#xff0c;又叫分布函数&#xff0c;是概率密度函数的积分&#xff0c;能完整描述一个实随机变量X的概率分布。一般以大写“CDF”&#xff08;Cumulative Distribution Function&#xff09;标记。 《百度百科》 累积分布函数&#xff0c;又叫分…

LeetCode 刷题 [C++] 第300题.最长递增子序列

题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 题目…

【Linux】Linux原生异步IO(一):libaio-介绍

1、IO模型 1.1 简述 相信大家在搜索的时候,都会看到下面这张图,IO的使用场景:同步、异步、阻塞、非阻塞,可以组合成四种情况: 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可…

什么样的项目适合Web自动化测试

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

共用体union

一、共用体的特性 共用体又叫做联合体&#xff0c;共用体的特性如下&#xff1a; 1.共用体的所有成员共用一段内存空间&#xff0c;且所有成员的起始位置是一致的 2.共用体的值由最后赋值的成员决定 3.共用体的内存大小 共用体的内存必须大于或等于其他成员变量中最大数据类型…

专题1 - 双指针 - leetcode 15. 三数之和 - 中等难度

leetcode 15. 三数之和 - 点击直达 leetcode 15. 三数之和 中等难度 双指针1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 15. 三数之和 中等难度 双指针 1. 题目详情 给你一个整数数组 nums &#…

SQL 替换某一列中所有数据的特定字符

UPDATE product SET spec REPLACE(spec, ,, ) 把product表的spec字段内容中的逗号替换为

性能问题分析排查思路之机器(3)

本文是性能问题分析排查思路的展开内容之一&#xff0c;第2篇&#xff0c;主要分为日志1期&#xff0c;机器4期、环境2期共7篇系列文章&#xff0c;本期是第三篇&#xff0c;讲机器&#xff08;硬件&#xff09;的网络方面的排查方法和最佳实践。 主要内容如图所示&#xff1a…

Java请求时间耗时长分析

推断是java.lang.OutOfMemoryError: Metaspace&#xff0c;元空间不够&#xff0c;频繁垃圾收集 这个过程中程序卡住一直不响应&#xff0c;应该是触发FGC有关系。 YGC&#xff1a;451->453 FGC&#xff1a;198->289 FGCT&#xff1a;52.246->76.291 但是堆内存的空间…

简易网络聊天室:2024/3/7

思维导图 基于UDP的简易网络聊天室 服务器&#xff1a; #include <myhead.h>#define SER_PORT 8888struct msgTyp //存储消息的结构体 {char type; //消息类型char name[30]; //用户姓名char text[1024]; //消息正文 };//创建链表存储客户端信息 typedef stru…

【计算机考研】考408,还是不考408性价比高?

首先综合考虑&#xff0c;如果其他科目并不是很优秀&#xff0c;需要我们花一定的时间去复习&#xff0c;408的性价比就不高&#xff0c;各个科目的时间互相挤压&#xff0c;如果备考时间不充裕&#xff0c;考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…

SAP MM学习笔记44 - 特殊调达流程 - Blanket购买发注(汇总采购)

上一章学习了 支付计划&#xff0c;本章继续学习 Blanket购买发注&#xff08;汇总采购&#xff09;。 SAP MM学习笔记43 - 特殊调达流程 - 支付计划-CSDN博客 1&#xff0c;Blanket购买发注 概要 其实就是订好一个大致数额&#xff0c;然后让随便买&#xff0c;只要不超这个…

网络调试助手使用MQTT协议与Mosquitto通信(3)

一、连接报文 一开始设备需要连接到mqtt服务器&#xff0c;连接时的数据包内需要携带对应的设备ID&#xff0c;以及用户名和密码。这使用默认的用户名和密码。设备ID每一个设备都需要设置为不同的&#xff0c;两个相同的ID只能允许一台设备在线&#xff0c;另一个相同的ID的设备…

2024年最新阿里云服务器地域选择方法,以及可用区说明

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

实操keepalived(高可用)+Nginx(四层代理+七层代理),实现高可用、负载均衡以及动静分离

一 vrrp技术 VRRP 相关术语 VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;i通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。 协议版本: VRRPv2 (常用) 和VRRPv3:0 VRRPv2仅适用于IPv4网络&#xff0c;VRRPv3适用…