当前位置: 首页 > news >正文

OpenCv图像处理: 时域滤波与频域滤波

                         

 时域滤波:

空间域滤波的步骤一般如下:

1. 选择滤波器

选择一种低通滤波器,常见的包括:

  • 均值滤波(平均滤波器)
  • 高斯滤波(Gaussian filter)

2. 定义滤波器核

根据选择的滤波器类型,定义相应的滤波器核。例如,对于高斯滤波,可以使用高斯函数创建一个二维核。

3. 图像边界处理

决定如何处理图像边界。常见的方法有:

  • 零填充(Zero padding)
  • 镜像扩展(Mirror padding)

4. 卷积操作

对图像应用滤波器,通常使用卷积操作。具体步骤如下:

  • 对图像中的每一个像素,使用滤波器核计算加权和。
  • 替换图像中当前像素的值为加权和的结果。
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('image.jpg')# 定义均值滤波器核 lp
#kernel_size = 5
#kernel = np.ones((kernel_size, kernel_size), np.float32) / (kernel_size * kernel_size)# 拉普拉斯卷积核 hp
kernel = np.array([[0, -1, 0],[-1, 4, -1],[0, -1, 0]])# 应用卷积
low_pass_filtered = cv2.filter2D(image, -1, kernel)# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off')plt.subplot(1, 2, 2)
plt.title('Low Pass Filtered Image (Spatial Domain)')
plt.imshow(cv2.cvtColor(low_pass_filtered, cv2.COLOR_BGR2RGB))
plt.axis('off')plt.tight_layout()
plt.show()

频域滤波: 

频域低通滤波的步骤通常如下:

1. 傅里叶变换

将图像从时域转换到频域。使用快速傅里叶变换(FFT)来实现。

2. 中心化傅里叶频谱

将频谱中心化,以便高频成分位于中心位置,便于创建滤波器。

3. 创建低通滤波器

设计一个低通滤波器,例如:

  • 理想低通滤波器:保留中心圆内的频率,抑制外部频率。
  • 高斯低通滤波器:根据高斯函数构建一个平滑的低通滤波器。

4. 应用低通滤波器

将低通滤波器应用于中心化后的频谱,通常通过逐元素相乘实现。

5. 逆傅里叶变换

对经过低通滤波的频谱进行逆傅里叶变换,将其转换回时域。

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('image.jpg', 0)  # 以灰度图读取
# image = cv2.resize(image, (512, 512))  # 调整大小,方便处理# 进行傅里叶变换
dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)# 获取图像尺寸
rows, cols = image.shape
crow, ccol = rows // 2, cols // 2# # 创建高斯低通滤波器
# def gaussian_lowpass(rows, cols, cutoff):
#     x = np.arange(0, cols)
#     y = np.arange(0, rows)
#     x, y = np.meshgrid(x, y)
#     gaussian = np.exp(-((x - ccol) ** 2 + (y - crow) ** 2) / (2 * (cutoff ** 2)))
#     return gaussian
#
# cutoff_radius = 30
# mask = gaussian_lowpass(rows, cols, cutoff_radius)# 创建理想高通滤波器
cutoff_radius = 30 # 设置截止频率(低频成分被抑制的半径)
mask = np.ones((rows, cols), np.uint8)
x, y = np.ogrid[0:rows, 0:cols]
center = (crow, ccol)
mask[(x - center[0])**2 + (y - center[1])**2 <= cutoff_radius**2] = 0# 应用低通滤波器
filtered_dft = dft_shift * mask  # 时域卷积=频域相乘# 进行逆傅里叶变换
filtered_image = np.fft.ifft2(np.fft.ifftshift(filtered_dft))
filtered_image = np.abs(filtered_image)# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')plt.subplot(1, 2, 2)
plt.title('Low Pass Filtered Image (Frequency Domain)')
plt.imshow(filtered_image, cmap='gray')
plt.axis('off')plt.tight_layout()
plt.show()

cutoff_radius = 30 在频域高通滤波的上下文中指的是截止频率。具体而言,它代表了在频域中,低频成分被抑制的半径。

解释:
高通滤波器:当频率小于这个截止半径的频率成分会被滤除,而高于这个半径的成分会被保留。
单位:这个参数的单位通常与图像的尺寸相关,表示频谱中距离中心点的距离。


效果:
选择合适的截止频率非常重要,过低的截止频率会导致图像细节丢失,而过高的截止频率可能保留过多噪声。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • flink车联网项目:维表离线同步(第69天)
  • socks4和socks5和https代理的区别
  • KNN 图像识别
  • Rust线程模型与线程创建
  • 【高阶数据结构】图
  • 美团笔试-测试方向
  • 理解Tomcat的IP绑定与访问控制
  • C语言小练习(伍)
  • 【问卷表单系统】TDuckX-8月更新速览!
  • 嵌入式面经篇十——驱动开发
  • SAP Memory ABAP Memory超级详细解析
  • R 语言学习教程,从入门到精通,R CSV 文件使用(17)
  • 【axios get请求 中文乱码】
  • 运维工具之veyon安装和使用
  • 基于node.js的宠物寄存管理系统,基于express的宠物寄存系统
  • [NodeJS] 关于Buffer
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • angular2开源库收集
  • Java Agent 学习笔记
  • Java 网络编程(2):UDP 的使用
  • Odoo domain写法及运用
  • SegmentFault 2015 Top Rank
  • yii2权限控制rbac之rule详细讲解
  • 闭包,sync使用细节
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 汉诺塔算法
  • 聊聊sentinel的DegradeSlot
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用Swoole加速Laravel(正式环境中)
  • 数据仓库的几种建模方法
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 物联网链路协议
  • 消息队列系列二(IOT中消息队列的应用)
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • No resource identifier found for attribute,RxJava之zip操作符
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • (02)Hive SQL编译成MapReduce任务的过程
  • (3)STL算法之搜索
  • (30)数组元素和与数字和的绝对差
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)Linux——Linux常用指令
  • (力扣)循环队列的实现与详解(C语言)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 事件模型教程(二)
  • .Net程序帮助文档制作
  • .Net小白的大学四年,内含面经
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Bean, @Component, @Configuration简析
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [C++]Leetcode17电话号码的字母组合