傅里叶变换,高通,低通滤波

2023-11-08


# --------------------------傅里叶变换
#
# 傅里叶变换的作用
#
# 高频:  变化剧烈的灰度分量,例如边界
# 低频:  变化缓慢的灰度变量,例如一片大海

# ------------------滤波
# 低通滤波器只保留低频,会使头像模糊。
# 高通滤波器只保留高频,会使图像细节增强。
# opencv主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32格式
# 得到的结果中,频率为0的部分会在左上角。通常要转换到中心位置,可以通过shift变换化来实现
# cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0-255)
# import numpy as np
# import cv2
# from matplotlib import pyplot as plt
#
# img = cv2.imread('D:\\images\\tiger.jpg', 0)
# img_float32 = np.float32(img)
#
# dft = cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)
# dft_shift = np.fft.fftshift(dft)
# # 得到灰度图像表示的形式
#
# mag = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
#
# plt.subplot(121), plt.imshow(img, cmap='gray')
# plt.title('Input Image'), plt.xticks([]), plt.yticks([])
# plt.subplot(122), plt.imshow(mag, cmap='gray')
# plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
# plt.show()


# ---------------------------------------低通滤波

'''
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 第一步读入图片
img = cv2.imread('D:\\images\\tiger.jpg', 0)  # 0表示灰度图

# 第二步:进行数据类型转换
img_float32 = np.float32(img)  # 必须转换
# 第三步:使用cv2.dft进行傅里叶变化
dft = cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)
# 第四步:使用np.fft.fftshift将低频转移到图像中心
dft_shift = np.fft.fftshift(dft)  # 将左上角的低频移动至中心

# 第五步:定义掩模:生成的掩模中间为1周围为0
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)  # 中心位置,方便确定掩膜

# 低通滤波
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

# 第六步:将掩模与傅里叶变化后图像相乘,保留中间部分
fshift = dft_shift * mask
# 第七步:使用np.fft.ifftshift(将低频移动到原来的位置
f_ishift = np.fft.ifftshift(fshift)
# 第八步:使用cv2.idft进行傅里叶的反变化
img_back = cv2.idft(f_ishift)
# 第九步:使用cv2.magnitude转化为空间域内
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
# 第十步:进行绘图操作
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()
'''

# -------------------------------高通滤波
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 第一步读入图片
img = cv2.imread('D:\\images\\tiger.jpg', 0)  # 0表示灰度图

# 第二步:进行数据类型转换
img_float32 = np.float32(img)  # 必须转换
# 第三步:使用cv2.dft进行傅里叶变化
dft = cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)
# 第四步:使用np.fft.fftshift将低频转移到图像中心
dft_shift = np.fft.fftshift(dft)  # 将左上角的低频移动至中心

# 第五步:定义掩模:生成的掩模中间为1周围为0
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)  # 中心位置,方便确定掩膜

# 高通滤波
mask = np.ones((rows, cols, 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0

# 第六步:将掩模与傅里叶变化后图像相乘,保留中间部分
fshift = dft_shift * mask
# 第七步:使用np.fft.ifftshift(将低频移动到原来的位置
f_ishift = np.fft.ifftshift(fshift)
# 第八步:使用cv2.idft进行傅里叶的反变化
img_back = cv2.idft(f_ishift)
# 第九步:使用cv2.magnitude转化为空间域内
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
# 第十步:进行绘图操作
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()

一  :傅里叶变换

几个函数的说明:

(1)cv2.dft()函数:进行傅里叶变化。

cv2.dft(原始图像,转换标识)

参数说明:

原始图像的格式必须是np.float32格式

转换标识一般是cv2.DFT_COMPLEX_OUTPUT用来输出一个复数阵列。

(2)np.fft.fftshift(img)   将图像中的低频部分移动到图像的中心。

参数说明:

img表示输入的图片

(3)cv2.magnitude(x,y)计算矩阵维度的平方根sqrt(x^2+y^2)

参数说明:

需要进行x和y平方的数。

(4)np.fft.ifftshift(img)   将图像的低频和高频部分移动到图像原来的位置。(注意和np.fft.fftshift(img)区别)

参数说明:

img表示输入的图片

(5) cv2.idft(img)进行傅里叶的逆变化

参数说明:

img表示经过傅里叶变化后的图片

import cv2
import numpy as np
import matplotlib.pyplot as plt

'''
第一步:载入图片

第二步:使用np.float32进行格式转换

第三步:使用cv2.dft进行傅里叶变化

第四步:使用np.fft.shiftfft将低频转移到中间位置

第五步:使用cv2.magnitude将实部和虚部投影到空间域

第六步:进行作图操作
'''

img = cv2.imread('D:\\images\\tiger.jpg',0)#0表示灰度图

img_float32 = np.float32(img)#必须转换

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)#将左上角的低频移动至中心
#得到灰度图能表示的形式
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))#0,1表示实部虚部两个通道,:,:,表示图像像素坐标,20*log,是将结果映射到0-255的公式

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'),plt.xticks([]),plt.yticks([])
plt.show()

