0

我有一个二进制分割图作为神经网络(niftii 格式)的输出,并且只想维护最大的岛,以消除不需要的误报。

我能够通过以下方式实现这一目标:

import nibabel as nib
import numpy as np
from scipy.ndimage import label

vol = 'PATH_TO_VOLUME'
elements_in_biggest_island = 0
biggest_index = 0
aNii = nib.load(vol)
a = aNii.get_fdata()

s = np.ones((3,3,3), dtype = 'uint8')

labelled_array, num_features = label(a, structure=s)

for i in range (1, num_features + 1):
    tempArray = labelled_array
    if (np.count_nonzero(tempArray == i) > elements_in_biggest_island):
        elements_in_biggest_island = np.count_nonzero(tempArray == i)
        biggest_index = I

print("Biggest Island was at index ", biggest_index, " with a total of ", elements_in_biggest_island, " members.")

labelled_array[labelled_array == biggest_index] = 1.0
labelled_array[labelled_array < biggest_index ] = 0.0
labelled_array[labelled_array > biggest_index] = 0.0

ni_img = nib.Nifti1Image(labelled_array, aNii.affine)
nib.save(ni_img, f'PATH_TO_PROCESSED_VOL')

但是“阈值”是非常低效的。在另一个应用程序中,我使用 numpy.where(),与显示的阈值方法相比,它产生了很好的加速。我的方法是,通过以下方式删除 array[array>I] == x 行:

labelled_array = np.where(labelled_array==biggest_index, 1, 0)

这条确切的线在另一个应用程序中完美运行,但在这里我只得到一个黑色的 3D 体积,这对我不起作用。有人能指出我犯的错误吗?

4

0 回答 0