图像旋转和频域缩放?

2024-01-10

我正在编写一些代码来使用相位相关性来恢复测试图像相对于模板的旋转、缩放和平移,。我对原始测试图像进​​行 FFT,以便找到比例因子和旋转角度,但随后我需要对原始测试图像进​​行 FFT旋转和缩放测试图像以获得翻译。

现在我可以在空间域中应用旋转和缩放,然后进行 FFT,但这似乎有点低效 - 是否可以获得旋转/缩放图像的傅里叶系数directly在频域?

Edit 1:好的,我按照 user1816548 的建议进行了尝试。对于 90o 的倍数角度,我可以获得看起来模糊的合理旋转,尽管图像的极性有奇怪的变化。不是 90o 倍数的角度给我带来了相当滑稽的结果。

Edit 2:我对图像应用了零填充,并且在旋转图像时包裹了 FFT 的边缘。我非常确定我正在围绕 FFT 的 DC 分量旋转,但对于不是 90o 倍数的角度,我仍然得到奇怪的结果。

输出示例:


可执行的 Numpy/Scipy 代码:


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

我不确定这个问题是否已经解决,但我相信我已经解决了您关于第三张图中观察到的效果的问题:

您观察到的这种奇怪的效果是由于您实际计算 FFT 的来源造成的。本质上,FFT 从数组的第一个像素开始M[0][0]。然而,你可以定义你的轮换M[size/2+1,size/2+1],这是正确的方法,但却是错误的:)。傅里叶域的计算公式为M[0][0]!如果您现在在傅立叶域中旋转,那么您正在围绕M[0][0]并且不在周围M[size/2+1,size/2+1]。我无法完全解释这里到底发生了什么,但你也得到了我以前得到的同样的效果。为了在傅里叶域中旋转原始图像,您必须首先应用 2DfftShift对原始图像M,然后计算FFT,旋转,IFFT然后应用ifftShift。这样,图像的旋转中心和傅里叶域的中心就会同步。

AFAI 记得我们还在两个单独的数组中旋转实部和虚部,然后将它们合并。我们还在复数上测试了各种插值算法,但没有太大效果:)。它在我们的包裹里pytom http://pytom.org.

然而,这可能会导致超级损失,但由于两个额外的移位并不是很快,除非您指定一些时髦的数组索引算法。

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

图像旋转和频域缩放? 的相关文章

  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 为什么列表理解在数组相乘方面比 numpy 快得多?

    最近我回答了THIS https stackoverflow com questions 31596979 multiplication between 2 lists 31597029 31597029想要两个列表相乘的问题 一些用户建议
  • 如何计算数据框中按另一列的列值分组的一列的连续字符串值?

    我有以下数据框 Levels Labels Confidence 0 Hands 0 8 0 Leg 0 7 0 Eye 0 9 1 Ear 0 9 1 Eye 0 8 2 Hands 0 9 2 Eye 0 8 3 Eye 0 8 我想检
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000
  • 如何确保整数除法始终向上舍入?

    我想确保如有必要 整数除法总是向上舍入 还有比这更好的方法吗 目前正在进行大量选角工作 int Math Ceiling double myInt1 myInt2 更新 这个问题是我2013年1月博客的主题 http ericlippert
  • 将 z 分数转换为百分比的函数

    谷歌不想提供帮助 我能够计算 z 分数 并且我们正在尝试生成一个函数 给定 z 分数 可以得出正态分布中低于该 z 分数的人口百分比 我能找到的只是对百分比表的 z 分数的引用 有什么指点吗 Is it 这个 z 分数 链接 http en
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我
  • 分配给 numpy 结构化数组

    我必须以某种方式将结构化数据转换为 numpy 结构化数组形式 我读了我能找到的关于这个主题的少量 抱歉 SciPy 草率的文档 但仍然一无所获 基本上我想做一些像这样的简单的事情 import numpy as np dt contact
  • 如何使用 zbar 获取图像上检测到的二维码的 x、y 位置?

    我在下图的两个二维码中编码了数字1639 可下载 here https i stack imgur com c0FVK jpg 我打印了它 拍了一张照片并尝试检测它 import zbar from PIL import Image sca
  • 在sklearn中将文本列转换为数字

    我是数据分析新手 我正在尝试 python Sklearn 中的一些模型 我有一个数据集 其中某些列具有文本列 就像下面这样 Dataset 有没有办法将这些列值转换为 pandas 或 Sklearn 中的数字 为这些值分配数字是对的吗
  • 帮助我理解FFT函数(Matlab)

    1 除了负频率之外 FFT 函数提供的最小频率是多少 是零吗 2 如果它为零 我们如何在对数刻度上绘制零 3 结果总是对称的 或者只是看起来是对称的 4 如果我使用abs fft y 来比较2个信号 我是否会失去一些准确性 1 除了负频率之
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 使用 python 中的公式函数使从 Excel 中提取的值的百分比相等

    import xlrd numpy excel Users Bob Desktop wb1 xlrd open workbook excel assignment3 xlsx sh1 wb1 sheet by index 0 colA co
  • java数学中的组合“N选择R”?

    java库中是否有内置方法可以为任何N R计算 N选择R 公式 实际上很容易计算N choose K甚至不需要计算阶乘 我们知道 公式为 N choose K is N N K K 因此 公式为 N choose K 1 is N N N

