0

我正在运行 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 的。

4

1 回答 1

1

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

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

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

是 697,这是 3D 球体中“开”像素的数量。

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

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, MS, Kiraly, AP 和 Mersereau, RM (2007)。欧几里得球体的多级分解。在过程中。诠释。症状。数学。形态学 (ISMM)(第 461-472 页)。

于 2016-05-04T20:00:58.277 回答