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

问题三十四:傅立叶变换——高通滤波

在这里插入图片描述
高通滤波器是一种可以通过去除图像低频信息来增强高频信息的滤波器。在图像处理中,高通滤波器常常用于去除模糊或平滑效果,以及增强边缘或细节。在本篇回答中,我们将使用Python和OpenCV实现高通滤波器。

Step 1:加载图像并进行傅立叶变换

首先,我们需要加载图像并将其转换为灰度图像。然后,我们使用numpy的fft2函数进行二维傅立叶变换,并使用numpy的fftshift函数将频谱中心移到图像中心。最后,我们使用numpy的log函数计算幅度谱的对数值,并使用opencv的normalize函数将其缩放到0到255之间的整数范围内。

以下是完整的Python代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt# 加载图像并将其转换为灰度图像
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 进行二维傅立叶变换
dft = np.fft.fft2(gray)
dft_shift = np.fft.fftshift(dft)# 计算幅度谱并进行对数变换
magnitude_spectrum = 20 * np.log(np.abs(dft_shift))# 将幅度谱缩放到0到255的整数范围内
magnitude_spectrum = cv2.normalize(magnitude_spectrum, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)

解释:

  • Step 1.1:我们使用cv2.imread函数加载图像,并使用cv2.cvtColor函数将其转换为灰度图像。
  • Step 1.2:我们使用np.fft.fft2函数对灰度图像进行二维傅立叶变换。
  • Step 1.3:我们使用np.fft.fftshift函数将频谱中心移到图像中心。
  • Step 1.4:我们使用np.abs函数计算频谱的幅度,并使用np.log函数进行对数变换。
  • Step 1.5:我们使用cv2.normalize函数将幅度谱缩放到0到255之间的整数范围内。

Step 2:设计高通滤波器并应用

在本例中,我们将使用巴特沃斯高通滤波器来过滤频谱。巴特沃斯高通滤波器可以被描述为一个阶数和半径的函数,我们需要选择这些参数来调整滤波器的性能。阶数越高,滤波器的陡峭程度就越高,但会导致图像失真。半径越小,滤波器去除的低频信息就越多。

我们将使用cv2.getOptimalDFTSize函数获取最佳的离散傅里叶变换尺寸,以便在后续计算中避免频谱的失真。接下来,我们将使用cv2.filter2D函数将高通滤波器应用于频谱图像,并将其保存为变量filtered_spectrum

以下是完整的Python代码:

# 设计高通滤波器并应用
rows, cols = gray.shape
crow, ccol = rows // 2, cols // 2
R = 60
n = 2
D_0 = R / ((rows ** 2 + cols ** 2) ** 0.5)# 创建巴特沃斯高通滤波器
butterworth_highpass = np.zeros((rows, cols), dtype=np.float32)
for i in range(rows):for j in range(cols):distance = ((i - crow) ** 2 + (j - ccol) ** 2) ** 0.5butterworth_highpass[i, j] = 1 / (1 + (distance / D_0) ** (2 * n))# 将高通滤波器应用于频谱图像
filtered_spectrum = butterworth_highpass * dft_shift
filtered_spectrum = np.fft.ifftshift(filtered_spectrum)

解释:

  • Step 2.1:我们获取图像的行和列数,并计算其中心坐标。
  • Step 2.2:我们选择半径R和阶数n作为巴特沃斯高通滤波器的参数,并计算截止频率D_0
  • Step 2.3:我们使用两个嵌套的for循环来创建一个与输入图像大小相同的数组butterworth_highpass,并为每个像素计算对应的高通滤波器值。
  • Step 2.4:我们使用np.fft.ifftshift函数将频谱中心移回原来的位置。

Step 3:进行傅立叶逆变换并显示结果

最后一步是将处理后的频谱图像进行逆变换,并将结果保存为变量filtered_image。我们使用opencv的normalize函数将结果缩放到0到255之间的整数范围内,并使用matplotlib的imshow函数显示结果。

# 进行傅立叶逆变换并显示结果
filtered_image = cv2.idft(filtered_spectrum)
filtered_image = cv2.magnitude(filtered_image[:, :, 0], filtered_image[:, :, 1])
filtered_image = cv2.normalize(filtered_image, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)plt.imshow(filtered_image, cmap='gray')
plt.title('High Pass Filtered Image')
plt.show()

解释:

  • Step 3.1:我们使用cv2.idft函数将经过高通滤波器处理的频谱进行傅里叶逆变换,以便将其转换回图像域。
  • Step 3.2:我们使用cv2.magnitude函数计算逆变换结果的幅值,并保存在变量filtered_image中。
  • Step 3.3:我们使用cv2.normalize函数将结果缩放到0到255之间的整数范围内,并将其转换为8位无符号整数。
  • Step 3.4:我们使用matplotlib.pyplot.imshow函数显示结果,并添加一个标题。

