【问题标题】:Why are morphological operations on 3D images so slow in Matlab?为什么在 Matlab 中对 3D 图像的形态学运算这么慢?
【发布时间】:2016-05-05 04:00:58
【问题描述】:

我正在运行 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 image-processing itk mitk


【解决方案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, M. S., Kiraly, A. P. 和 Mersereau, R. M. (2007)。欧几里得球体的多级分解。在过程中。诠释。症状。数学。形态学 (ISMM)(第 461-472 页)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多