为什么在 Matlab 中对 3D 图像的形态学操作如此缓慢?

Why are morphological operations on 3D images so slow in Matlab?

我是 运行 Matlab 2016a 并且在 301x301x271 逻辑图像上使用 imopen。 示例代码:

A = randi([0 1], 301, 301, 271);
A = logical(A);
se = strel('sphere',12);
tic;
A = imopen(A, se);
toc;

经过的时间是 294.313918 秒。

使用所有 4 个 CPU 核心。由于某种原因(600 秒),从一个函数中调用相同的代码仅使用一个内核。

function CreateExample()
...code...
end

使用 MITK(基本上只使用 itkBinaryMorphologicalOpeningImageFilter)做同样的事情不到 10 秒。

有优化的想法吗? Gpuarray 是不可能的,因为它是 3D 的。

我尝试 运行 您提到的两种情况(在脚本中和在函数中),在这两种情况下,我注意到 MATLAB 使用多个内核(在我的例子中也是 4 个),所以我无法重现此行为。

但是,我认为 MATLAB 对于球体比 ITK 慢的主要原因之一是 3D 球体没有分解成更小的更简单的形状。

SE = strel('disk', 12);
sum(SE.Neighborhood(:))

是697,也就是3D球体中'on'像素的个数。

另一方面立方体被分解,意思是:

SE = strel('cube', 25);
% The decompose method replaces one cube with three 3D lines, 
% applied repeatedly over the volume.
seq = SE.decompose() 
sum(seq(1).Neighborhood)
sum(seq(2).Neighborhood)
sum(seq(3).Neighborhood)

这将要进行的比较次数从 25 的立方减少到 25 的 3 倍,这可能是 ITK 所做的优化。

我很想知道您是否使用立方体,例如“se = strel('cube',25);”反而。我相当确定它要快得多。如果是这样,您可以研究分解球体并改用它,例如:

Vaz, M. S., Kiraly, A. P., & Mersereau, R. M. (2007)。欧几里德球体的多级分解。在过程中。诠释。症状。数学。形态学 (ISMM)(第 461-472 页)。