完整的Python代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像并转换为灰度图像
img = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)# 进行离散傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)# 设计高通滤波器并应用
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
R = 60
n = 2
D_0 = R / ((rows ** 2 + cols ** 2) ** 0.5)# 创建巴特沃斯高通滤波器
butterworth_highpass = np.zeros((rows, cols), dtype=np.float32)
for i in range(rows):for j in range(cols):distance = ((i - crow) ** 2 + (j - ccol) ** 2) ** 0.5butterworth_highpass[i, j] = 1 / (1 + (distance / D_0) ** (2 * n))# 将高通滤波器应用于频谱图像
filtered_spectrum = butterworth_highpass * dft_shift
filtered_spectrum = np.fft.ifftshift(filtered_spectrum)# 进行傅立叶逆变换并显示结果
filtered_image = cv2.idft(filtered_spectrum)
filtered_image = cv2.magnitude(filtered_image[:, :, 0], filtered_image[:, :, 1])
filtered_image = cv2.normalize(filtered_image, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)plt.imshow(filtered_image, cmap='gray')
plt.title('High Pass Filtered Image')
plt.show()

这个程序将在窗口中显示过滤后的图像,并保存为当前目录中的文件。

相关文章:

问题三十四:傅立叶变换——高通滤波

高通滤波器是一种可以通过去除图像低频信息来增强高频信息的滤波器。在图像处理中,高通滤波器常常用于去除模糊或平滑效果,以及增强边缘或细节。在本篇回答中,我们将使用Python和OpenCV实现高通滤波器。 Step 1:加载图像并进行傅…...

flink 键控状态(keyed state)

github开源项目flink-note的笔记。本博客的实现代码都写在项目的flink-state/src/main/java/state/keyed/KeyedStateDemo.java文件中。 项目github地址: github 1. flink键控状态 flink键控状态是作用与flink KeyedStream上的,也就是说需要将DataStream先进行keyby之后才能使…...

【ChatGPT】sqlachmey 多表连表查询语句

感受下科技带来的魅力,这篇文章是通过ChatGPT自动生成的,不得不说技术强大!!! 在SQLAlchemy中进行多表连接查询可以使用join()方法或join()函数,具体用法如下: join()方法 join()方法可以在SQLAlchemy ORM中的查询中使用。假设…...

win11 系统登录问题,PIN 设置问题

我的电脑配置是华为MateBook X Pro 12,i7处理器,16G,1T,win11 系统通过微软账户登录,下午一直登录不进去,网络能连外网,分析应该是连微软服务器不行。连续登录几十次,偶尔可能有一次…...

数据结构六大排序

1.插入排序 思路: 从第一个元素开始认为是有序的,去一个元素tem从有序序列从后往前扫描,如果该元素大于tem,将该元素一刀下一位,循环步骤3知道找到有序序列中小于等于的元素将tem插入到该元素后,如果已排序…...

快速生成QR码的方法:教你变成QR Code Master

目录 简介: 具体实现步骤: 一、可以使用Python中的qrcode和tkinter模块来生成QR码。以下是一个简单的例子,演示如何在Tkinter窗口中获取用户输入并使用qrcode生成QR码。 1)首先需要安装qrcode模块,可以使用以下命令在终端或命令…...

tensorflow1.14.0安装教程--保姆级

//方法不止一种,下面仅展示一种。 注:本人电脑为win11,anaconda的python版本为3.9,但tensorflow需要python版本为3.7,所以下面主要阐述将python版本改为3.7后的安装过程以及常遇到的问题。 1.首先电脑安装好anaconda…...

AcWing算法提高课-3.1.3香甜的黄油

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 题目传送门点这里 题目描述 农夫John发现了做出全威斯康辛州最甜的黄油的方法&#xff1a;糖。 把糖放在一片牧场上&#xff0c;他知道 N 只奶牛会过来舔它&#xff0c;这样就能做出能卖好价…...

私库搭建1:Nexus 安装 Docker 版

本文内容以语雀为准 文档 https://hub.docker.com/r/sonatype/nexus3Docker 安装&#xff1a;https://www.yuque.com/xuxiaowei-com-cn/gitlab-k8s/docker-install 安装 创建文件夹 由于 Nexus 的数据可能会很大&#xff0c;比如&#xff1a;作为 Docker、Maven 私库时&…...

LeetCode-面试题 05.02. 二进制数转字符串【数学,字符串,位运算】

LeetCode-面试题 05.02. 二进制数转字符串【数学&#xff0c;字符串&#xff0c;位运算】题目描述&#xff1a;解题思路一&#xff1a;简单暴力。小数点后面的二进制&#xff0c;now首先从0.5开始之和每次除以2。然后依次判断当前数是否大于now&#xff0c;是则答案加1。若等于…...

