import nibabel as nib
import numpy as np
import os
from skimage import measure
def file_name(file_dir):
L=[]
path_list = os.listdir(file_dir)
path_list.sort() #对读取的路径进行排序
for filename in path_list:
if 'nii' in filename:
L.append(os.path.join(filename))
return L
def Dice(y_true, y_pred):
y_true = y_true
y_pred = y_pred
y_true_f = y_true.flatten()
y_pred_f = y_pred.flatten()
intersection = np.sum(y_true_f * y_pred_f)
return (2. * intersection + 1) / (np.sum(y_true_f) + np.sum(y_pred_f) + 1)
maskpath = 'F:/dataset/PDDCA/nii111/finalpred/sbr/'
#imgnames = file_name(maskpath)
imgnames = file_name(maskpath)
gtnames = ''
prednames = ''
labels_num = np.zeros(len(prednames))
NUM=[]
P=[]
dice_y = np.zeros(len(prednames))
dice_p = np.zeros(len(prednames))
for i in range(len(prednames)):
pred = nib.load(maskpath + prednames[i])
labels = pred.get_data()
gt = nib.load(maskpath + gtnames[i])
gtmask = gt.get_data()
labelsy = np.copy(labels)
labels = measure.label(labels, connectivity=2)
max_num = 0
for j in range(1, np.max(labels)+1):
if np.sum(labels==j) > max_num:
max_num = np.sum(labels==j)
max_pixel = j
print(np.sum(labels==j), np.sum(labels!=0))
if np.sum(labels==j)>0.1*np.sum(labels!=0):
labels[labels==j] = max_pixel
labels[labels != max_pixel]=0
labels[labels == max_pixel]=1
# labels[labels>1]=0
dice_y[i] = Dice(gtmask,labelsy)
dice_p[i] = Dice(gtmask,labels)
print(dice_y[i], dice_p[i])
nib.save(nib.Nifti1Image( labels.astype('uint8'), affine=gt.affine), gtnames[i])
医学图像分割后,如何消除噪声,我采用了去除孤立点的方法。先找到分割结果中的所有连通域,保留最大连通域或者较大的几个连通域,把其余小连通域都去掉。图像是三维的,还蛮有效果的。