我正在运行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。
答案 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页)。