《数字图像处理-OpenCV/Python》连载:傅里叶变换与频域滤波

《数字图像处理-OpenCV/Python》连载:空间滤波之高斯滤波器


本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第 11 章 傅里叶变换与频域滤波


空间图像滤波是图像与滤波器核的卷积,而空间卷积的傅里叶变换是频域中相应变换的乘积。因此,频域图像滤波是通过频域滤波器(传递函数)与图像的傅里叶变换相乘得到的。频域中的滤波概念更加直观,滤波器设计也更容易。


本章内容概要

  • 学习二维离散傅里叶变换的实现方法,介绍快速傅里叶变换的原理。
  • 学习频域滤波的基本步骤,以及构造滤波器传递函数的基本方法。
  • 学习常用的频域滤波器,如理想滤波器、高斯滤波器、巴特沃斯滤波器。
  • 介绍低通、高通、带通、带阻滤波器的关系,构造选择性滤波器。
  • 认识和比较空间滤波与频域滤波。

11.3 频域滤波的基本步骤

傅里叶变换的目的是将图像从空间域转换到频域,在频域内进行图像处理。

空间取样和频率间隔是相互对应的,频域中的样本间隔与空间样本间隔及样本数量的乘积成反比。空间滤波器和频域滤波器也是相互对应的,二者能形成如下的傅里叶变换对。

因此,计算两个函数的空间卷积,可以直接在空间域计算,也可以在频域计算。先计算每个函数的傅里叶变换,再将两个变换相乘,最后进行傅里叶逆变换转换回空间域。

频域图像滤波首先要对原始图像 f(x,y)做傅里叶变换 F(u,v) ;然后用滤波器传递函数 H(u,v) 对傅里叶变换的频谱进行处理,做傅里叶逆变换返回空间域,得到滤波图像 g(x,y)。具体变换过程如下。

(1) 对原始图像 f(x,y) 进行傅里叶变换和中心化,得到 F(u,v) 。
(2) 将图像的傅里叶变换 F(u,v) 与滤波器传递函数 H(u,v) 相乘,得到滤波频谱 G(u,v) 。
(3) 对 G(u,v) 进行逆中心化和傅里叶逆变换,得到滤波图像 g(x,y)。

使用尺寸最优扩充的快速傅里叶变换时,还包括变换前的图像扩充和变换后的图像裁剪。


【例程1104】频域图像滤波的基本步骤

本例程以理想低通滤波器为例,示范频域图像滤波的基本步骤。

设计低通滤波器的过程,是构造二维掩模图像的过程。简单地,构造一个中心开窗的遮罩图像,在黑色图像的中心区域设有白色窗口,就构成了一个低通滤波器。


# 【1104】频域图像滤波的基本步骤
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

def ideaLPF(height, width, radius=10):  # 理想低通滤波器
    u, v = np.mgrid[-1:1:2.0/height, -1:1:2.0/width]
    Dist = cv.magnitude(u, v)
    D0 = radius/height  # 滤波器半径
    kernel = np.zeros((height, width), np.uint8)
    kernel[Dist <= D0] = 1
    return kernel

if __name__ == '__main__':
    # img = cv.imread("../images/Fig0515a.tif", flags=0)  # 读取为灰度图像
    img = cv.imread("../images/Fig1101.png", flags=0)  # 读取灰度图像
    height, width = img.shape[:2]  # (688,688)

    # (1) 对图像进行傅里叶变换,并将低频分量移动到中心
    imgFloat = img.astype(np.float32)  # 将图像转换成 float32
    dft = cv.dft(imgFloat, flags=cv.DFT_COMPLEX_OUTPUT)  # (512,512,2)
    dftShift = np.fft.fftshift(dft)  # (512,512,2)

    r = [30, 60, 90]  # 低通滤波器的半径
    plt.figure(figsize=(9, 6))
    for i in range(3):
        # (2) 构造低通滤波器
        mask = ideaLPF(height, width, r[i])  # 理想低通滤波器
        maskDual = cv.merge([mask, mask])  # 拼接为两个通道:(h,w,2)
        # maskAmp = cv.magnitude(mask, mask)  # 幅度谱

        # (3) 修改傅里叶变换实现频域图像滤波
        dftMask = dftShift * maskDual  # 两个通道分别为实部和虚部

        # (4) 逆中心化后进行傅里叶逆变换
        iShift = np.fft.ifftshift(dftMask)  # 将低频逆转换回图像四角
        iDft = cv.idft(iShift)  # 傅里叶逆变换
        iDftMag = cv.magnitude(iDft[:,:,0], iDft[:,:,1])  # 重建图像
        imgLPF = np.uint8(cv.normalize(iDftMag, None, 0, 255, cv.NORM_MINMAX))

        plt.subplot(2,3,i+1), plt.title("Mask (r={})".format(r[i]))
        plt.axis('off'), plt.imshow(mask, cmap='gray')
        plt.subplot(2,3,i+4), plt.title("LPF image (r={})".format(r[i]))
        plt.axis('off'), plt.imshow(imgLPF, cmap='gray')

    print(img.shape, dft.shape, maskDual.shape)
    plt.tight_layout()
    plt.show()

