我谈冈萨雷斯对频域滤波的误解——快速卷积与频域滤波之间的关系

在Rafael Gonzalez和Richard Woods所著的《数字图像处理》中,Gonzalez对频域滤波是有误解的,在频域设计滤波器不是非得图像和滤波器的尺寸相同,不是非得在频域通过乘积实现。相反,FIR滤波器设计都是构造空域脉冲响应。一般的原则是,小尺寸的滤波器在空域通过卷积实现更快,大尺寸的滤波器在频域通过频域滤波实现更快。

这里就引出一个快速卷积的概念,实际上原理上很简单,基础就是卷积定理。只是很多人没想过这个问题。

直接计算两个长度分别为N和M的离列序列的线性卷积需要 O ( N ∗ M ) O(N*M) O(NM)次乘法运算,当N和M较大时,这将是一个相当耗时的过程。

快速卷积是指使用快速傅里叶变换(Fast Fourier Transform, FFT)来加速两个序列的线性卷积的过程。

利用FFT可以将时间域中的卷积转换为频率域中的点乘运算,从而减少所需的计算量。具体步骤如下:

  1. 补零:首先,为了防止循环卷积带来的边界效应,通常需要将两个序列都扩展到至少N+M-1的长度,通常是选择2的幂次大小,这样更有利于FFT算法的实现。
  2. 执行FFT:对补零后的两个序列分别进行快速傅里叶变换。
  3. 频域相乘:将两个变换后的序列逐点相乘。
  4. 逆FFT:对相乘结果执行逆快速傅里叶变换(Inverse Fast Fourier Transform, IFFT),得到最终的卷积结果。
  5. 调整结果:由于使用了IFFT,可能需要对输出结果做一些调整,比如去除因补零而引入的额外部分。

这种方法的时间复杂度主要由FFT/IFFT决定,对于长度为 L L L的序列,其时间复杂度大约是 O ( L log ⁡ L ) O(L \log L) O(LlogL)

Using the typical convolution formula to compute the one-dimensional convolution of a P-element sequence A with Q-element sequence B has a computational complexity of O ( P Q ) O(PQ) O(PQ). However, the discrete Fourier transform (DFT)
can be used to implement convolution as follows:

  1. Compute the L-point DFT of A, where L ≥ P + Q − 1 L \geq P + Q - 1 LP+Q1.

  2. Compute the L-point DFT of B.

  3. Multiply the two DFTs.

  4. Compute the inverse DFT to get the convolution.

The overall computational complexity of these steps is O ( L log ⁡ L ) O(L\log L) O(LlogL). For P and
Q sufficiently large, then, using the DFT to implement convolution is a
computational win.

See the function fftfilt in the Signal Processing Toolbox.

在图像处理中,滤波通常用卷积实现。使用傅里叶变换对两个矩阵执行快速卷积。傅里叶变换的一个关键特性是两个傅里叶变换相乘对应于相关联的空间函数的卷积。此特性与快速傅里叶变换一起构成了快速卷积算法的基础。

基于 FFT 的卷积方法最常用于大型输入。对于小型输入,使用 imfilter 函数通常更快。

图中不同尺寸模糊核,两种方法的时间开销。卷积计算随尺寸持续增加,而基于FFT的运算基本稳定。
在这里插入图片描述

clear
close all
%% Read Image
name = 'Tsinghua Gate 512';
suffix = '.bmp';
Img = im2double(imread( ['images/', name, suffix] )) ;
sigmas = 21:31;
for k = 1:numel(sigmas)sigma = sigmas(k);hsize(k) = 2*ceil(3*sigma) + 1;psf   = fspecial( 'gaussian' , hsize(k), sigma );t_fft(k) = timeit(@() imfilter_fft(Img, psf)); %full convolutiont_normal(k) = timeit(@() imfilter(Img,psf,'circular'));
endfigure;
plot(hsize, t_normal, 'x-', hsize, t_fft, '*-', 'LineWidth',1)
grid on
xlabel('Kernel Size')
ylabel('Time/s')
box off
legend({'imfilter computation', 'FFT-based computation'},'Location','northwest')
title('Gaussian Filtering')%%
function y = imfilter_fft(x, psf)X = fft2(x);
OTF = psf2otf(psf, size(x));
y = ifft2(X.*OTF);end

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

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

相关文章

Hello World C#

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System; 引入了System命名空间,基本输入输出。一般只用这个,后面的不用 using System.Collections.Generic; 包含了定…

AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。

大家好,我是微学AI,今天给大家介绍一下AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。本文利用专家模…

Linux下,用ufw实现端口关闭、流量控制(二)

本文是 网安小白的端口关闭实践 的续篇。 海量报文,一手掌握,你值得拥有,让我们开始吧~ ufw 与 iptables的关系 理论介绍: ufw(Uncomplicated Firewall)是一个基于iptables的前端工具&#xf…

@staticmethod、@classmethod