pandas: 三种算法实现递归分析Excel中各列相关性

目录 前言 目的 思路 代码实现 1. 循环遍历整个SDGs列&#xff0c;两两拿到数据 2. 调用pandas库函数直接进行分析 完整源码 运行效果 总结 前言 博主之前刚刚被学弟邀请参与了2023美赛&#xff0c;这也是第一次正式接触数学建模竞赛&#xff0c;现在已经提交等待结果…...

【Python百日进阶-Web开发-Vue3】Day543 - Vue3 商城后台 03:登录页面初建

文章目录 一、创建登录页面 login.vue二、登录页面响应式处理,以适应不同大小的屏幕2.1 element-plus 的layout布局中关于响应式的说明2.2 修改login.vue文件2.2.1 :lg=16 大于1200px 横排 2:12.2.2 :md=12 大于992小于1200px 横排 1:12.2.3 小于992 竖排三、引入Element-plus…...

python画直方图,刻画数据分布

先展示效果 准备一维数据 n 个数据元素计算最大值&#xff0c;最小值、均值、标准差、以及直方图分组 import numpy as np data list() for i in range(640):data.append(np.random.normal(1)) print(data)z np.histogram(data, bins64) print(list(z[0])) ### 对应 x 轴数据…...

几何学小课堂:非欧几何(广义相对论采用黎曼几何作为数学工具)【学数学关键是要学会在什么情况下,知道使用什么工具。】

文章目录 引言I 非欧几何1.1 黎曼几何1.2 共形几何1.3 罗氏几何II 黎曼几何的应用2.1 广义相对论2.2 超弦III 理解不同的几何体系的共存3.1 更扎实的欧氏几何3.2 殊途同归引言 公理有错会得到两种情况: 如果某一条自己设定的新公理和现有的公理相矛盾,那么相应的知识体系就建…...

Ubuntu配置静态IP的方法

Ubuntu配置静态IP的方法前言一、查看虚机分配的网卡IP二、查看网卡的网关IP三、配置静态IP1.配置IPv4地址2.执行netplan apply使改动生效3.配置的网卡未生效&#xff0c;修改50-cloud-init.yaml文件解决4.测试vlan网络通信总结前言 Ubuntu18.04 欧拉环境 vlan网络支持ipv6场景…...

90%的人都不算会爬虫,这才是真正的技术,从0到高手的进阶

很多人以为学会了urlib模块和xpath等几个解析库&#xff0c;学了Selenium就会算精通爬虫了&#xff0c;但到外面想靠爬虫技术接点私活&#xff0c;才发现寸步难行。 龙叔我做了近20年的程序员&#xff0c;今天就告诉你&#xff0c;真正的爬虫高手应该学哪些东西&#xff0c;就…...

排序之损失函数List-wise loss(系列3)

排序系列篇&#xff1a; 排序之指标集锦(系列1)原创 排序之损失函数pair-wise loss(系列2)排序之损失函数List-wise loss(系列3) 最早的关于list-wise的文章发表在Learning to Rank: From Pairwise Approach to Listwise Approach中&#xff0c;后面陆陆续续出了各种变形&#…...

js对象和原型、原型链的关系

JS的原型、原型链一直是比较难理解的内容&#xff0c;不少初学者甚至有一定经验的老鸟都不一定能完全说清楚&#xff0c;更多的"很可能"是一知半解&#xff0c;而这部分内容又是JS的核心内容&#xff0c;想要技术进阶的话肯定不能对这个概念一知半解&#xff0c;碰到…...

【SpringBoot高级篇】SpringBoot集成Sharding-JDBC分库分表

【SpringBoot高级篇】SpringBoot集成Sharding-JDBC分库分表Apache ShardingSphere分库分表分库分表的方式垂直切分垂直分表垂直分库水平切分水平分库水平分表分库分表带来的问题分库分表中间件Sharding-JDBCsharding-jdbc实现水平分表sharding-jdbc实现水平分库sharding-jdbc实…...

Shell特殊字符

shell语言&#xff0c;一些字符是有特殊意义的。 根据作用分为几种特殊符号 一、空白 shell调用函数&#xff0c;不像c语言那样用把参数放到括号里&#xff0c;用逗号分隔。而是用空格作为参数之间&#xff0c;参数与函数名之间的分隔符。 换行符也是特殊字符。换行符用作一条命…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...

未授权访问事件频发,我们应当如何应对?

在当下&#xff0c;数据已成为企业和组织的核心资产&#xff0c;是推动业务发展、决策制定以及创新的关键驱动力。然而&#xff0c;未授权访问这一隐匿的安全威胁&#xff0c;正如同高悬的达摩克利斯之剑&#xff0c;时刻威胁着数据的安全&#xff0c;一旦触发&#xff0c;便可…...