【问题标题】:How to crop and rotate an image to bounding box?如何裁剪图像并将其旋转到边界框?
【发布时间】:2013-06-11 13:48:57
【问题描述】:
  • 我有一个包含数千张包含手的图像的数据集
  • 我还有 .mat 文件,其中包含边界框 4 个角的坐标
  • 但是,这些边界框的边缘与 x 和 y 轴成一定角度。例如,

  • 我想使用边界框坐标裁剪手,然后旋转手,使其与 x 或 y 轴对齐。

编辑:

手表示如下:

但是,请记住矩形不是直的。所以,我必须旋转它才能把它弄直。

【问题讨论】:

  • 你能举例说明每个矩形是如何表示的吗?
  • 你有图片处理工具箱吗?
  • @m_power,是的。我有图像处理工具箱。

标签: matlab image-processing computer-vision


【解决方案1】:

好样的!

第一步:

计算矩形的大小

 width = sqrt( sum( (b-a).^2 ) );
 height = sqrt( sum( (c-b).^2 ) );

第二步:

计算从a...d 到正立图像的仿射变换

 Xin = [a(2) b(2) c(2) d(2)];
 Yin = [a(1) b(1) c(1) d(1)];
 Xout = [width 1 1 width];
 Yout = [1 1 height height];
 A = [Xin;Yin;ones(1,4)]';
 B = [Xout; Yout]';
 H = B \ A; % affine transformation

请注意,尽管我们允许 H 仿射,但角的选择(取决于 widthheight)将确定 H 不会扭曲裁剪的矩形。

可选择使用cp2tform:

 H2 = cp2tform( [Xin;Yin]', [Xout;Yout]', 'nonreflectivesimilarity' );

第三步

使用变换得到相关的图片部分

 thumb = tformarray( img, maketform( 'affine', H' ), ... %//'
                     makeresampler( 'cubic', 'fill' ), ...
                     1:2, 1:2, ceil( [height width] ), [], 0 );

可选择使用imtransform:

 thumb = imtransform( img, H2, 'bicubic' );

关于矢量化的说明:

取决于角坐标的存储方式(a...d)前两步可以很容易地矢量化。

【讨论】:

  • 您确定仿射变换是一个不错的选择吗?仿射变换不一定保留角度或长度。我希望保留角度和长度。
  • @PrernaChikersal 这就是我们迈出第一步的原因 - 确保保留纵横比。
  • 保持纵横比是一回事,但长度会有所不同,对吧?与其他答案相比,使用 ur 方法的优缺点是什么?
  • @PrernaChikersal 你告诉我。您是否设法实施了其他解决方案?
  • 好吧,我正在尝试决定使用哪一个。我对仿射变换的唯一担心是它不会保留长度等
【解决方案2】:

您可以使用imrotate 命令旋转图像。

您可以使用索引来裁剪图像(一旦它们被正确旋转)。即

subimg = img( c(1):b(1), c(2):d(2) )

(注意,以上行是假设,您已经通过imrotate 命令跟踪了角点,因此 c(2) == b(2)、c(1) == d(1) 等。 )

【讨论】:

  • 好吧,“索引”是什么意思。我拥有的边界框的坐标是旋转前的图像。那么,如何使用索引来裁剪图像?
  • 如何使用 imrotate 跟踪角点?
  • 嗯...@John,imrotate 的角度和旋转矩阵是相同还是相反?
  • 旋转角度应该是a&b连线与x轴的夹角吗?
  • 就我个人而言,我只是通过反复试验来回答这些问题。
猜你喜欢
  • 2013-05-18
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2020-04-26
相关资源
最近更新 更多