输出

 二   :再通过低通滤波能够得到

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 第一步读入图片
img = cv2.imread('D:\\images\\tiger.jpg',0)#0表示灰度图

# 第二步:进行数据类型转换
img_float32 = np.float32(img)#必须转换
# 第三步:使用cv2.dft进行傅里叶变化
dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
# 第四步:使用np.fft.fftshift将低频转移到图像中心
dft_shift = np.fft.fftshift(dft)#将左上角的低频移动至中心

# 第五步:定义掩模:生成的掩模中间为1周围为0
rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2)   #中心位置,方便确定掩膜

#低通滤波
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

# 第六步:将掩模与傅里叶变化后图像相乘,保留中间部分
fshift = dft_shift*mask
# 第七步:使用np.fft.ifftshift(将低频移动到原来的位置
f_ishift = np.fft.ifftshift(fshift)
# 第八步:使用cv2.idft进行傅里叶的反变化
img_back = cv2.idft(f_ishift)
# 第九步:使用cv2.magnitude转化为空间域内
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
# 第十步:进行绘图操作
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'),plt.xticks([]),plt.yticks([])
plt.show()

 

得到的图像比原始图像更加模糊

三   通过高通滤波可以得到。

能够得到图片的轮廓。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 第一步读入图片
img = cv2.imread('D:\\images\\tiger.jpg', 0)  # 0表示灰度图

# 第二步:进行数据类型转换
img_float32 = np.float32(img)  # 必须转换
# 第三步:使用cv2.dft进行傅里叶变化
dft = cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)
# 第四步:使用np.fft.fftshift将低频转移到图像中心
dft_shift = np.fft.fftshift(dft)  # 将左上角的低频移动至中心

# 第五步:定义掩模:生成的掩模中间为1周围为0
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)  # 中心位置,方便确定掩膜

