1. 程式人生 > >LUNA16資料集肺結節系列一親測

LUNA16資料集肺結節系列一親測

ps主要是基於該博主https://home.cnblogs.com/u/wzyuan/feed/blog/2.html  的LUNA16資料集系列上的親測為更加小白的我一樣。博主的方法可行但是有些還有補全才能出結果,希望對你有幫助。

1.資料集太大了我就上傳我用的這個序列

連結:https://pan.baidu.com/s/1pcGQlQkE7ykGMczyz3JONw 
提取碼:1h9k 
 

2.改了之後的程式碼(相關庫可要自己裝了,不可以看之前的部落格或百度)

import SimpleITK as sitk
import matplotlib.pyplot as plt
import numpy as np
filename='E:\\JLS\\dcm_data\\luna\\subset1\\1.3.6.1.4.1.14519.5.2.1.6279.6001.173106154739244262091404659845.mhd'
itkimage = sitk.ReadImage(filename)#讀取.mhd檔案
OR=itkimage.GetOrigin()
print(OR)
SP=itkimage.GetSpacing()
print(SP)
numpyImage = sitk.GetArrayFromImage(itkimage)#獲取資料,自動從同名的.raw檔案讀取

def show_nodules(ct_scan, nodules,Origin,Spacing,radius=20, pad=2, max_show_num=4):  # radius是正方形邊長一半,pad是邊的寬度,max_show_num最大展示數

    show_index = []
    for idx in range(nodules.shape[0]):  # lable是一個nx4維的陣列,n是肺結節數目,4代表x,y,z,以及直徑
        if idx < max_show_num:
            if abs(nodules[idx, 0]) + abs(nodules[idx, 1]) + abs(nodules[idx, 2]) + abs(nodules[idx, 3]) == 0: continue

            x, y, z = int((nodules[idx, 0]-Origin[0])/SP[0]), int((nodules[idx, 1]-Origin[1])/SP[1]), int((nodules[idx, 2]-Origin[2])/SP[2])
            print(x, y, z)
            data = ct_scan[z]
            radius=int(nodules[idx, 3]/SP[0]/2)
            #pad = 2*radius
            # 注意 y代表縱軸,x代表橫軸
            data[max(0, y - radius):min(data.shape[0], y + radius),
            max(0, x - radius - pad):max(0, x - radius)] = 3000  # 豎線
            data[max(0, y - radius):min(data.shape[0], y + radius),
            min(data.shape[1], x + radius):min(data.shape[1], x + radius + pad)] = 3000  # 豎線
            data[max(0, y - radius - pad):max(0, y - radius),
            max(0, x - radius):min(data.shape[1], x + radius)] = 3000  # 橫線
            data[min(data.shape[0], y + radius):min(data.shape[0], y + radius + pad),
            max(0, x - radius):min(data.shape[1], x + radius)] = 3000  # 橫線

            if z in show_index:  # 檢查是否有結節在同一張切片,如果有,只顯示一張
                continue
            show_index.append(z)
            plt.figure(idx)
            plt.imshow(data, cmap='gray')

    plt.show()
b = np.array([[-116.2874457,21.16102581,-124.619925,10.88839157],[-111.1930507,-1.264504521,-138.6984478,17.39699158],[73.77454834,37.27831567,-118.3077904,8.648347161]])
show_nodules(numpyImage,b,OR,SP)

3.結果影象

比較好的割出了結果。

4.針對這個資料很好的理解mhd引數和dcm的文章https://blog.csdn.net/zyc2017/article/details/84030903