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

news2024/9/20 18:39:12

                         

 时域滤波:

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

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 在频域高通滤波的上下文中指的是截止频率。具体而言,它代表了在频域中,低频成分被抑制的半径。

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


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

 

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

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

相关文章

【卡码网Python基础课 19.洗盘子】

目录 题目描述与分析一、栈二、栈的操作三、代码编写 题目描述与分析 题目描述&#xff1a; 在餐厅里&#xff0c;洗盘子的工作需要使用到栈这种数据结构。 假设你手里有一个盘子堆放区。现在需要模拟洗盘子的过程&#xff0c;每个盘子都有一个编号。 盘子堆放区操作说明&…

同一台电脑上安装不同版本的nodejs(搭配VSCode)

今天拉取了一个前后端分离的项目&#xff0c;运行前端的时候&#xff0c;出现node版本不匹配的情况。 本文章将从安装node.js开始到VSCode使用进行讲解 1、去官网下载node版本 以16版本为例&#xff0c;需要哪个版本&#xff0c;就在网址上把版本号替换即可 https://nodejs.o…

在ADS中使用传输端口参数构建理想元器件模型---以3dB电桥为例

在ADS中使用传输端口参数&#xff08;S、Z、Y、ABCD&#xff09;构建理想元器件模型—以3dB电桥为例 本文工程文件下载&#xff1a;在ADS中使用传输端口参数构建理想元器件模型-以3dB电桥为例-工程文件 目录 在ADS中使用传输端口参数&#xff08;S、Z、Y、ABCD&#xff09;构建…

8月18日笔记

目标不出网场景 在目标环境完全不出网的情况下&#xff0c;即所有的网络通信如SMB&#xff08;Server Message Block&#xff09;、DNS&#xff08;Domain Name System&#xff09;甚至包括TCP&#xff08;Transmission Control Protocol&#xff09;都不允许与外部网络进行交…

使用极限网关实现 ES 跨集群搜索

使用 ES 的小伙伴&#xff0c;有没有在用跨集群搜索的&#xff1f; 熟悉 ES 的小伙伴都知道&#xff0c;ES 本身就能实现跨集群搜索&#xff0c;那为啥还要聊这个&#xff1f;试想一下&#xff0c;如果集群都上线投产了&#xff0c;才出现跨集群搜索需求&#xff0c;那么可能出…

重磅!RISC-V+OpenHarmony平板电脑发布

仟江水商业电讯&#xff08;8月18日 北京 委托发布&#xff09;RISC-V作为历史上全球发展速度最快、创新最为活跃的开放指令架构&#xff0c;正在不断拓展高性能计算领域的边界。OpenHarmony是由开放原子开源基金会孵化并运营的开源项目&#xff0c;已成为发展速度最快的智能终…

Chapter 40 Socket网络编程

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、Socket网络编程二、Socket服务端编程三、Socket客户端编程四、服务端与客户端相互通讯 前言 在现代计算机网络中&#xff0c;Socket&#xff08;套接字&#xff09…

【题解】—— LeetCode一周小结33

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结32 12.实现一个魔法字典 题目链接&#xff1a;676. 实现一个魔…

Kettle根据时间戳同步数据实现

1 Kettle总体步骤 更多数据实时同步方案&#xff0c;请参考笔者的另一篇博文&#xff1a;大数据时代&#xff0c;数据实时同步解决方案的思考—最全的数据同步总结 由于Kettle自身的特殊性以及在多个步骤中kettle自身处理数据库事务的特殊性&#xff0c;尝试了很多种方案&…

win11内存占用高的解决办法

win11莫名奇妙的总是内存爆满&#xff0c;真的抽象&#xff0c;16g根本不够用。尝试各种方法看看能不能解决… 方法一 关闭快速启动 win11系统&#xff0c;自带快速开机功能&#xff0c;可能用较大内存&#xff0c;关闭看看。控制面板找到电源设置关闭快速启动。 如果没找到要…

C++ | Leetcode C++题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; class Solution { public:string reverseVowels(string s) {auto isVowel [vowels "aeiouAEIOU"s](char ch) {return vowels.find(ch) ! string::npos;};int n s.size();int i 0, j n - 1;while (i < j) {while (i < …

Leetcode JAVA刷刷站(48)旋转图像

一、题目概述 二、思路方向 要在原地顺时针旋转一个 n x n 的二维矩阵 90 度&#xff0c;你可以通过一系列交换操作来实现。这里的关键在于理解旋转后的矩阵与原矩阵之间的元素对应关系。 假设原矩阵为 matrix&#xff0c;其中 matrix[i][j] 表示第 i 行第 j 列的元素。旋转 90…

【每日一题 | 数据结构】压缩矩阵存储算法

题型方法讲解 首先明确&#xff0c;压缩矩阵存储算法是408考试中的重点、难点、高频考点&#xff0c;甚至曾经达成了连续五年考到程度&#xff0c;让同学们感到恐惧。很多同学都会把这类题型当成一个记公式的题&#xff0c;其实不然&#xff0c;这个视频将会告诉你如何用推导的…

485总线常开+常闭,8路C型继电器输出模块DAM-3018CA

阿尔泰科技 型号&#xff1a;DAM-3018CA 概述&#xff1a; DAM-3018CA为8路C型继电器输出模块&#xff0c;每通道具有LED指示灯指示&#xff0c;RS485通讯接口&#xff0c;带有标准ModbusRTU协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 产品图…

Leetcode JAVA刷刷站(50)Pow(x, n)

一、题目概述 二、思路方向 方法1&#xff1a;递归&#xff08;考虑正负n&#xff09; 这种方法利用递归的思想&#xff0c;将问题分解为更小的子问题。同时&#xff0c;考虑到n可能是负数&#xff0c;我们可以先处理n的符号&#xff0c;然后将问题转化为正数幂的问题。 publi…

24/8/15算法笔记 复习_决策树

#手动计算决策树到底是如何实现分类的 p1 (y N).mean() p2 (y Y).mean()p1 * np.log2(1/p1) p2*np.log2(1/p2)X[真实用户] y x X[日志密度].unique()#.unique() 是一个方法&#xff0c;它返回一个数组&#xff0c;包含 X[日志密度] 列中所有不同的值。 x.sort()#排序 print…

读零信任网络:在不可信网络中构建安全系统21读后总结与感想兼导读

1. 基本信息 零信任网络&#xff1a;在不可信网络中构建安全系统 道格巴斯&#xff08;Doug Barth&#xff09; 著 人民邮电出版社,2019年8月出版 1.1. 读薄率 书籍总字数252千字&#xff0c;笔记总字数73194字。 读薄率73194252000≈29.5% 这个读薄率是最高的吧&#x…

客户端登录逻辑

将网关服务器发送的数据通过信号传递给 TcpMgr 中定义的槽函数 void LoginDialog::initHttpHandlers() {// 注册获取登录回包逻辑m_handlers.insert(ReqId::ID_LOGIN_USER, [this](QJsonObject jsonObj){int error jsonObj["error"].toInt();if(error ! ErrorCodes:…

Superset BI封装自定义组件(堆叠柱状图)

目录 前言 封装步骤 一、创建组件文件夹 二、预设组件信息 三、使用组件 往期回顾 前言 Superset 是一个现代化的、易于使用的、轻量级的数据可视化工具&#xff0c;它允许用户通过简单的点击操作来创建和分享图表。如果你想在 Superset 中创建自定义组件&#xff0c;你…

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…