matlab - 如何裁剪图像并将其旋转到边界框?

标签 matlab image-processing computer-vision

  • 我有一个包含数千张包含手的图像的数据集
  • 我还有 .mat 文件,其中包含边界框 4 个角的坐标
  • 但是,这些边界框的边缘与 x 和 y 轴成一定角度。例如, enter image description here

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

编辑:

watch 示如下:

但是,请记住矩形不是直的。所以,我必须旋转它来拉直它。

enter image description here

最佳答案

好一个!

第一步:

计算矩形的大小

 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),前两个步骤可以轻松矢量化。

关于matlab - 如何裁剪图像并将其旋转到边界框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17045809/

相关文章:

python - 负坐标对 cv2.perspectiveTransform 意味着什么?

image-processing - HoG 特征如何以图形方式表示?

二值图像的泛洪填充C++算法

r - 在矩阵中识别 "clusters"或 "groups"

python加载几个matlab文件

c++ - 如何将特定大小的字符复制到另一个图像中与原始图像中相同的位置?

java - 是否可以使用调用 Java 方法(回调)的 JNI native 线程来更新 Swing UI 组件?

opencv - OpenCV上的图形切割

matlab - MATLAB 中的基本函数

c++ - 通过 Mex 文件与 C++ 对象交互