[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.mfbz.cn/a/437568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】Android Telephony 漫游SPN显示定制(Roaming Alpha Tag)

一、功能名词简介和显示规则 Alpha Tag&#xff1a;运营商名称标识符&#xff0c;也是用于标识运营商的一个名称。客户需求描述常用名词&#xff0c;对开发而言都是SPN/PLMN功能模块的内容&#xff0c;状态栏左上角的运营商名称显示。 SPN相关文章&#xff1a; 【笔记】SPN和…

nyist_acm 个人积分赛1(部分题解会补充)

Mirrored String II 看到题解说是马拉车算法&#xff0c;我赛时并没想到&#xff08;好吧其实我是比赛完才知道有马拉车这个算法&#xff09; 因为字符串的长度只有1000&#xff0c;直接暴力跑其实就可以了&#xff0c;但是要注意的是&#xff1b;回文串有俩种形式&#xff0c…

nginx部署前端工程替代方案gateway

nginx部署前端工程替代方案gateway 有市场要求部署的前端vue工程不使用nginx中间件。想弄国产替代的东方通之类的&#xff0c;公司没有购买该产品&#xff0c;我参考了网上的一些java网关框架&#xff0c;springcloud组件&#xff1a;gateway实现代替。 注意后台都是用java编…

shadertoy 游戏《来自星尘》摇杆复刻

正确的做法应该是上 noise 而不是叠加 sin 波&#xff0c;不过如果不想麻烦的话叠波还是一个不错的选择&#xff1a;整体效果如下&#xff0c;已经非常形似 直接上链接&#xff1a;Shader - Shadertoy BETA float radiusScale 0.9; float variation(vec2 v1, vec2 v2, float …

据说这是最细滴,Python接口自动化测试数据驱动DDT使用实战,有这一篇就完全足够了

前言 环境准备 首先&#xff0c;需要安装ddt模块 pip install ddt调用时标准格式 在类下面如下写上&#xff1a;ddt.ddt 在调用的方法下面需要写上&#xff1a;ddt.data(需要传入的多组数据) DDT简单介绍 名称&#xff1a; Data-Driven Tests&#xff0c;数据驱动测试。 作用…

深入理解Servlet

目录&#xff1a; ServletWeb开发历史Servlet简介Servlet技术特点Servlet在应用程序中的位置Tomcat运行过程Servlet继承结构Servlet生命周期Servlet处理请求的原理Servlet的作用HttpServletRequest对象HttpServletResponse对象ServletContext对象ServletConfig对象Cookie对象与…

Keepalived实验

一、 LVSKeepalived 实验&#xff1a;7-1为主&#xff1b; 7-2为备&#xff1b; 7-3和7-4为后端服务器 1.关闭防火墙和selinux [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 02.配置主设备7-1 1.安装ipvsadm和keepalived [rootlocalhost ~]#…

阿珊解说Vue中`$route`和`$router`的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

可视化图表:柱坐标系与对应图表详解

一、柱坐标系及其构成 柱状坐标系是一种常见的可视化图表坐标系&#xff0c;用于显示柱状图&#xff08;也称为条形图&#xff09;的数据。它由两个相互垂直的轴组成&#xff0c;一个是水平轴&#xff08;X轴&#xff09;&#xff0c;另一个是垂直轴&#xff08;Y轴&#xff0…

评测本地部署的语音识别模型

1 引言 最近&#xff0c;朋友给我发来了一段音频&#xff0c;想转录成文字&#xff0c;并使用大型润色文本。音频中的普通话带有一定的口音&#xff0c;并且讲解内容较为专业&#xff0c;所以一般的语音识别工具很难达到较高的识别率。 于是试用了两个大模型。Whisper 是目前…

AIOps常见问题

AIOps的自动化通常指什么&#xff1f; AIOps 平台的自动化一般包括以下几个方面&#xff1a; 数据收集和整合&#xff1a;AIOps 平台可以从多个 IT 基础架构组件、应用需求与性能监视工具以及服务工单系统等数据源中收集并整合运维数据&#xff0c;形成一个全面的数据平台。数…

Access AR Foundation 5.1 in Unity 2022

如果已经下载安装了ARF但版本是5.0.7 可以通过下面的方式修改 修改后面的数字会自动更新 更新完成后查看版本 官方文档 Access AR Foundation 5.1 in Unity 2021 | AR Foundation | 5.1.2

YOLOv9中train.py与train_dual.py的异同!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 首先&#xff0c;train.py&#xff08;左&#xff09;与train_dual.py(右)中的损失函数是不一样的&#xff0c;这也解释了为什么使用train.py除了填入…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行&#xff0c;然后切换到Release模式下&#xff0c;也正常运行&#xff0c;把第三方平台的dll拷贝到exe所在…

Chrome浏览器好用的几个扩展程序

Chrome好用的扩展程序 背景目的介绍JsonHandle例子未完待续。。。。。。 背景 偶然在往上看到Chrome有很多好用的扩展程序&#xff0c;比较好用&#xff0c;因此记录下比较实用的扩展程序。 目的 记录Chrome浏览器好用的插件。 介绍 JsonHandle下载以及无法扩展插件的解决…

Vue3_2024_6天【回顾上篇watch常见的前三种场景】另两种待补

第一种情况&#xff1a;监视【ref】定义&#xff08;基本数据类型&#xff09; 1.引入watch2.格式&#xff1a;watch&#xff08;基本数据类型数据&#xff0c;监视变化的回调函数&#xff09; 注意点&#xff1a; 2.1.watch里面第一个参数&#xff0c;是数据~~【监视的基本类…

基于深度学习的三维重建MVSNet系列

2019年4月15日下午6时50分左右&#xff0c;一场大火席卷了法国巴黎圣母院&#xff0c;持续长达14小时。幸而巴黎圣母院有着高分辨率的3D模型&#xff0c;研究人员可以了解圣母院本身的建造结构&#xff0c;以便修复工程的开展。 多视图立体几何&#xff08;Multi-View Stereo&a…

unity-urp:视野雾

问题背景 恐怖游戏在黑夜或者某些场景下&#xff0c;需要用雾或者黑暗遮盖视野&#xff0c;搭建游戏氛围 效果 场景中&#xff0c;雾会遮挡场景和怪物&#xff0c;但是在玩家视野内雾会消散&#xff0c;距离玩家越近雾越薄。 当前是第三人称视角&#xff0c;但是可以轻松的…

Linux:kubernetes(k8s)探针LivenessProbe的使用(9)

他做的事情就是当我检测的一个东西他不在规定的时间内存在的话&#xff0c;我就让他重启&#xff0c;这个检测的目标可以是文件或者端口等 我这个是在上一章的基础之上继续操作&#xff0c;我会保留startupProbe探针让后看一下他俩的执行优先的一个效果 Linux&#xff1a;kuber…

【QT】QDialog/ QMessageBox/提示对话框/颜色(文字)------对话框

QDialog—对话框 什么是对话框&#xff0c;如下样式 非模态对话框&#xff0c;即打开以后&#xff0c;我还可以对其他框进行操作。 模态对话框&#xff0c;打开以后&#xff0c;其他框都不能再操作了 模态对话框是阻塞对话框 QDialog dig(this);//显示模态对话框dig.exec();…
最新文章