2

この関数の速度をどのように改善できますか?

def foo(mri_data, radius):

    mask = mri_data.copy()

    ny = len(mri_data[0,:])
    nx = len(mri_data[:])

    for y in xrange(0, ny):
        for x in xrange(0, nx):
            if (mri_data[x-radius:x+radius,y-radius:y+radius] != 1.0).all():
                mask[x,y] = 0.0                    
    return mask.copy() 

numpy配列の形式で画像スライスを取り込みます。各ピクセルを反復処理し、そのピクセルの周囲のバウンディングボックスをテストします。ボックス内に1に等しい値がない場合は、0に設定してそのピクセルを破棄します。

使用できると言われましたがnumpy.convolve、どういう関係があるのか​​わかりません。

編集:画像の値はバイナリ範囲にあるため、最小値は0.0、最大値は1.0です。例の間に値がある場合:0.767。

4

2 に答える 2

3

畳み込みを乱用できるケースの1つ。私はそれを使用しませんが、それ以外の場合、境界は退屈です...

from scipy.ndimage import convolve

not_one = (mri_data != 1.0) # are you sure you want to compare with float like that?!

conv = convolve(not_one, np.ones((2*radius, 2*radius)))
all_not_one = (conv == (2*radius)**2)

mask[all_not_one] = 0

本当に同じことをする必要があります...

于 2013-02-07T19:14:47.327 に答える
3

あなたがしていることはと呼ばれていますがbinary_dilation、あなたのコードには小さなバグがあります。具体的には、x、yが半径よりも小さい場合に負のインデックスを取得します。これらの負の数は、numpyインデックスルールを使用して解釈されます。これは、ここでのインデックス作成で必要なものではなく、画像の2つのエッジで間違った結果をもたらします。

これは、バイナリ拡張を使用して同じことを実行し、上記のバグを修正するコードです。

import numpy as np
from scipy.ndimage import binary_dilation

def foo(mri_data, radius):
    structure = np.ones((2*radius, 2*radius))
    # I set the origin here to match your code
    mask = binary_dilation(mri_data == 1, structure, origin=-1)
    return np.where(mask, mri_data, 0)
于 2013-02-07T20:10:16.157 に答える