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

图像处理学习笔记-04-频率域滤波04

图像处理领域的计算要求并不是微不足道的,需要一些基本方法简化傅里叶变换的计算,并加快计算速度

二维DFT的可分性

F ( u , v ) = ∑ x = 0 M − 1 e − j 2 π u x / M ∑ y = 0 N − 1 f ( x , y ) e − j 2 π v y / N = ∑ x = 0 M − 1 F ( x , v ) e − j 2 π u x / M F ( x , v ) = ∑ y = 0 N − 1 f ( x , y ) e − j 2 π v y / N \begin{aligned} F(u,v) &= \sum_{x = 0}^{M - 1}e^{-j2\pi u x / M}\sum_{y = 0}^{N - 1}f(x,y)e^{-j2\pi vy / N} \\ &= \sum_{x = 0}^{M - 1}F(x,v)e^{-j2\pi ux/M} \\ F(x,v) &= \sum_{y = 0}^{N - 1}f(x,y)e^{-j2\pi vy/N} \end{aligned} F(u,v)F(x,v)=x=0M1ej2πux/My=0N1f(x,y)ej2πvy/N=x=0M1F(x,v)ej2πux/M=y=0N1f(x,y)ej2πvy/N
过程基本如下:首先对 f ( x , y ) f(x,y) f(x,y)所有行计算一维DFT,然后沿着计算结果的每一列计算一维变换

用DFT算法计算IDFT

二维离散的反傅里叶变换
f ( x , y ) = 1 M N ∑ μ = 0 M − 1 ∑ v = 0 N − 1 F ( μ , v ) e j 2 π ( μ x / M + v y / N ) f(x,y) = \frac{1}{MN}\sum_{\mu = 0}^{M - 1}\sum_{v = 0}^{N - 1}F(\mu,v)e^{j2\pi(\mu x / M + vy / N)} f(x,y)=MN1μ=0M1v=0N1F(μ,v)ej2π(μx/M+vy/N)
取两边的复共轭:
M N f ∗ ( x , y ) = ∑ u = 0 M − 1 ∑ v = 0 N − 1 F ∗ ( u , v ) e − j 2 π ( u x / M + v y / N ) MNf^*(x,y) = \sum_{u = 0}^{M - 1}\sum_{v = 0}^{N - 1}F^*(u,v)e^{-j2\pi(ux/M + vy/N)} MNf(x,y)=u=0M1v=0N1F(u,v)ej2π(ux/M+vy/N)
所以基本过程是计算 F ∗ ( u , v ) F^*(u,v) F(u,v)的二维傅里叶正变换,得到 M N f ∗ ( x , y ) MNf^*(x,y) MNf(x,y),之后取其复共轭并将结果乘以 1 / M N 1/MN 1/MN,就得到了 F ( u , v ) F(u,v) F(u,v)的傅里叶反变换 f ( x , y ) f(x,y) f(x,y)

快速傅里叶变换FFT