# 高通滤波
mask = np.ones((rows, cols, 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0

# 第六步:将掩模与傅里叶变化后图像相乘,保留中间部分
fshift = dft_shift * mask
# 第七步:使用np.fft.ifftshift(将低频移动到原来的位置
f_ishift = np.fft.ifftshift(fshift)
# 第八步:使用cv2.idft进行傅里叶的反变化
img_back = cv2.idft(f_ishift)
# 第九步:使用cv2.magnitude转化为空间域内
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
# 第十步:进行绘图操作
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

傅里叶变换,高通,低通滤波 的相关文章

  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 关于uniapp将H5网页编译为微信小程序样式错乱

    在控制台看了下出现警告Some selectors are not allowed in component wxss including tag name selectors ID selectors and attribute sele
  • jsonpath - 使用 JSONPath 解析 JSON 完整内容详解

    目录 1 操作符 2 函数 3 过滤器运算符 4 Java操作示例 5 阅读文档 何时返回 谓词 6 调整配置 7 Java操作示例源码 json Java 输出 示例2 Java 输出 过滤器示例 Java 输出 JsonPath是一种简
  • python 实现信息熵、条件熵、信息增益、基尼系数

    在这里插入代码片注 该代码为慕课网课程中老师讲解 python import pandas as pd import numpy as np import math 计算信息熵 def getEntropy s 找到各个不同取值出现的次数
  • 相机系统综述 —— ISP

    转 http kernel meizu com camera isp intro html ISP Image Signal Processor 即图像信号处理器 用于处理图像信号传感器输出的图像信号 它在相机系统中占有核心主导的地位 是构
  • 网络 — MB/s、Mb/s、Mbps、Mbit/s、Kbps

    MB s 兆字节每秒 Mb s 兆比特每秒 Mbps 兆比特每秒 Mbit s 兆比特每秒 Kbps 千比特每秒 1Byte 字节 8 bit 比特 1B 8b 1MB 百万字节也称兆字节 8 Mb 1Mb 0 125MB 1Kb 1024
  • java yyyy-mm-dd 日期格式_Java中的日期时间格式化

    原标题 Java中的日期时间格式化 1 Java日期时间格式化的概念 我们在日常的开发过程中常常会碰到关于日期时间的计算与存储问题 比如我们要把一个当前时间类型转换成字符串类型 我们会直接使用Util包下的Date数据类型 java uti
  • unity Screen.width, Screen.height

    如果事从编译器调用这个函数 获取的值不正确 获取的是editorwindow的大小
  • 国产自主研发,完全可控 IDE!

    最近 互联网上逐渐有些热闹 日本福岛核废水排海计划 中国自主研发 IDE 作为一名开发者 自然好奇国产自主研发的 IDE 不禁夸赞吾国威武 某方面领域越来越强 该产品名为 CEC IDE 是由数字广东公司联合麒麟软件打造国内首款适配国产操作
  • 乐高叉车wedo教案_24乐高教育wedo编程摩天轮教案

    1 人小组 时长 1 5 活动目标 巩固对三角形结构的稳定性的认识 认识重力的方向是垂直向下 活动准备 9886 套装 摩天轮图片 活动过程 备注 联 系 20 一 互动问大家去游乐园座过摩天轮没有 二 看视频了解摩天轮能座在上面旋转 很高
  • dotnet java_我所理解的JAVA和 DotNet

    Java 从实用性来讲 Java 可以说是第一种 网页 语言 尽管像 Perl 等语言会突然发现它们处理字符串的能力在恢复价值和发送 HTML 到网页浏览器上是天生的 但是 Java 是最早发现自己是根植于浏览器中 最初是在一个有趣但却非常
  • Python基础知识点总结

    https www cnblogs com wu chao p 8421708 html Python中pass语句的作用是什么 pass语句不会执行任何操作 一般作为占位符或者创建占位程序 Python是如何进行类型转换的 Python提
  • python下的pyecharts应用4----绘制cpu折线图

    要求 1 截止到运行一刻 2 每秒钟监测 3 绘制折线图 设计 获取cpu的代码如下 1 获取系统cpu占有率的信息 import psutil import time 隔1s绘制cpu的占有率 gt 持久化的保存 如何将时间和对应的cpu
  • html5 页面可以上下滚动条,h5页面上下左右滑动

    var startX 0 startY 0 operate 0 backDom addEventListener touchstart function evt evt preventDefault var touch evt touche
  • js身份证号校验

    if card console log 请输入身份证号 身份证号不能为空 return false if isCardNo card false console log 您输入的身份证号码不正确 return false 检查省份 if c
  • 西门子PLC的常见的通讯方式

    1 PPI通信 T PPI协议是S7 200cpu最基本的通信方式 S7 200cpu的默认通信方式可通过原端口通信 西门子PLC是一种专为工业环境应用而设计的数字操作电子系统 可编程存储器 存储逻辑操作 顺序控制 定时 计数 算术操作等指
  • Ubuntu常用命令汇集

    ubuntu常用命令汇集 文章目录 一 文件组织结构 二 常用命令 三 权限 一 文件组织结构 为根目录 为系统最基本的目录 home下有用户名的文件夹 该文件夹就是 为主目录 为日常使用的目录 命令在终端中输入 需要注意当前所在的文件夹
  • 神经网络学习小记录64——Pytorch 图像处理中注意力机制的解析与代码详解

    神经网络学习小记录64 Pytorch 图像处理中注意力机制的解析与代码详解 学习前言 什么是注意力机制 代码下载 注意力机制的实现方式 1 SENet的实现 2 CBAM的实现 3 ECA的实现 注意力机制的应用 学习前言 注意力机制是一
  • 第2课:Scratch介绍

    什么是Scratch Scratch 一款免费的图形化少儿编程工具 由麻省理工学院设计开发 它是完全免费的 它将一大片代码变成一个个功能模块 界面非常清晰 小朋友可以像搭积木一样做出自己的游戏程序 对于低年级的小朋友很容易上手 而且很容易培
  • 使用k8s业务在十几分钟无人使用时,访问报错问题

    业务放入k8s测试中发现当十几分钟没有访问 再次访问时就会报错 刷新后业务正常 一直访问故障不复现 通过整体测试发现Redis自动断开连接 redis在使用net网络模式时会出现自动断开问题 升级Redis版本后解决
  • 傅里叶变换,高通,低通滤波

    傅里叶变换 傅里叶变换的作用 高频 变化剧烈的灰度分量 例如边界 低频 变化缓慢的灰度变量 例如一片大海 滤波 低通滤波器只保留低频 会使头像模糊 高通滤波器只保留高频 会使图像细节增强 opencv主要就是cv2 dft 和cv2 idf