首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >图像旋转和频域缩放?

图像旋转和频域缩放?
EN

Stack Overflow用户
提问于 2012-12-06 05:02:08
回答 3查看 11K关注 0票数 7

我正在编写一些代码来恢复相对于使用相位相关( A la Reddy & Chatterji 1996 )的模板的测试图像的旋转、缩放和平移。为了找到标度因子和旋转角度,我采用了原始测试图像的FFT,但是为了得到平移,我需要旋转和缩放测试图像的FFT。

现在我可以在空域应用旋转和缩放,然后采取FFT,但这似乎有点低效-它有可能直接获得频域旋转/缩放图像的傅里叶系数吗?

编辑1: OK,我按照用户1816548的建议做了一个游戏。我可以得到模糊的感觉-旋转角度是90度倍数,尽管在图像的极性发生了奇怪的变化。不是90度倍数的角度给了我相当有趣的结果。

编辑2:,我在图像上加了零填充,当我旋转它的时候,我正在包装FFT的边缘。我很确定我在旋转FFT的直流电分量,但是对于不是90度倍数的角度,我仍然得到了奇怪的结果。

示例输出:

可执行的Numpy/Scipy代码:

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
from scipy.misc import lena
from scipy.ndimage.interpolation import rotate,zoom
from scipy.fftpack import fft2,ifft2,fftshift,ifftshift
from matplotlib.pyplot import subplots,cm

def testFourierRotation(angle):

    M = lena()
    newshape = [2*dim for dim in M.shape]
    M = procrustes(M,newshape)

    # rotate, then take the FFT
    rM = rotate(M,angle,reshape=False)
    FrM = fftshift(fft2(rM))

    # take the FFT, then rotate
    FM = fftshift(fft2(M))
    rFM = rotatecomplex(FM,angle,reshape=False)
    IrFM = ifft2(ifftshift(rFM))

    fig,[[ax1,ax2,ax3],[ax4,ax5,ax6]] = subplots(2,3)

    ax1.imshow(M,interpolation='nearest',cmap=cm.gray)
    ax1.set_title('Original')
    ax2.imshow(rM,interpolation='nearest',cmap=cm.gray)
    ax2.set_title('Rotated in spatial domain')
    ax3.imshow(abs(IrFM),interpolation='nearest',cmap=cm.gray)
    ax3.set_title('Rotated in Fourier domain')
    ax4.imshow(np.log(abs(FM)),interpolation='nearest',cmap=cm.gray)
    ax4.set_title('FFT')
    ax5.imshow(np.log(abs(FrM)),interpolation='nearest',cmap=cm.gray)
    ax5.set_title('FFT of spatially rotated image')
    ax6.imshow(np.log(abs(rFM)),interpolation='nearest',cmap=cm.gray)
    ax6.set_title('Rotated FFT')
    fig.tight_layout()

    pass

def rotatecomplex(a,angle,reshape=True):
    r = rotate(a.real,angle,reshape=reshape,mode='wrap')
    i = rotate(a.imag,angle,reshape=reshape,mode='wrap')
    return r+1j*i

def procrustes(a,target,padval=0):
    b = np.ones(target,a.dtype)*padval
    aind = [slice(None,None)]*a.ndim
    bind = [slice(None,None)]*a.ndim
    for dd in xrange(a.ndim):
        if a.shape[dd] > target[dd]:
            diff = (a.shape[dd]-target[dd])/2.
            aind[dd] = slice(np.floor(diff),a.shape[dd]-np.ceil(diff))
        elif a.shape[dd] < target[dd]:
            diff = (target[dd]-a.shape[dd])/2.
            bind[dd] = slice(np.floor(diff),target[dd]-np.ceil(diff))
    b[bind] = a[aind]
    return b
EN

回答 3

Stack Overflow用户

发布于 2014-09-29 14:41:57

我不知道这件事是否已经解决,但我相信我有办法解决你在第三个数字中观察到的影响的问题:

你观察到的这个奇怪的效果是由于你实际计算FFT的起源。从本质上说,快速傅立叶变换从M[0][0]阵列的第一个像素开始。然而,您定义了围绕M[size/2+1,size/2+1]的旋转,这是正确的方法,但却是错误的。傅里叶域已经从M[0][0]计算出来了!如果你现在在傅里叶域中旋转,你是围绕M[0][0]旋转,而不是围绕M[size/2+1,size/2+1]旋转。我不能完全解释这里到底发生了什么,但你得到的效果和我以前一样。为了在傅里叶域中旋转原始图像,首先必须将二维fftShift应用于原始图像M,然后计算FFT、旋转、IFFT,然后应用ifftShift。这样,图像的旋转中心和傅里叶域的中心就同步了。