快速傅里叶变换将乘法和加法的次数降低到 M N log ⁡ 2 M N MN\log_2MN MNlog2MN,因为二维傅里叶变换可以通过一维变换的方法来执行,所以只需要关注一个变量的FFT:
F ( u ) = ∑ x = 0 M − 1 f ( x ) W M u x , u = 0 , 1 , ⋯   , M − 1 F(u) = \sum_{x = 0}^{M - 1}f(x)W_M^{ux},u = 0,1,\cdots,M - 1 F(u)=x=0M1f(x)WMux,u=0,1,,M1
其中:
W M = e − j 2 π / M W_M = e^{-j2\pi/M} WM=ej2π/M
且假设 M M M有如下形式:
M = 2 n M = 2^n M=2n
M M M也可以表示为:
M = 2 K M = 2K M=2K
式子变为:
F ( u ) = ∑ x = 0 2 K − 1 f ( x ) W 2 K u x = ∑ x = 0 K − 1 f ( 2 x ) W 2 K u ( 2 x ) + ∑ x = 0 K − 1 f ( 2 x + 1 ) W 2 K u ( 2 x + 1 ) F(u) = \sum_{x = 0}^{2K - 1}f(x)W_{2K}^{ux} = \sum_{x = 0}^{K - 1}f(2x)W_{2K}^{u(2x)} + \sum_{x = 0}^{K - 1}f(2x + 1)W_{2K}^{u(2x + 1)} F(u)=x=02K1f(x)W2Kux=x=0K1f(2x)W2Ku(2x)+x=0K1f(2x+1)W2Ku(2x+1)
可以证明 W 2 K 2 u x = W K u x W_{2K}^{2ux} = W_K^{ux} W2K2ux=WKux,所以上式:
F ( u ) = ∑ x = 0 K − 1 f ( 2 x ) W K u x + ∑ x = 0 K − 1 f ( 2 x + 1 ) W K u x W 2 K u F(u) = \sum_{x = 0}^{K - 1}f(2x)W_K^{ux} + \sum_{x = 0}^{K - 1}f(2x + 1)W_K^{ux}W_{2K}^u F(u)=x=0K1f(2x)WKux+x=0K1f(2x+1)WKuxW2Ku
定义:
F e v e n ( u ) = ∑ x = 0 K − 1 f ( 2 x ) W K u x , u = 0 , 1 , 2 , ⋯   , K − 1 F o d d ( u ) = ∑ x = 0 K − 1 f ( 2 x + 1 ) W K u x , u = 0 , 1 , ⋯   , K − 1 \begin{aligned} F_{even}(u) &= \sum_{x = 0}^{K - 1}f(2x)W_K^{ux},u = 0,1,2,\cdots,K-1 \\ F_{odd}(u) &= \sum_{x = 0}^{K - 1}f(2x + 1)W_K^{ux},u = 0,1,\cdots,K - 1 \end{aligned} Feven(u)Fodd(u)=x=0K1f(2x)WKux,u=0,1,2,,K1=x=0K1f(2x+1)WKux,u=0,1,,K1
得到下式:
F ( u ) = F e v e n ( u ) + F o d d ( u ) W 2 K u F(u) = F_{even}(u) + F_{odd}(u)W_{2K}^{u} F(u)=Feven(u)+Fodd(u)W2Ku
W M u + M = W M u , W 2 M u + M = − W 2 M u W_{M}^{u + M} = W_M^u,W_{2M}^{u + M} = -W_{2M}^u WMu+M=WMu,W2Mu+M=W2Mu可得:
F ( u + K ) = F e v e n ( u ) − F o d d ( u ) W 2 K u F(u + K) = F_{even}(u) - F_{odd}(u)W_{2K}^u F(u+K)=Feven(u)Fodd(u)W2Ku
计算过程基本如下:首先完成 K K K个点的计算 F e v e n ( u ) , F o d d ( u ) F_{even}(u),F_{odd}(u) Feven(u),Fodd(u),另外的 K K K个点可以通过 F ( u + K ) F(u + K) F(u+K)直接得到,这个过程可以递归计算,假设 m ( n ) , a ( n ) m(n),a(n) m(n),a(n)分别代表实现算法所要求的复数乘法次数和加法次数,样本数目为 2 n 2^n 2n:
m ( n ) = 2 m ( n − 1 ) + 2 n − 1 , n ≥ 1 a ( n ) = 2 a ( n − 1 ) + 2 n , n ≥ 1 m ( 0 ) = 0 a ( 0 ) = 0 m(n) = 2m(n - 1) + 2^{n - 1} ,n \geq 1\\ a(n) = 2a(n - 1) + 2^n,n\geq 1 \\ m(0) = 0 \\ a(0) = 0 m(n)=2m(n1)+2n1,n1a(n)=2a(n1)+2n,n1m(0)=0a(0)=0
所以:
m ( n ) = 1 2 M log ⁡ 2 M a ( n ) = M log ⁡ 2 M m(n) = \frac{1}{2}M\log_2M \\ a(n) = M\log_2M m(n)=21Mlog2Ma(n)=Mlog2M

相关文章:

  • Halcon学习---光学字符识别(OCR)
  • 【电商数仓】数仓搭建之DIM维度层(商品、优惠券、活动、地区、时间维度表)
  • class11:cookie和session
  • 一些常用的刷题网站
  • Python自动化小技巧11——excel文件的文字内容筛选
  • ArrayList的源码分析
  • 不支持TLS的设备如何实现游客登录加密通信方案
  • 【Pandas 数据分析3-2】Pandas 数据读取与输出 - Excel
  • TiDB Dashboard 实例性能分析 - 持续分析页面
  • Spring Boot 集成 Redis 配置 MyBatis 二级缓存
  • 9 二叉树-添加
  • SSM进阶-搭建Dubbo
  • STM32F103 CAN通讯实操
  • JAVA-----注释、字面量、关键字、制表符
  • numpy数组的变形、级联操作、聚合操作、常用的数学函数以及矩阵相关
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • canvas 绘制双线技巧
  • css布局,左右固定中间自适应实现
  • E-HPC支持多队列管理和自动伸缩
  • HTTP 简介
  • leetcode-27. Remove Element
  • Markdown 语法简单说明
  • maya建模与骨骼动画快速实现人工鱼
  • react-native 安卓真机环境搭建
  • Spring Cloud中负载均衡器概览
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从输入URL到页面加载发生了什么
  • 经典排序算法及其 Java 实现
  • 用element的upload组件实现多图片上传和压缩
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 原生 js 实现移动端 Touch 滑动反弹
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (windows2012共享文件夹和防火墙设置
  • (二)springcloud实战之config配置中心
  • (三)uboot源码分析
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)Controller接口控制器详解(三)
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)四层和七层负载均衡的区别
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET CLR基本术语
  • .NET Core跨平台微服务学习资源
  • .NET简谈设计模式之(单件模式)
  • .Net中的集合
  • .sys文件乱码_python vscode输出乱码
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @PreAuthorize注解
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [2]十道算法题【Java实现】
  • [BZOJ 1040] 骑士