提取最小边界框

时间:2015-03-08 14:34:43

标签: matlab image-processing bounding-box

我有一个体积(图像)和一个包裹某个结构的最小边界框。 我使用以下算法来提取最小边界框

http://uk.mathworks.com/matlabcentral/fileexchange/18264-minimal-bounding-box/content/minboundbox.m

所以我得到一个看起来像这样的边界框

Minimal Bounding Box in the volume space

现在,我想从MBB创建一个新卷。换句话说,我想将MBB中的每个点映射到一个轴平行的新框。

我可以从角点获取新盒子的尺寸

 dim = [0 0 0];
 x = cp(:,1);
 y = cp(:,2);
 z = cp(:,3);
 dim(3) = sqrt( (x(1)-x(2))^2 + (y(1)-y(2))^2 + (z(1)-z(2))^2 );
 dim(1) = sqrt( (x(1)-x(4))^2 + (y(1)-y(4))^2 + (z(1)-z(4))^2 );
 dim(2) = sqrt( (x(1)-x(5))^2 + (y(1)-y(5))^2 + (z(1)-z(5))^2 );

现在,我可以应用minboundbox算法返回的旋转矩阵

 A = zeros(4,4); A(1:3, 1:3) = R; A(4,4) = 1;
 tform = affine3d(A);
 N = numel(img);
 [X,Y,Z] = ind2sub(size(img), 1:N);
 V = img(1:N);
 [Xt, Yt, Zt] = transformPointsForward (tform,X,Y,Z);
 Xt = reshape(Xt, size(img));
 Yt = reshape(Yt, size(img));
 Zt = reshape(Zt, size(img));

现在我被卡住了。我需要:

  • 在常规网格中插入与这些坐标关联的值(我试过的任何方法都是OUT OF MEMORY,图像的大小=(300,400,500));

  • 仅提取MBB的区域。

任何想法我该怎么做?

更新主要问题不是如何获得Xt,Yt,Zt ......

问题是,由于Xt,Yt和Zt形成一个不规则的点网格,并且某些值相关联,我如何得到带插值点的规则网格?我试过这个,但内存不足

Vq = griddata(Xt, Yt, Zt, double(V), 1:dim(1), 1:dim(2), 1:dim(3));

1 个答案:

答案 0 :(得分:1)

如果要仅提取MBB的区域,则更容易将MBB的空间映射到单位立方体。这是我将如何做到这一点(注意这主要是伪代码,不能保证它的工作原理。我会很快在我的另一台计算机上的matlab实例上试一试......)

Translation = eye(4)
Translation(1:3, 4) = transpose(-cornerpoints(1,:))

BoxAxisX = transpose(cornerpoints(:,4) - cornerpoints(:,1))
BoxAxisX = BoxAxisX / norm(BoxAxisX)

BoxAxisY = transpose(cornerpoints(:,5) - cornerpoints(:,1))
BoxAxisY = BoxAxisY / norm(BoxAxisY)

BoxAxisZ = transpose(cornerpoints(:,2) - cornerpoints(:,1))
BoxAxisZ = BoxAxisZ / norm(BoxAxisZ)

Rotation = eye(4)
Rotation(1:3,1:3) = [ BoxAxisX, BoxAxisY, BoxAxisZ ]

Scale = diag( [ (1/dim(1)) (1/dim(2)) (1/dim(3)) 1 ] )

A = affine3d( Scale * Rotation * Translation )

[Xt, Yt, Zt] = transformPointsForward (A,X,Y,Z);

% Now all your points that are within the box should satisfy unit constraints
GoodIndices = Xt <= 1 && Xt >= 0 && Yt <= 1 && Yt >= 0 && Zt <= 1 && Zt >= 0
GoodX = Xt(GoodIndices)
...

一般的想法是将盒子放回原点上有一个点的单位立方体。以下是步骤:

  • 选择一个基点;这将成为你的起源。
  • 从形成框边界的基点查找向量;这是你当前的坐标系。
  • 从这些向量构造旋转矩阵;这是使用您选择的基点从标准基矢量(X,Y,Z)到您的箱子旋转的矩阵。反转这个矩阵。
  • 将框翻译回来,使基点现在位于原点
  • 现在使用倒置旋转矩阵并将其应用到您的盒子中。
  • 请注意,您的框现在在原点处与轴对齐。现在你需要做的就是适当地缩放你的盒子。

我不使用它们给出的旋转矩阵的原因是我不知道它将朝向哪个轴以及它绕哪个点旋转(围绕原点旋转!什么!)。所以...使用你知道允许你选择基点的角点来构造旋转矩阵更容易。

至于内存不足例外......有很多关于如何减少内存使用量的帖子。虽然图像尺寸很大..(~240MB)