运行结果:

程序说明:

(1) OpenCV中的傅里叶变换结果保存为实部和虚部两个通道,dft的形状为(h,w,2)。因此要把单通道滤波器mask拼接为两个通道的maskDual,才能将dft与maskDual相乘。
(2) 傅里叶变换和傅里叶逆变换的结果都包括实部和虚部,使用函数cv.magnitude转换为幅度谱才能得到显示图像。
(3) 函数cv.dft的可选参数较多,在设置转换类型标志时不能省略关键字flags。
(4) 运行结果,频域滤波之理想低通滤波器如图11-2所示。从图中可以发现,低通滤波器的截止频率越小,保留的低频信息越少,滤除的高频信息越多,图像越模糊。这与空间域低通滤波的结果是一致的。
(5) 注意,滤波器传递函数与图像傅里叶变换进行乘法运算时,不能使用函数cv.multiply,因其是饱和运算。


在这里插入图片描述

图11-2 频域滤波之理想低通滤波器


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/135705738)
Copyright 2024 youcans, XUPT
Crated:2024-01-20

《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql B+树索引

数据库索引用于提高查询性能和数据访问效率。索引可以加速数据的查找和筛选&#xff0c;减少查询的时间复杂度。数据库索引有很多类型&#xff0c;这里不展开也不比较&#xff0c;只介绍最常见一种索引结构B树索引。mysql中InnoDB引擎默认使用的就是BTREE索引。 B树数据结构 …

实验三 Oracle数据库的创建和管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

fastjson-BCEL不出网打法原理分析

FastJson反序列化漏洞 与原生的 Java 反序列化的区别在于&#xff0c;FastJson 反序列化并未使用 readObject 方法&#xff0c;而是由 FastJson 自定一套反序列化的过程。通过在反序列化的过程中自动调用类属性的 setter 方法和 getter 方法&#xff0c;将JSON 字符串还原成对…

我在代码随想录|写代码Day9之28. 实现 strStr(),459. 重复的子字符串,55. 右旋字符串(第八期模拟笔试)

