3

私は非常に複雑なコードを実行しているので、以前は機能していたので詳細は気にしませんが、今はこのエラーが発生しています。

粒子は 0 または 255 で満たされた 3D タプルであり、scipy 重心関数を使用してから、値を最も近い整数に変換しようとしています (配列を扱っているため)。エラーは最後の行で見つかりました...誰がこれがなぜなのか説明できますか??

2 行目は粒子を塗りつぶします 3 行目は、異なるラベルを持つ周囲の粒子を削除します (これはすべてのラベルの for ループにあります)

Particle = []
Particle = big_labelled_stack[x_start+20:x_stop+20,y_start+20:y_stop+20,z_start+20:z_stop+20]
Particle = np.where(Particle == i ,255,0)

CoM = scipy.ndimage.measurements.center_of_mass(Particle)
CoM = [ (int(round(x)) for x in CoM ] 

前もって感謝します。さらにコードが必要な場合は質問してください。

################## その他のコード
 border = 30

[labelled_stack,no_of_label] = label(labelled,structure_array,output_type)
# RE-LABEL particles now no. of seeds has been reduced! LAST LABELLING

#Increase size of stack by increasing borders and equal them to 0; to allow us to cut out particles into cube shape which else might lye outside the border
h,w,l = labelled.shape
big_labelled_stack = np.zeros(shape=(h+60,w+60,l+60),dtype=np.uint32)

 # Creates an empty border around labelled_stack full of zeros of size border

if (no_of_label > 0):       #Small sample may return no particles.. so this stage not neccesary

    info = np.zeros(shape=(no_of_label,19))          #Creates array to store coordinates of particles

    for i in np.arange(1,no_of_label,1):  


        coordinates = find_objects(labelled_stack == i)[0] #Find coordinates of label i.
        x_start = int(coordinates[0].start)
        x_stop = int(coordinates[0].stop)
        y_start = int(coordinates[1].start)
        y_stop = int(coordinates[1].stop)
        z_start = int(coordinates[2].start)
        z_stop = int(coordinates[2].stop)

        dx = (x_stop - x_start)  
        dy = (y_stop - y_start)
        dz = (z_stop - z_start)

        Particle = np.zeros(shape=(dy,dx,dz),dtype = np.uint16)                
        Particle = big_labelled_stack[x_start+30:x_start+dx+30,y_start+30:y_start+dy+30,z_start+30:z_start+dz+30]
        Particle = np.where(Particle == i ,255,0)

        big_labelled_stack[border:h+border,border:w+border,border:l+border] = labelled_stack   
        big_labelled_stack = np.where(big_labelled_stack == i , 255,0)
        CoM_big_stack = scipy.ndimage.measurements.center_of_mass(big_labelled_stack)
        C = np.asarray(CoM_big_stack) - border



        if dx > dy:
            b = dx
        else:                           #Finds the largest of delta_x,y,z and saves as b, so that we create 'Cubic_Particle' of size 2bx2bx2b (cubic box)
            b = dy
        if dz > b:
            b = dz

        CoM = scipy.ndimage.measurements.center_of_mass(Particle)
        CoM = [ (int(round(x))) for x in CoM ] 


        Cubic_Particle = np.zeros(shape=(2*b,2*b,2*b))
        Cubic_Particle[(b-CoM[0]):(b+dx-CoM[0]),(b-CoM[1]):(b+dy-CoM[1]),(b-CoM[2]):(b+dz-CoM[2])] = Particle

        volume = Cubic_Particle.size    # Gives volume of the box in voxels



        info[i-1,:] = [C[0],C[1],C[2],i,C[0]-b,C[1]-b,C[2]-b,C[0]+b,C[1]+b,C[2]+b,volume,0,0,0,0,0,0,0,0] # Fills an array with label.No., size of box, and co-ords            


else:
    print('No particles found, try increasing the sample size')
    info = []

ラベル付けされた粒子でいっぱいのスタックがあるので、やろうとしていることは 2 つあります。最初に、CoM_big_labelled_stack (および C) が行う labelled_stack に関して各粒子の重心を見つけます。座標を info というリスト (タプル) に格納します。また、重心を中心として粒子の周りに立方体のボックスを作成しようとしています (これは CoM 変数に関連しています)。そのため、最初に scipy のオブジェクト検索関数を使用して粒子を見つけ、次にこれらを使用します。粒子の周りに非立方体のボックスを作成し、その質量の中心を見つけます。次に、ボックスの最長の寸法を見つけて b と呼び、サイズ 2b の立方体のボックスを作成し、正しい位置に粒子で満たします。

申し訳ありませんが、このコードは混乱しています。私はPythonに非常に慣れていません

4

0 に答える 0