随机推荐

  • 如何在iphone中获取gmsmapview的坐标中心

    我正在使用新的 iOS 版 Google 地图 SDK 我可以从 GMSMapView center 获取真实坐标吗 现在它返回一个 CGPoint 的值 但它不是真正的坐标 感谢和问候 Use the projection method
  • 从 Kotlin 隐藏静态 Java 方法

    我们正在将许多 java 静态方法转换为 kotlin 扩展函数 然而 我们需要保留一些 JUST FOR JAVA 的方法 我们希望强制 kotlin 代码使用扩展函数 有没有办法从 kotlin 中隐藏 java 静态方法 您可以使用注
  • Google Apps脚本:复制电子表格非常慢

    我有一个 Web 应用程序 其中脚本连接到电子表格 在脚本中 我从电子表格中查找文件的 ssid 打开该文件 然后复制并重命名它 相关行如下所示 var copy SpreadsheetApp openById ssid copy newN
  • sonarqube 忽略 sonar.junit.reportPaths

    我有一个 gradle 项目 它应用了 sonarqube gradle 插件 版本 2 6 我在我团队的 sonarqube 服务器版本 6 4 版本 25310 上运行它 根据文档 https docs sonarqube org di
  • å 在 xml 文件中是否有效?

    IE 不喜欢在 XML 文件中显示 字符 这是一个 IE 问题还是 和类似的字符确实是无效的 XML 我是否必须创建 xx 所有这些字母的值 Michel 顺便说一句 字符位于 CDATA 标记内 声明是这样的 嗯 似乎无法将 xml 声明
  • 角度 4 中的 html2canvas

    我可以在 Angular 4 中使用 html2canvas 截取屏幕截图 但我需要使用 http post 调用将字符串图像发送到服务器端 成分 import Component OnInit NgZone from angular co
  • 如何覆盖Visual Studio 2017社区的编译命令[重复]

    这个问题在这里已经有答案了 我想用一个简单的 shell 脚本覆盖默认的 Visual Studio C 编译器 我想要的是捕获参数 例如文件名 并创建一些统计信息 但是我想完全覆盖编译过程 也就是说 我想从我的 shell 脚本调用原始编
  • 模拟滚动视图内的拖动

    我正在努力拦截并重新发送发送到滚动视图的手势 我想做的事 杀死滚动视图中的所有手势识别器 我已经做到了这一点 在滚动视图中添加新的手势识别器 我也做到了这一点 使新识别器的行为与旧识别器相同 我还没有做到这一点 我需要帮助才能做到这一点 我
  • Boto - AWS SNS 如何提取主题的 ARN 号

    创建 AWS SNS 主题时 a conn create topic topicname 或获取已创建的主题 a conn get all topics 结果是 u CreateTopicResponse u ResponseMetadat
  • 如何减少 python 导入包的 Visual Studio 代码中的自动完成延迟?

    我正在使用 python 3 7 3 和 Visual Studio 代码 1 33 1 当我导入任何库 如 cv2 或 numpy 并尝试使用它时 自动完成需要 4 5 秒来识别函数 当我使用 print slice 等默认函数时 它们会
  • 是否必须使用 typedef 将 size_t 定义为五种标准无符号整数类型之一?

    C11标准写道 6 2 5 类型 4 有五个标准有符号整数类型 指定为signed char short int int long int and long long int 因此 五种标准无符号整数类型将是unsigned char un
  • 无法在 Android Studio 3.0 AVD Manager 或 SDK Manager 中下载系统映像

    When I try to list and download system images in AVD Manager nothing shows up in the list See below None of the three ta
  • Java 是否通过具有标记为 Final 的单个实现者的接口来优化方法调用?

    如果我引用一个类并调用它的方法 并且该类或方法是最终的 我的理解是编译器或 JVM 会用更便宜的静态分派替换动态分派 因为它可以准确确定哪个版本将被调用 但是 如果我有一个接口的引用 并且该接口当前只有一个实现者 并且该实现者是最终的或者该
  • 什么时候我们需要将数组的大小作为参数传递

    我对在 C C 中传递数组有点困惑 我看到一些签名是这样的情况 void f int arr 有些是这样的 void f int arr int size 有人可以详细说明有什么区别以及何时以及如何使用它吗 首先 传递给函数的数组实际上传递
  • 以编程方式裁剪位图的底部部分

    我有一张从相机拍摄的位图 我想裁剪图像 使其只留下底部部分 裁剪后的图像应比原始位图的高度低 80 因此我只需要从左边缘开始的底部部分的 20 我在代码中明确地执行此操作 没有任何 Android 裁剪意图 一张图片来形象化我想要实现的目标
  • 如何检测 JSF 2.0 页面中的字段值更改

    我正在使用 JSF 2 0 开发一个相当大且复杂的页面 其中包含许多字段 页面底部将有一个退出命令按钮 当用户选择退出选项时 我需要检测用户是否在页面的某个字段中输入了任何值 我现在使用支持 bean 中每个字段值的 null 检查来执行此
  • AWS System Manager 启动会话:调用 StartSession 操作时发生错误 (TargetNotConnected): 未连接

    Problem 当我尝试使用 AWS System Session Manager CLI 命令在本地连接到正在运行的 EC2 实例时 aws ssm start session target i 123456 我收到错误 An error
  • 在 CoreApI 中上传到 iOS 中的保管箱时文件上传失败

    我无法在 CoreApI 中将文件上传到 iOS 中的保管箱 我收到这条消息 警告 DropboxSDK 发出请求时出错 1 files put sandboxsandbox helloworld txt 400 预期 root 为 是 d
  • 为什么我用 Homebrew 安装的 Git 版本与网站上的版本不同?

    当我使用 Homebrew 安装 Git 时 它显示版本为 1 8 5 2 但在网站上下载的是 2 0 1 为什么 Homebrew 安装不同版本的 Git 确保预安装的 git 路径 usr bin git 不早于由brew usr lo
  • 图像旋转和频域缩放?

    我正在编写一些代码来使用相位相关性来恢复测试图像相对于模板的旋转 缩放和平移 我对原始测试图像进 行 FFT 以便找到比例因子和旋转角度 但随后我需要对原始测试图像进 行 FFT旋转和缩放测试图像以获得翻译 现在我可以在空间域中应用旋转和缩