在 MATLAB 中绕其中心旋转图像矩阵

2024-02-23

假设我有一个 2x2 矩阵,其中填充了代表平面的值。现在我想以 3D 方式在“z 方向”上围绕自身旋转平面。为了更好地理解,请参见下图:

我想知道这是否可以通过简单的仿射矩阵实现,因此我创建了以下简单的脚本:

%Create a random value matrix
A = rand*ones(200,200);

%Make a box in the image
A(50:200-50,50:200-50) = 1;

现在我可以通过旋转矩阵在二维房间中应用变换,如下所示:

R = affine2d([1 0 0; .5 1 0; 0 0 1])
tform = affine3d(R);
transformed = imwarp(A,tform);

但是,这不会产生上面所需的输出,而且我不太确定如何创建二维仿射矩阵来创建这种行为。

我猜想 3-D 仿射矩阵可以解决这个问题。但是,如果我定义 3-D 仿射矩阵,我将无法再使用该矩阵的 2-D 表示形式,因为 MATLAB 将抛出错误:

The number of dimensions of the input image A must be 3 when the
specified geometric transformation is 3-D.

那么如何使用仿射矩阵编码所需的输出呢?


The 来自 m3tho 的回答 https://stackoverflow.com/a/47275099/52738正确地解决你会如何apply您想要的转换:使用fitgeotrans https://www.mathworks.com/help/images/ref/fitgeotrans.html with a 'projective'转换 https://www.mathworks.com/help/images/ref/fitgeotrans.html#bvonaug,因此要求您指定 4 个控制点(即输入和输出图像中的 4 对对应点)。然后您可以使用以下命令应用此转换imwarp https://www.mathworks.com/help/images/ref/imwarp.html.

那么问题来了how您选择这些点对来创建所需的变换,在本例中是创建一个透视投影 https://www.mathworks.com/help/matlab/visualize/understanding-view-projections.html。如下所示,透视投影考虑到观看位置(即“相机”)将具有定义圆锥形视场的给定视角。通过获取该圆锥体内的所有 3D 点并将它们投影到观看平面上来渲染场景,该平面是位于摄像机目标处的平面,垂直于摄像机与其目标的连线。

首先,我们假设您的图像位于观察平面中,并且角点由标准化参考系描述,使得它们跨越[-1 1]在每个方向。我们需要首先通过选择视角来选择我们想要的透视度,然后计算相机和观察平面之间的距离。 45度左右的视角可以模拟正常人眼的透视感,因此利用视平面的角点来定义圆锥视场的边缘,我们可以计算出相机距离如下:

camDist = sqrt(2)./tand(viewAngle./2);

现在我们可以使用它来生成一组用于转换的控制点。我们首先应用一个3-D 旋转 https://en.wikipedia.org/wiki/Rotation_matrix#In_three_dimensions到观察平面的角点,绕 y 轴旋转一定量theta。这会将它们旋转出平面,因此我们现在通过定义一条从相机到每个旋转角点的线将角点投影回观察平面上,找到与平面相交的点 https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection。我将省去您的数学推导(您可以根据上述链接中的公式自行实现它们),但在这种情况下,一切都简化为以下一组计算:

term1 = camDist.*cosd(theta);
term2 = camDist-sind(theta);
term3 = camDist+sind(theta);
outP = [-term1./term2  camDist./term2; ...
         term1./term3  camDist./term3; ...
         term1./term3 -camDist./term3; ...
        -term1./term2 -camDist./term2];

And outP现在包含输出图像中标准化的控制点集。给定尺寸的图像s,我们可以创建一组输入和输出控制点,如下所示:

scaledInP = [1 s(1); s(2) s(1); s(2) 1; 1 1];
scaledOutP = bsxfun(@times, outP+1, s([2 1])-1)./2+1;

您可以像这样应用转换:

tform = fitgeotrans(scaledInP, scaledOutP, 'projective');
outputView = imref2d(s);
newImage = imwarp(oldImage, tform, 'OutputView', outputView);

您可能遇到的唯一问题是旋转 90 度(即从图像平面的一端看)会创建一组共线点,这会导致fitgeotrans出错。在这种情况下,从技术上讲,您只需要一个空白图像,因为从侧面查看二维对象时您看不到它。

下面是一些通过动画旋转图像来说明上述转换的代码:

img = imread('peppers.png');
s = size(img);
outputView = imref2d(s);
scaledInP = [1 s(1); s(2) s(1); s(2) 1; 1 1];
viewAngle = 45;
camDist = sqrt(2)./tand(viewAngle./2);