staticmethod 静态方法:staticmethod将一个普通函数嵌入到类中,使其成为类的静态方法。静态方法不需要一个类实例即可被调用,同时它也不需要访问类实例的状态。参数:静态方法可以接受任何参数,但通常不使用self或cls作…

MySQL之数据完整性

数据的完整性约束可以分为三类: 实体完整性、域完整性和引用完整性。 说来说去(说主键,外键,以及⼀些约束) 1、实体完整性 (实体就是行) 什么是关系型数据库? 一个表代表一类事务&#xff0…

echarts的双X轴,父级居中的相关配置

前言:折腾了一个星期,在最后一天中午,都快要放弃了,后来坚持下来,才有下面结果。 这个效果就相当是复合表头,第一行是子级,第二行是父级。 子级是奇数个时,父级label居中很简单&…

配置宝塔php curl 支持http/2 发送苹果apns消息推送

由于宝塔面板默认的php编译的curl未加入http2的支持,如果服务需要使用apns推送等需要http2.0的访问就会失败,所以重新编译php让其支持http2.0 编译方法: 一、安装nghttp2 git clone https://github.com/tatsuhiro-t/nghttp2.git cd nghttp…

记录一次网关异常

记一次网关异常 网关时不时就会出现下面的异常。关键是不知道什么时候就会报错,并且有时候就算什么都不操作,也会导致这个异常。 ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in schedul…

Spring Boot开发——整合MyBatis的几种SQL写法

文章目录 1. 批量操作优化• 批量插入• 批量更新• 批量删除2. 动态SQL• 动态查询3. 多条件分支查询• 多条件分支查询4. SQL语句优化• SQL语句优化5. 自动生成主键• 自动生成主键6. 注解方式使用MyBatis• 注解方式示例7. 高级映射• 一对多映射8. MyBatis-Plus集成• MyB…

关于望远镜偏振校准源的一些记录

确定主要的偏振校准模型: 你需要一个最好的源,稳定偏振明确的校准作为主要模型例如:3C286,3C138,3C48 偏振位置角的校准:3C286,3C138,3C48(3C48一般用在6cm及以下的波段使…

解决 Flutter Dio合并请求多个接口,如果一个接口500,那么导致其他请求不在执行

Flutter Dio如何自定义拦截异常 应用场景 我们一般会统一拦截DioExceptionType 如400,403,500 等错误 但有时候,有个地方合并请求多个接口,如果一个接口500,那么导致其他请求不在执行,因为统一拦截了500&…

动态艺术:用Python将文字融入GIF动画

文章内容: 在数字媒体的多样化发展中,GIF动画作为一种流行的表达形式,常被用于广告、社交媒体和娱乐。本文通过一个具体的Python编程示例,展示了如何将文字以动态形式融入到GIF动画中,创造出具有视觉冲击力的动态艺术…

@antv/x6 再vue中 ,自定义图形,画流程图、数据建模、er图等图形

X6 是基于 HTML 和 SVG 的图编辑引擎,提供低成本的定制能力和开箱即用的内置扩展,方便我们快速搭建 DAG 图、ER 图、流程图、血缘图等应用。 最终效果图 1.安装 npm install antv/x6 --save //x6主要包 npm install antv/x6-vue-shape //使用vue组…

【k8s】k8s 中X.509 客户端证书验证机制

Kubernetes 使用 X.509 客户端证书进行身份验证是一种常见的方法。这种机制通过客户端证书来验证用户或应用程序的身份。以下是 Kubernetes 中 X.509 客户端证书验证机制的详细说明: 1. 生成客户端证书 首先,你需要生成客户端证书和私钥。这通常使用 O…

2.4特征预处理(机器学习)

2.4特征预处理 2.4.1 什么是特征预处理 通过 一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。 1 包含内容 数值型数据的无量纲化: 归一化 标准化 2 特征预处理API sklearn.preprocessing 为什么要进行归一化/标准化? 特征的单…

前端、后端、测试?如何选择

目录 一、前端开发 (一)职业概述 (二)需学习的技术 二、后端开发 (一)职业概述 (二)需学习的技术 三、测试 (一)职业概述 (二&#xff0…

AI - 谈谈RAG中的查询分析(2)

AI - 谈谈RAG中的查询分析(2) 大家好,RAG中的查询分析是比较有趣的一个点,内容丰富,并不是一句话能聊的清楚的。今天接着上一篇,继续探讨RAG中的查询分析,并在功能层面和代码层面持续改进。 功…

hadoop环境配置-创建hadoop用户+更新apt+安装SSH+配置Java环境

一、创建hadoop用户(在vm安装的ubantu上打开控制台) 1、sudo useradd -m hadoop -s /bin/bash (创建hadoop用户) 2、sudo passwd hadoop (设置密码) 3、sudo adduser hadoop sudo(将新建的hadoop用户设置为管理员) 执行如下图 将…

大数据新视界 -- Hive 数据湖架构中的角色与应用(上)(25 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

SpringMVC:参数传递之日期类型参数传递

环境准备和参数传递请见:SpringMVC参数传递环境准备 日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如: 2088-08-182088/08/1808/18/2088… 针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类…