博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 28. 实现 strStr() 题目; 代码 1 class Solution { public: //KMPint strStr(string s, string t) {int n s.size(),mt.size();if(m0) return 0;s.insert(s.begin(), );t.insert(t.begin(), );vector<int> next(m1);…

容器技术1-容器与镜像简介

目录 1、容器与虚拟化 2、容器发展历程 3、镜像简介 4、镜像原理 &#xff08;1&#xff09;分层存储 &#xff08;2&#xff09;写时复制 &#xff08;3&#xff09;内容寻址 &#xff08;4&#xff09;联合挂载 1、容器与虚拟化 容器技术在操作系统层面实现了对计算机…

基于ORB算法的图像匹配

基础理论 2006年Rosten和Drummond提出一种使用决策树学习方法加速的角点检测算法&#xff0c;即FAST算法&#xff0c;该算法认为若某点像素值与其周围某邻域内一定数量的点的像素值相差较大&#xff0c;则该像素可能是角点。 其计算步骤如下&#xff1a; 1&#xff09;基于F…

个人实现的QT拼图游戏(开源),QT拖拽事件详解

文章目录 效果图引言玩法 拖拽概念基本概念如何在Qt中使用拖放注意事项 游戏关键问题总结 效果图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c6dd66befd314442adf07e1dec0d550c.png 引言 在学习QT demo时&#xff0c;发现有一个拼图demo&#xff0c;介绍拖…

LLVM 环境配置

这里选择下载源码, 然后编译的安装方式。 下载地址 (在这里可以找到多版本, 多平台的LLVM下载资源) # 解压源码 sudo tar xvf llvm-project-17.0.6.src.tar.xz # 新建安装目录 sudo mkdir -p /usr/local/llvm # 新建编译目录 sudo mkdir -p llvm-project-17.0.6.src/build #…

非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (I - 原理与算法)

Title: 非线性最小二乘问题的数值方法 —— 狗腿法 Powell’s Dog Leg Method (I - 原理与算法) 文章目录 I. 前言II. 线搜索类型和信赖域类型1. 线搜索类型 —— 最速下降法2. 信赖域类型3. 柯西点 III. 狗腿法的原理1. 狗腿法的构建2. 狗腿法的优化说明3. 狗腿法的插值权重 I…

Java中打印图案最常用的25个图案程序

Java是公认的最流行的编程语言&#xff0c;因为它的简单性和多功能性。还可以使用它开发各种应用程序&#xff0c;包括Web、移动和桌面应用程序。此外&#xff0c;Java为开发人员提供了强大的工具来轻松高效地创建复杂的程序。Java最有前途的特性之一是它能够创建可以以特定格式…

Linux环境下部署Tomcat(详细图文)

目录 一、下载地址 1.服务器不能联网情况下载 2.服务器能够联网 二、安装 1. Tomcat解压 2. Tomcat目录说明&#xff1a; 3. 重命名解压后的文件名 4. 配置环境变量 5. 修改配置文件 6.启动Tomcat 7.访问Tomcat 8. 停止Tomcat 一、下载地址 1.服务器不能联网情况下…

PyTorch视觉工具箱:图像变换与上采样技术详解(1)

目录 Pytorch中Vision functions详解 pixel_shuffle 用途 用法 使用技巧 注意事项 参数 数学理论公式 示例代码及输出 pixel_unshuffle 用途 用法 使用技巧 注意事项 参数 数学理论公式 示例代码及输出 pad 用途 用法 使用技巧 注意事项 参数 示例代码…

SMT回流焊工艺之回流温度曲线

引言 在SMT生产流程中&#xff0c;如何控制回焊炉的温度是非常重要的一环&#xff0c;好的炉温曲线图意味着可以形成良好的焊点。 上一期分享&#xff08;SMT回流焊温度解析之锡膏焊接特性&#xff09;中&#xff0c;我们着重介绍了SMT回流工艺中的锡膏焊接部分。本期内容主要…

Leetcode2957. 消除相邻近似相等字符

Every day a Leetcode 题目来源&#xff1a;2957. 消除相邻近似相等字符 解法1&#xff1a;遍历 分类讨论 遍历字符串 word&#xff0c;比较相邻的 3 个元素 word[i - 1]、word[i] 和 word[i 1]&#xff0c;记 left_distance abs(mid - left)&#xff0c;right_distance…

大模型背景下计算机视觉年终思考小结(二)

1. 引言 尽管在过去的一年里大模型在计算机视觉领域取得了令人瞩目的快速发展&#xff0c;但是考虑到大模型的训练成本和对算力的依赖&#xff0c;更多切实的思考是如果在我们特定的小规模落地场景下的来辅助我们提升开发和落地效率。本文从相关数据集构造&#xff0c;预刷和生…

rust使用protobuf

前言 c,java,go 等直接是用 &#xff0c;具体就不说了&#xff0c;这章主要讲述rust 使用protobuf 这章主要讲述2种 1 > protoc protoc-gen-rust plugin 2> protoc prost-build 1&#xff1a;环境 win10 rustrover64 25-2 下载地址 https://github.com/protocolbu…

《WebKit 技术内幕》之四(3): 资源加载和网络栈

3. 网络栈 3.1 WebKit的网络设施 WebKit的资源加载其实是交由各个移植来实现的&#xff0c;所以WebCore其实并没有什么特别的基础设施&#xff0c;每个移植的网络实现是非常不一样的。 从WebKit的代码结构中可以看出&#xff0c;网络部分代码的确比较少的&#xff0c;它们都在…

2.4 网络层03

2.4 网络层03 2.4.7 路由表 1、什么是路由&#xff1f; 路由就是报文从源端到目的端的路径。当报文从路由器到目的网段有多条路由可达时&#xff0c;路由器可以根据路由表中最佳路由进行转发。 2、什么是路由表&#xff1f; 在计算机网络中&#xff0c;路由表&#xff08…

鸿蒙原生应用/元服务实战-AGC中几个菜单栏的关系

大家是否清楚AGC这几个菜单栏的相互关系&#xff1f; 我的元服务&#xff1a;点击后跳转到“我的应用”列表中的“HarmonyOS”页签&#xff0c;并且过滤出元服务。开发者可以在此模块中管理和运营元服务&#xff0c;例如创建元服务、发布元服务等。 我的应用&#xff1a;开发者…

2024最新Java高频面试题总结(附答案PDF)春招面试必备!

《Java面试全解析》1000道 面试题大全详解 本人是 2009 年参加编程工作的&#xff0c;一路上在技术公司摸爬滚打&#xff0c;前几年一直在上海&#xff0c;待过的公司有 360 和游久游戏&#xff0c;因为自己家庭的原因&#xff0c;放弃了阿里钉钉团队的 offer 回到了西安。 从…
最新文章