【问题标题】:How to rotate an image 45 degrees twice in matlab and keep the same size at the end?如何在matlab中将图像旋转45度两次并在最后保持相同的大小?
【发布时间】:2012-11-29 03:18:30
【问题描述】:

我想:

  1. 将图像(尺寸 512x512)旋转 45 度。
  2. 对其进行一些处理。
  3. 将图像旋转 -45 度。

我的问题是当我应用 45 度和 -45 度的旋转时,图像的大小会发生变化,我希望它是相同的。

【问题讨论】:

  • 同样大小是什么意思?
  • 你试过什么?

标签: matlab image-processing octave


【解决方案1】:

旋转图像的通常过程是放大图像,旋转图像并缩小图像。这样,您可以避免旋转时出现的暗边距。

Matlab 自动执行此过程。因此,如果您想要图像的特定尺寸,则必须在旋转图像后选择图像的适当区域。

假设我们想要旋转图像并且想要保留与原始图像相同的尺寸,我们可以这样做:

    img = imread('image.png'); 
    r = numel(img(:,1));
    c = numel(img(:,2));
    nimg = imrotate(img, 45);
    nimg = imrotate(nimg, 45);
    n_R = numel(nimg(:,1));
    n_C = numel(nimg(:,2));
    n_R = n_R+mod(n_R, 2); %to avoid dimensions being in double datatype
    n_C = n_C+mod(n_C, 2);
    oimg = nimg(((n_R/2)-(r/2)):((n_R/2)+(r/2)), ((n_C/2)-(c/2)):((n_C/2)+(c/2)),:);
    imwrite(oimg, 'rot_image.png');

【讨论】:

  • 不错。但最终图像中有一个错误。如果r != c 也会有问题,因为在最终图像中rc 被切换。
  • 是的,要使其等于原始维度,我们可以这样做:oimg = nimg(((n_R/2)-(r/2)):((n_R/2)+( r/2))-1, ((n_C/2)-(c/2)):((n_C/2)+(c/2))-1,:);但是,如果您尝试两种替代方法,您会注意到其中一个的最后一行和一列带有锯齿,而在后一种情况下,该行和列被删除。这是由于 MATLAB 旋转图像的方式造成的。我更喜欢使用 IrfanView 或 XnView 旋转图像
【解决方案2】:

你做不到。这没有意义。简单实验:

  1. 拿一张正方形纸,靠在白墙上
  2. 在墙上画出正方形的边框
  3. 将这张纸旋转 45 度
  4. 在墙上再画一个正方形,把旋转的纸包起来
  5. 把纸从墙上拿出来,看看为什么你不能这样做
  6. 在墙上留下标记,以免忘记

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2022-01-12
    • 2020-10-03
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多