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

news2024/11/15 21:25:37

在这里插入图片描述
高通滤波器是一种可以通过去除图像低频信息来增强高频信息的滤波器。在图像处理中,高通滤波器常常用于去除模糊或平滑效果,以及增强边缘或细节。在本篇回答中,我们将使用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.5
        butterworth_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.5
        butterworth_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()

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

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

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

相关文章

JVM系统优化实践(6):年轻代、老年代与数据计算

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~上回说道如果当前Survivor区中年龄相同的一批对象总大小 ≥ Survivor总数 50%,那么这批对象及比它们年龄更大的对象,就都直接进入老年代。…

三八女神节有哪些数码好物?2023年三八女神节数码好物清单

2023年的三八女神节就快到了,大家还在烦恼,不知道有哪些数码好物?在此,我来给大家分享几款三八女神节实用性强的数码好物,一起来看看吧。 一、蓝牙耳机:南卡小音舱 参考价:239 推荐理由&…

flutter window安装过程

这里写自定义目录标题#下载相关官网地址:https://flutter.cn/docs/get-started/install/windows 根据官网下载相关包flutter_windows_3.7.5-stable.zip 解压到c盘,在path配置相关解压路径(c:\flutter)。 执行 where flutter dart ,发现没有提…

Pytorch深度学习实战3-5:详解计算图与自动微分机(附实例)

目录1 计算图原理2 基于计算图的传播3 神经网络计算图4 自动微分机5 Pytorch中的自动微分5.1 梯度缓存5.2 参数冻结1 计算图原理 计算图(Computational Graph)是机器学习领域中推导神经网络和其他模型算法,以及软件编程实现的有效工具。 计算图的核心是将模型表示…

Vue3 企业级项目实战:项目须知与课程约定

本节内容很重要,希望大家能够耐心看完。 Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发,升职加薪,快人一步。。「Vue3 企业级项目实战」由程序员十三撰写,2744人购买https://s.ju…

解决方案| anyRTC 融合其他厂商视频会议系统方案

背景 视频会议市场经历疫情后,不管是硬件视频会议还是云视频会议已经在各行各业铺开使用,特别是政府行业,职能部门除了几大硬件视频会议外,也开始逐渐尝试云视频会议,视频会议的场景运用除了日常的交流、沟通、学习外…

开启互联网赚钱模式

随着互联网的发展,现在几乎会玩手机和电脑的都离不开网络,自然出现了很多网络赚钱的项目,受到了很多新人创业者和做副业兼职者的欢迎。很多朋友都想利用电脑或手机在网上赚钱。其实不管做什么项目,都有一个过程,没有什…

【监控】Linux部署postgres_exporter及PG配置(非Docker)

目录一、下载及部署二、postgres_exporter配置1. 停止脚本stop.sh2. 启动脚本start.sh3. queries.yaml三、PostgreSQL数据库配置1. 修改postgresql.conf配置文件2. 创建用户、表、扩展等四、参考一、下载及部署 下载地址 选一个amd64下载 上传至服务器,解压 tax…

$ 6 :选择、循环

if-else语句 #include <stdio.h> //判断输入值是否大于0 int main() {int i;while (scanf("%d",&i)){if (i > 0)//不要在括号后加分号{printf("i is bigger than O\n");}else {printf("i is not bigger than O\n");}}return O; } …

cglib代理解析

工作原理 使用 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>对类和接口分别进行代理 DemoService package com.fanqiechaodan.user.service;/*** author fa…

itop-3568 开发板系统编程学习笔记(3)目录 IO

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录mkdir() 函数opendir() 和 closedir() 函数readdir() 函数综合实验mkdir() 函数 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h&g…

linux代码调试-gdb

在windows调试各类代码经常依托相关便利的IDE工具&#xff0c;如Microsoft的Visual Studio,TI的Code Composer Studio,ADI的CrossCore Embedded Studio ,ADI的VisualDSP&#xff0c;Renesas的CS for CC,NXP的S32 Design Studio…这些调试&#xff0c;或借助软、硬件仿真&#x…

JPA 之 Hibernate EntityManager 使用指南

Hibernate EntityManager 专题 参考&#xff1a; JPA – EntityManager常用API详解EntityManager基本概念 基本概念及获得 EntityManager 对象 基本概念 在使用持久化工具的时候&#xff0c;一般都有一个对象来操作数据库&#xff0c;在原生的Hibernate中叫做Session&…

排序之损失函数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;后面陆陆续续出了各种变形&#…

SpringBoot入门 - SpringBoot HelloWorld

我们了解了SpringBoot和SpringFramework的关系之后&#xff0c;我们可以开始创建一个Hello World级别的项目了。创建 SpringBoot Web 应用为快速进行开发&#xff0c;推荐你使用IDEA这类开发工具&#xff0c;它将大大提升你学习和开发的效率。选择 Spring InitializeSpring提供…

开源的 OA 办公系统 — 勾股 OA 4.3.01 发布

勾股 OA 办公系统是一款简单实用的开源的企业办公系统。系统集成了系统设置、人事管理、行政管理、消息管理、企业公告、知识库、审批流程设置、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理、任务管理等功能模块。系统简约&#xff0c;易于功能扩展&#xff0…

【vue】图标选择(elementUI和svg结合)

目标&#xff1a;在做菜单权限的时候需要选择图标&#xff0c;如果既想要用elementUI自带的图标&#xff0c;还想要自定义的图标&#xff0c;这时就需要二者结合一下如果用的是vue-admin-template&#xff0c;那svg组件和引入elementUI是不需要操作的&#xff0c;直接使用即可。…

pytest学习和使用17-Pytest如何重复执行用例?(pytest-repeat)

17-Pytest如何重复执行用例&#xff1f;&#xff08;pytest-repeat&#xff09;1 使用场景2 pytest-repeat插件2.1 环境要求2.2 插件安装3 pytest-repeat使用3.1 重复测试直到失败3.2 用例标记执行重复多次3.3 命令行参数--repeat-scope详解3.3.1 class示例3.3.2 module示例1 使…

如何在软件测试面试中脱颖而出?(附教程)天花板都这样回答

面试软件测试工程师岗位&#xff0c;是否真的如网上所说&#xff0c;需要不停刷面试题?面试题可能掌握的技巧实际是一样的&#xff0c;只是题目形式不一样&#xff0c;那么应该如何在面试中脱颖而出呢?今天我们就来聊一聊。 我录制了一整套完整的软件测试面试的话术教程&…

拿下32k成功入职阿里软件测试面试常见问题及回答技巧

1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容…