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 コアすべてを使用します。関数内から同じコードを呼び出すと、何らかの理由で 1 つのコアしか使用されません (600)。

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

MITK (基本的には itkBinaryMorphologicalOpeningImageFilter を使用するだけ) を使用して同じことを行うと、10 秒もかかりません。

最適化のアイデアはありますか? 3DなのでGpuarrayは不可。

4

1 に答える 1

1

あなたが言及した両方の状況 (スクリプト内と関数内) を実行しようとしましたが、どちらの場合も、MATLAB が複数のコア (私の場合も 4 つ) を使用していることに気付き、この動作を再現できません。

ただし、MATLAB が球の ITK よりも遅い主な理由の 1 つは、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 の 3 乗から 25 の 3 倍に減少します。これはおそらく、ITK がこれを最適化するために行っていることです。

'se = strel('cube',25);' のような立方体を使用しているかどうか知りたいです。代わりは。私はそれがはるかに速いと確信しています。その場合は、球体を分解して代わりに使用することを検討できます。次に例を示します。

Vaz, MS, Kiraly, AP, & Mersereau, RM (2007). ユークリッド球のマルチレベル分解。手続き中。内外 症状 算数。形態学 (ISMM) (pp. 461-472)。

于 2016-05-04T20:00:58.277 に答える