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

时间:2016-05-04 14:41:10

标签: matlab image-processing itk mitk

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

 <script>
  $(function() {
    var availableTags = [
      "ActionScript",
      "AppleScript",
      "Asp",
      "BASIC",
      "C",
      "C++",
      "Clojure",
      "COBOL",
      "ColdFusion",
      "Erlang",
      "Fortran",
      "Groovy",
      "Haskell",
      "Java",
      "JavaScript",
      "Lisp",
      "Perl",
      "PHP",
      "Python",
      "Ruby",
      "Scala",
      "Scheme"
    ];
    $( "#tags" ).autocomplete({
      source: availableTags
    });
  });
  </script>

经过的时间是294.313918秒。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

然而,我认为MATLAB比一个球体的ITK慢的一个主要原因是3D球体不会分解成更小的更简单的形状。

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

是697,这是&#39; on&#39; 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倍的比较次数,这可能是ITK为优化它而做的。

我很想知道你是否使用了一个立方体,比如&#39; se = strel(&#39; cube&#39;,25);&#39;代替。我相当肯定它会快得多。如果确实如此,您可以调查分解球体并使用它,例如:

Vaz,M。S.,Kiraly,A。P.,&amp; Mersereau,R。M.(2007)。欧几里德球的多级分解。在Proc。诠释。 SYMP。数学。形态学(ISMM)(第461-472页)。