如何在MATLAB中找到更大的立方体内的小立方体?

时间:2016-04-30 03:09:34

标签: image matlab 3d

给定一个NxNxN立方体(图像),如何在NxNxN立方体中找到所有2x2x2盒子?当然,如果N是偶数,我们可以找到没有重叠的2x2x2盒子,但是当N是奇数时,在更大的立方体中找到的一些2x2x2盒子之间存在重叠。

所以,

1-如何在较大的NxNxN立方体中找到所有非重叠的2x2x2框,其中N 甚至

输入:NxNxN多维数据集 输出:所有可能的非重叠2x2x2多维数据集。

2-如何在较大的NxNxN立方体中找到所有重叠的2x2x2框,其中N 奇数?这次,2x2x2框中的重叠区域在第二次(或更多次)访问时应为零;即每个重叠区域应该不再访问(计数)。

输入:NxNxN多维数据集 输出:所有可能重叠的2x2x2多维数据集,在第二次或更多次访问中重叠体素的值为零。

1 个答案:

答案 0 :(得分:1)

我会给你一个N是偶数的部分的答案。其余的可以很容易地调整,我希望你自己可以这样做:-)或者至少尝试一下 - 如果你遇到问题,请回到我们这里。

我没有安装MATLAB,所以我希望这没有拼写错误。但这个想法应该是明确的:

% 
N = 10;

% First create all possible starting coordinates of 2x2x2 cubes within the big cube:
coords = 1:2:(N-1); % could easily be adapted to other small-cube sizes like 3x3x3 if you want to...

% Now create all possible combinations of starting-coordinates in every direction (as it is a cube, the starting points in x, y, z directions are the same):
sets = {coords, coords, coords};
[x y z] = ndgrid(sets{:});
cartProd = [x(:) y(:) z(:)]; % taken from here: http://stackoverflow.com/a/4169488/701049 --> you could instead also use this function: https://www.mathworks.com/matlabcentral/fileexchange/10064-allcomb-varargin- which generates all possible combinations

% Now cartProd contains all possible start-points of small cubes as row-vectors. If you want, you can easily calculate the corresponding vectors of end-points by simply adding +1 to every entry which will effectively yield a small-cube size of 2. If you want to further modify it to support e.g. 3x3x3 cubes, simply add +2 to every dimension.
endPoints = cartProd+1;

% E.g.: the first small cube starts at [x,y,z] = cartProd(1,:) and ends at [x_e, y_e, z_e] = endPoints(1,:).

玩得开心: - )

提示:对于奇数大的立方体 - >只需将其视为大小均匀的立方体,例如将9x9x9多维数据集视为10x10x10,从上方获取我的算法,然后将最外部的小立方体移动到中心一步。这意味着,采用具有最大x,y或z坐标的小立方体,并在该方向上减去1。因此,x_max = 9的所有小立方体的起始坐标将更改为x = 8。然后y_max = 9和z_max = 9相同。