AFAI记得,我们还在两个独立的数组中旋转实和虚分量,然后将它们合并。我们还对复数上的各种插值算法进行了测试,但效果不大:)。它在我们的包裹化脓性里。

然而,这可能是超级los较少,但与两个额外的移动并不是真正的快速,除非您指定一些时髦的数组索引算法。

票数 5
EN

Stack Overflow用户

发布于 2012-12-06 05:26:11

嗯,旋转和缩放图像的结果是旋转和缩放(用逆尺度)傅里叶变换。

还请注意,旋转和缩放都是线性的像素数,而FFT是O(w*logw*h*logh),所以它实际上并不昂贵。

票数 2
EN

Stack Overflow用户

发布于 2014-09-18 22:08:52

我意识到这太晚了,但我只是想在这里回答这个问题,因为我复习了我关于移位不变的基本知识。问题是,在旋转之前,您是在扩展傅里叶空间(如考虑混叠)。看看旋转图像的FT :轴向尖峰(别名)出现在没有在傅里叶旋转的IFT中的边缘。

你应该旋转,然后处理混叠。因为您正在考虑混叠(在周期=像素数处循环您的傅里叶空间),然后通过旋转丢弃这种努力,所以您将导致混叠出现在您的最终图像中。本质上,你是在展开傅立叶别名,因此把图像空间别名拉到一起.

旋转为90度旋转平稳,因为没有混叠;k空间的角点完全匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13744171

