椭圆面片之间的仿射变换

Posted

技术标签:

【中文标题】椭圆面片之间的仿射变换【英文标题】:Affine transform between elliptical patches 【发布时间】:2012-10-07 15:02:47 【问题描述】:

我是 OpenCV 的新手,我正在学习做一些图像处理。作为我项目的一部分,我遇到了将椭圆形式的图像补丁变形为目标椭圆的问题。据我了解,我需要计算两个补丁之间的仿射变换,然后将此转换扭曲到目标补丁中。浏览互联网寻求帮助,我没有找到一种方法来计算两个椭圆补丁之间的仿射变换。我在正确的轨道上吗?如果您能给我一些如何进行或在哪里寻找更多信息的建议,我将不胜感激。

【问题讨论】:

你是什么意思“计算两个椭圆补丁之间的仿射变换”。究竟是什么问题。你到底是从什么计算仿射变换的?一组点? 2 个椭圆的图像? 椭圆形块代表描述符的感兴趣区域。源图像中的每个描述符都映射到图像数据库中的描述符。这个想法是使用数据库重建源图像。我找到了对应的描述符,现在我需要在源图像中扭曲对应的椭圆补丁。每个补丁已经有一个仿射变换,所以我必须在对应的对中找到仿射变换并应用它。我只是不知道该怎么做。 你有多少点对应关系?你看过cv::getAffineTransform吗? cv::estimateAffine3D呢? 是仿射变换还是变形的问题? 问题是我需要扭曲每个椭圆补丁,从相应的图像到源图像。补丁的数量取决于描述符的数量,这取决于源图像。不幸的是,由于我有省略号,我不能使用来自 opencv 的经典仿射变换 【参考方案1】:

您的元素是椭圆的事实与变换的计算无关。变换同样适用于任意形状。假设你有关于某个原点 O 的仿射变换 [A] 和 [B],你想要 [A] 和 [B] 之间的变换。有几种方法可以考虑这样做,最简单的一种是从 [A] 到 O 的转换,然后从 O 到 [B] 并将它们组合起来。 [A] 到 O 只是 [A] 的倒数,而 O 到 [B] 只是 [B] 所以

final_transform = [B]*inverse([A]);

here 是一个类似的问题,用向量表示求解同样有效。

要进行实际的变形,您可以使用cv::warpAffine

【讨论】:

如果两个椭圆以不同的点为中心,这仍然成立吗?如果我将 A 变形为 B,新补丁的中心是否会对应于 B 的中心? 我仍然不明白为什么我们谈论省略号很重要,我是否仍然误解了这个问题?仿射变换将点的任意配置映射到新位置。它们可以是圆形、三角形、涂鸦,任何东西。我的前提是你知道变换 [A] 和 [B],是这样吗? 是的,没错。我的想法是使用两个补丁之间的仿射变换将一个补丁扭曲到另一个补丁。这是正确的推理吗?如果是这样,我该如何实现?感谢您的回答。 是的,你可以使用仿射变换来扭曲补丁,看看cv::warpAffine 谢谢,我猜这个解决方案没那么复杂

以上是关于椭圆面片之间的仿射变换的主要内容,如果未能解决你的问题,请参考以下文章

opencv中的仿射变换

图像处理之_仿射变换与透视变换

OpenCV实现仿射变换

affine transformation matrix 仿射变换矩阵 与 OpenGL

何为仿射变换(Affine Transformation)

射影变换仿射变换欧式变换相似变换等距变换