1. 程式人生 > >LIDC資料集肺區分割

LIDC資料集肺區分割

在使用LIDC資料集做肺結節檢測時對肺區進行分割後效果會好很多,主要是減少肺區以外的組織對檢測的干擾。

方法比較簡單:

首先是閾值分割,設定CT值為480HU作為閾值對CT影象進行分割,得到二值影象,然後使用flood fill填充方法對肺區以外的部分進行填充,接下來使用形態學方法腐蝕掉肺區中的殘餘部分,最終將得到的結果作為掩模與原影象疊加得到肺區影象。 MATLAB程式碼:
def img_segmentation(dicom_file):
    threshold = -480 / dicom_file.RescaleSlope - dicom_file.RescaleIntercept
    mask=dicom_file.pixel_array
    mask=(mask>threshold).astype(np.float32)
    element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10))
    mask = cv2.erode(mask, element)
    cols,rows=mask.shape[:2]
    #cv2.imshow('mask', mask)
    #cv2.waitKey()
    mask_back=mask.copy()
    flood_mask=np.zeros([cols+2,rows+2],dtype=np.uint8)
    cv2.floodFill(mask,flood_mask,(0,0),255)
    element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4, 4))
    mask = cv2.dilate(mask, element)
    #cv2.imshow('mask', mask)
    #cv2.waitKey()
    #mask=(mask.astype(np.uint8))*255
    #mask=255-mask
    #return mask
    #seg=mask*(dicom_file.pixel_array)
    mask=1.0-mask/255
    mask=mask-mask_back
    mask=mask*(mask>0)
    #mask=(mask.astype(np.uint8))*
    print mask.max(), mask.min()
    flood_mask = np.zeros([cols + 2, rows + 2], dtype=np.uint8)
    cv2.floodFill(mask, flood_mask, (0, 0), 255)
    print mask.max(), mask.min()
    mask=mask.astype(np.uint8)
    mask=(mask<128).astype(np.float32)
    #cv2.imshow('mask',mask)
    #cv2.waitKey()
    return mask