[OpenCv]频域处理

目录

前言

一、频域变换

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.hqwc.cn/news/519757.html

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

相关文章

0x04_数组_指针_字符串

数组 数组的定义与使用 数组是具有一定顺序关系的若干相同类型变量的集合体&#xff0c;组成数组的变量称为该数组的元素。 给出下面程序的输出&#xff1a; #include <iostream> using namespace std; int main() {int a[10], b[10];for(int i 0; i < 10; i) {a[…

[Unity实战]使用NavMeshAgent做玩家移动

其实除了Character Controller, Rigidbody&#xff0c;我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方&#xff08;毕竟基于烘焙过的导航网格&#xff09;&#xff0c;一般常见于元宇宙应用和mmo。 根据Unity手册&#xff0c;NavMeshAgent 也有和…

探索SRM软件:了解SRM在企业中的作用

作为供应商&#xff0c;对于SRM软件并不陌生&#xff0c;但对于刚刚进入采购行业的新手来说&#xff0c;就可能不太了解这个软件的作用了。现在让我们来科普一下&#xff1a;通常&#xff0c;我们将SRM称为供应商关系管理&#xff0c;其全称为Supplier Relationship Management…

计算机网络面经-HTTPS加密过程

前言 在上篇文章HTTPS详解一中&#xff0c;我已经为大家介绍了 HTTPS 的详细原理和通信流程&#xff0c;但总感觉少了点什么&#xff0c;应该是少了对安全层的针对性介绍&#xff0c;那么这篇文章就算是对HTTPS 详解一的补充吧。还记得这张图吧。 HTTPS 和 HTTP的区别 显然&am…

【MySQL】not in遇上null的坑

今天遇到一个问题&#xff1a; 1、当 in 内的字段包含 null 的时候&#xff0c;正常过滤&#xff1b; 2、当 not in 内的字段包含 null 的时候&#xff0c;不能正常过滤&#xff0c;即使满足条件&#xff0c;最终结果也为 空。 测试如下&#xff1a; select * from emp e;当…

Mysql深入学习 基础篇 Ss.05多表查询语法及案例

世界总是在推着我走&#xff0c;我自己一个人也能站稳 —— 24.3.7 一、多表关系 1.概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个…

一个比较全面实用的C#帮助类、工具类库

前言 经常会有一些同学会问为什么感觉我身边的大佬写一个功能会这么快&#xff1f;一个类似的模块大佬可能半天就搞定了&#xff0c;而我要搞一两天。其实工作久了你会发现很多常用公共的帮助类和工具类&#xff0c;如常见的Excel数据导入导出、文件操作、字符串操作、数据转换…

什么是攻防演练,能给企业带来什么

随着互联网技术的发展和企业信息化程度的提高&#xff0c;企业面临的网络安全威胁越来越多。为了保护企业的信息安全&#xff0c;攻防演练已经成为企业安全运营中不可或缺的一部分。攻击者通常会利用各种方法来破坏企业的安全系统和数据&#xff0c;因此企业需要像攻击者一样思…

【Android】源码解析 Activity 的构成

本文是基于 Android 14 的源码解析。 当我们写 Activity 时会调用 setContentView() 方法来加载布局。现在来看看 setContentView() 方法是怎么实现的&#xff0c;源码如下所示&#xff1a; 路径&#xff1a;/frameworks/base/core/java/android/app/Activity.javapublic void…

【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子&#xff0c;谨以此作为笔记参考 目录 1.背景2. 寻找方案3. 如何解决4.解决步骤4.1 DockerFile4.2 现在要做的 5. 镜像相关命令 1.背景 部署&#xff08;迁移&#xff09;项目时发现&#xff0c;项目的excel导出功能报错&#xff0c;错误如下…

代码随想录算法训练营day09 | KMP算法理论理解、28. 实现 strStr()、459.重复的子字符串

写这两题之前&#xff0c;先了解一下什么是KMP算法 目录 KMP定义作用前缀表定义为什么一定要使用前缀表最长公共前后缀如何计算前缀表 next数组前缀表与next数组的关系使用next数组来匹配时间复杂度分析构造next数组使用next数组来做匹配 实现 strStr()思路解题方法复杂度暴力…

Unity 动画(旧版-新版)

旧版 旧版-动画组件&#xff1a;Animation 窗口-动画 动画文件后缀: .anim 将制作后的动画拖动到Animation组件上 旧版的操作 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// Start is called before…