复制
相关文章
什么时候使用Dockerfiles(什么时候不使用……)
在这篇文章中,我们将讨论一些使用 Dockerfile 的最佳实践,探索一些注意事项,并使用 Dockerfile 和云原生 Buildpacks 构建应用。你将了解每种工具最擅长的工作是什么,以及如何决定何时使用它们。
CNCF
2021/12/15
1.8K0
什么时候使用Dockerfiles(什么时候不使用……)
什么时候,使用Excel?
极力推崇PowerBI是创作PowerBI大师的初衷,虽然从Excel到PowerBI有极其诱人的理由,但我们不可否认的是Excel本身作为全世界最广泛的办公工具它具有不可替代的应用场景。
公众号PowerBI大师
2019/08/07
2K0
什么时候,使用Excel?
什么时候使用 CAP?
大多数人很难理解变革。当员工已经习惯了他们操作某个流程的方式时,他们很少会接受创新或改进。然而,我们总是需要变革。无论是提高生产效率,减少浪费,还是提高制造速度,变革都会因多种原因而发生。尽管变革是必要的,但很难确保它们的成功。对于执行过程改进项目的六西格玛专业人员,有一种简单有效的方法可以轻松、顺利地完成变革。本文,与大家讨论CAP方法,它是什么,以及它如何防止新流程失败。
用户9972271
2022/09/14
3880
Jetbrains IDE 使用教程
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u011054333/article/details/83412908
乐百川
2019/07/02
2.4K0
Jetbrains IDE 使用教程
Clion - IDE使用介绍
Clion 是一款专为开发C及C++所设计的跨平台IDE。它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员的生产力。CLion帮助开发人员使用智能编辑器来提高代码质量、自动代码重构并且深度整合CMake编译系统,从而提高开发人员的工作效率。
用户5521279
2019/11/07
5.5K0
什么时候应该使用volatile
volatile 修饰符告诉编译程序不要对该变量所参与的操作进行某些优化。在两种特殊的情况下需要使用volatile 修饰符:第一种情况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分一样),第二种情况涉及到共享内存(shared memory,即被两个以上同时运行的程序所使用的内存)。
杨源鑫
2019/07/22
2.1K0
什么时候使用SWOT分析?
SWOT分析,一种结构化的规划方法,用于评估项目或企业中涉及的优势、劣势、机会和威胁。SWOT分析可以对产品、地点、行业或个人来进行。它包括明确企业或项目的目标,并确定对实现该目标有利和不利的内部和外部因素。
用户9972271
2023/02/22
5160
什么时候使用前置声明
我们可以站在编译器的角度来思考这个问题:当你前置声明一个类型时,编译器就会知道这个类型的存在,但没法知道它的布局、大小、成员…所以我们也把前置声明的类型叫做不完全类型(incomplete type)。
ClearSeve
2022/02/10
8700
什么时候使用 useMemo 和 useCallback
性能优化总是会有成本,但并不总是带来好处。我们来谈谈 useMemo 和 useCallback 的成本和收益。
Nealyang
2020/03/15
2.5K0
究竟什么时候该使用MQ?
任何脱离业务的组件引入都是耍流氓。引入一个组件,最先该解答的问题是,此组件解决什么问题。
架构师之路
2020/03/23
6400
究竟什么时候该使用MQ?
什么时候才应该使用HBase?
在使用HBase一定要明白HBase的适用场合,因为HBase并非适用于每种情况。 首先,要确认有足够多的数据存入HBase。 如 果有几亿或者几十亿条记录要存入HBase,那么HBase就是一个正确的选择;否则如果你仅有几百万条甚至更少的数据,那么HBase当然不是正确的选 择,这种情况下应当选择传统的关系型数据库,因为如果这么少的数据存入HBase,就会导致数据堆积在一两个节点上,而HBase集群内部的其他节点都处 于空闲状态。 其次,要确认即便不使用传统关系型数据库提供的额外功能(比如数据库的列有强类
cloudskyme
2018/03/20
1.1K0
到底什么时候该使用MQ?
一、缘起 一切脱离业务的架构设计与新技术引入都是耍流氓。 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题。 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什么问题(详见《互联网架构为什么要做微服务?》)。 最近分享了几篇MQ相关的文章: 《MQ如何实现延时消息》 《MQ如何实现消息必达》 《MQ如何实现幂等性》 不少网友询问,究竟什么时候使用MQ,MQ究竟适合什么场景,故有了此文。 二、MQ是干嘛的 消息总线(Message Queue),后文称MQ,是一种跨进程的通
架构师之路
2018/03/01
2.4K0
到底什么时候该使用MQ?
Selenium IDE 命令使用——断言
  做UI自动化测试,经常要用到的方法就是——断言。断言主要目的是验证程序是否与预期结果一致,这样我们在程序运行完后知道哪些成功了,哪些失败了。
全栈测试开发日记
2023/02/02
1.4K0
Selenium IDE 命令使用——断言
什么时候使用@Controller和@RestController
而@RestController注解就是@ResponseBody + @Controller合在一起的作用。
余生大大
2022/11/02
4300
R变量索引 - 什么时候使用 @或$
单细胞分析经常用到Seurat包,整个分析过程中的中间结果都在一个Seurat对象中存储。常需要从里面提取对应数据进行后续分析,有时会用$,有时会用@,怎么选择呢?
生信宝典
2019/12/11
1.5K0
使用Gemini构建自己的IDE
你的项目中的领域特定语言是否需要自己的IDE?Visual Studio Shell是选择之一,但是过于庞大不易部署,而且很难使用。Tim Jones的Gemini框架是一个轻量级替代方案。 Gemini基于一组松散耦合的模块,开发者可以根据需求的变化来替换这些模块。开发者可以直接使用下面这些标准组件: Shell MainMenu(主菜单) StatusBar(状态栏) ToolBars(工具栏) Toolbox(工具箱) UndoRedo(撤销/恢复) 这些组件依赖于AvalonDock、C
张善友
2018/01/29
1.5K0
web爬虫-Selenium IDE安装使用
今天将学习使用一个非常有用的浏览器插件Selenium IDE,用于网站的测试和自动化,这里以谷歌浏览器作为测试。
XXXX-user
2019/07/30
1.5K0
web爬虫-Selenium IDE安装使用
Python异步: 什么时候使用异步?(3)
从广义上讲,Asyncio 是新的、流行的、讨论广泛的和令人兴奋的。然而,对于何时应该在项目中采用它存在很多困惑。
数据科学工厂
2023/02/27
9930
Python异步: 什么时候使用异步?(3)
Python异步: 什么时候使用异步?(3)
从广义上讲,Asyncio 是新的、流行的、讨论广泛的和令人兴奋的。然而,对于何时应该在项目中采用它存在很多困惑。
数据科学工厂
2023/01/28
1.1K0
跨平台的ide使用-codeblock
全局变量设置 配置编译器 配置编译器,确保编译器下面包含的文件都能找到 编译配置 添加include头文件
sofu456
2021/12/06
5870
跨平台的ide使用-codeblock

相似问题

在IDE中什么时候应该使用Scala类,什么时候使用Scala对象?

21

IDE0063什么时候处理?

217

使用哪种IDE?

82

使用Selenium IDE

11

什么时候使用==,什么时候使用is?

50
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文