for theta = linspace(0, 360, 360)
  term1 = camDist.*cosd(theta);
  term2 = camDist-sind(theta);
  term3 = camDist+sind(theta);
  outP = [-term1./term2  camDist./term2; ...
           term1./term3  camDist./term3; ...
           term1./term3 -camDist./term3; ...
          -term1./term2 -camDist./term2];
  scaledOutP = bsxfun(@times, outP+1, s([2 1])-1)./2+1;
  tform = fitgeotrans(scaledInP, scaledOutP, 'projective');
  spinImage = imwarp(img, tform, 'OutputView', outputView);
  if (theta == 0)
    hImage = image(spinImage);
    set(gca, 'Visible', 'off');
  else
    set(hImage, 'CData', spinImage);
  end
  drawnow;
end

这是动画:

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

在 MATLAB 中绕其中心旋转图像矩阵 的相关文章

  • Google Chrome 中不缓存动态加载的图像

    使用 jQuery 加载的图像未保存在 Google Chrome 的缓存中 每次都会从服务器下载 情况 我正在使用 jQuery slimbox2 在 灯箱 中加载图片 此时没有什么特别的 我添加了一些 jQuery 代码来检测鼠标光标何
  • 以编程方式在 iPhone 上使用彩信发送图像?

    搜遍全网都没有解决这个问题 我想用 iPhone 相机拍照 然后能够通过彩信 电子邮件发送出去 这不一定发生在我的应用程序中 但至少我希望能够调用彩信 电子邮件应用程序并使其选择拍摄 和存储 的图片 当我使用内置相册应用程序时 每张照片的左
  • PHP 中的 imagecolortransparent 不起作用

    我想改变图像中的白色 http www arso gov si vreme napovedi 20in 20podatki radar gif http www arso gov si vreme napovedi 20in 20podat
  • Go 中的 WebP 编码器/解码器

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • 更快的四元数向量乘法不起作用

    我的数学库需要一个更快的四元数向量乘法例程 现在我正在使用规范v qv q 1 它产生的结果与向量乘以由四元数组成的矩阵相同 所以我对它的正确性充满信心 到目前为止 我已经实现了 3 种替代 更快 的方法 1 我不知道我从哪里得到这个 v
  • 如何从 url Codenameone 创建图像

    我需要从具有图像 url 的字符串创建一个新的 Image 实例 E g http maps gstatic com mapfiles place api icons restaurant 71 png http maps gstatic
  • matlab中的正则逻辑回归代码

    我正在尝试正则化 LR 在 matlab 中使用以下公式很简单 成本函数 J theta 1 m sum y i log h x i 1 y i log 1 h x i lambda 2 m sum theta j 梯度 J theta t
  • 减少非常大图像的文件大小,而不改变图像尺寸

    考虑一个处理可能非常大的 PNG 文件上传的应用程序 所有上传的文件必须存储到磁盘以供以后检索 但是 PNG 文件的大小最大可达 30 MB 但磁盘存储限制规定每个文件的最大大小为 1 MB 问题是获取文件大小高达 30 MB 的输入 PN
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 当我使用 Image.FromFile() 时 FileNotFound

    我在这种情况下使用 Image FromFile string 方法 using System using System Collections Generic using System ComponentModel using Syste
  • 如何使使用 css 调整大小的图像在 IE 中看起来不错?

    当使用 css 宽度 高度或属性宽度 高度缩放图像时 IE6 和 IE7 无法很好地缩放网页中的图像 我不确定它默认使用哪种算法 但这不好 在这些浏览器中缩放时 缩放图像会显示锯齿伪影 幸运的是 有一种方法可以通过简单的 css 规则强制
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • flutter应用程序中有图像编辑器的api吗?我需要在图像中添加文本

    是否可以编辑图像 例如旋转以及在图像上添加文本 有没有什么插件可以做到这一点 我需要一个图像编辑器来添加具有各种字体和颜色的文本 谢谢 你应该使用重画边界 https docs flutter io flutter widgets Repa
  • Java 旋转图像

    Override public void paintComponent Graphics g super paintComponent g Graphics2D g2 Graphics2D g create rotation of play
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • 如何计算 3D 坐标的线性索引,反之亦然?

    如果我有一个点 x y z 如何找到该点的线性索引 i 我的编号方案是 0 0 0 是 0 1 0 0 是 1 0 1 0 是最大 x 维度 另外 如果我有一个线性坐标 i 我如何找到 x y z 我似乎无法在谷歌上找到这个 所有结果都充满

随机推荐