LUNA16_Challange数据预处理2

ps 直接上好像有点困难,那么先整理下LUNA16_Challange中平安科技公司的技术说明中预处理部分(还是比较好理解,理解错误欢迎指正)

Data Preprocessing

At first, we get the lung area by using traditional methods, and then preprocessing is performed on the lung area. Use -600HU as a threshold to get a 0-1 3D map, based on the size of the 3D map block and the average distance traveled by the tile to the center, and make up for all small cave depths. The final 0-1 three-dimensional map is the lung area. As the CT picture up and down there will be some slices connected with the outside world, should be removed. The final image pixel values are clip to [-1200,600], then zoom to [0,255]. Pixels for non-lung regions are set to 170. Pretreatment can eliminate the noise, such as the bright spots of the bones, the metal lines of the CT bed. And finally, we get 128*128*128 cube.

For false positive reduction track, we use a multi-scale strategy, and prepare two sizes little cube: 36*48*48 and 20*36*36. We crop little cube from the whole lung area to feed into the two classification networks. Obtain different fields of vision size of nodules to predict the overall results.

More importantly, the training dataset has extremely high false positive to true positive ratio (735418:1557). To solve the problem of category imbalance, in addition to the focal loss function, we used oversampling to increase the number of positive samples. Specific methods are sliding window crop, flip respect to x-axis, y-axis and z-axis, rotate 90, 180, 270 degrees, multi-scale transform. Finally, we expanded the positive sample more than 300 times.

数据预处理

把-600hu作为阈值获得一个0-1二值三维图。并把其中的小块都补上,最终得到一个仅含肺区域三维图。其他链接外部组织的切片去掉,最终图像值在[-1200,600],然后缩放到[0,255],非肺区域设置为170.预处理可以消除噪声,如骨骼的亮点,CT床的金属线。最终得到128*128*128的立方体。

这短短几句话其实工作量还是有点的,很多讲得不够细。下面先了解下hu值。参考:http://shartoo.github.io/medical_image_process/

 

substance HU 空气-1000肺-500脂肪-100到-50水0CSF15肾30血液+30到+45肌肉+10到+40灰质+37到+45白质+20到+30Liver+40到+60软组织,constrast+100到+300骨头+700(软质骨)到+3000(皮质骨) 这是具体值。

计算方法像素值转换到hu值:Hounsfield Unit = pixel_value * rescale_slope + rescale_intercept

可以查看病人的扫描HU值分布情况代码代码如下:

# -*- coding:utf-8 -*-
'''
this script is used for basic process of lung 2017 in Data Science Bowl
'''
import glob
import os
import pandas as pd
import SimpleITK as sitk
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import skimage, os
from skimage.morphology import ball, disk, dilation, binary_erosion, remove_small_objects, erosion, closing, reconstruction, binary_closing
from skimage.measure import label,regionprops, perimeter
from skimage.morphology import binary_dilation, binary_opening
from skimage.filters import roberts, sobel
from skimage import measure, feature
from skimage.segmentation import clear_border
from skimage import data
from scipy import ndimage as ndi
import matplotlib
#matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import pydicom
import scipy.misc
import numpy as npdef load_scan(path):slices = [pydicom.read_file(path + '/' + s) for s in os.listdir(path)]slices.sort(key = lambda x: int(x.ImagePositionPatient[2]))try:slice_thickness = np.abs(slices[0].ImagePositionPatient[2] - slices[1].ImagePositionPatient[2])except:slice_thickness = np.abs(slices[0].SliceLocation - slices[1].SliceLocation)for s in slices:s.SliceThickness = slice_thicknessreturn slicesdef get_pixels_hu(slices):image = np.stack([s.pixel_array for s in slices])# Convert to int16 (from sometimes int16),# should be possible as values should always be low enough (<32k)image = image.astype(np.int16)# Set outside-of-scan pixels to 0# The intercept is usually -1024, so air is approximately 0image[image == -2000] = 0# Convert to Hounsfield units (HU)for slice_number in range(len(slices)):intercept = slices[slice_number].RescaleInterceptslope = slices[slice_number].RescaleSlopeif slope != 1:image[slice_number] = slope * image[slice_number].astype(np.float64)image[slice_number] = image[slice_number].astype(np.int16)image[slice_number] += np.int16(intercept)return np.array(image, dtype=np.int16)first_patient = load_scan('E:/DcmData/xlc/Fracture_data/Me/3004276169/3302845/')
first_patient_pixels = get_pixels_hu(first_patient)
plt.hist(first_patient_pixels.flatten(), bins=80, color='c')
plt.xlabel("Hounsfield Units (HU)")
plt.ylabel("Frequency")
plt.show()

结果如下:

这里的读入数据是一个ct序列(dcm文件)就是在E:/DcmData/xlc/Fracture_data/Me/3004276169/3302845/路径下,由于是公司的数据这里就不共享了。转为luna16数据集该怎么处理呢。一直在寻找MHD格式数据的处理方法,对于dicom格式的CT有很多论文根据其HU值域可以轻易地分割肺、骨头、血液等,但是对于MHD没有这样的参考。从LUNA16论坛得到的解释是,LUNA16的MHD数据已经转换为HU值了。

图像值在[-1200,600],然后缩放到[0,255],非肺区域设置为170.代码:

import SimpleITK as sitk
import matplotlib.pyplot as plt
import numpy as np
# -*- coding:utf-8 -*-
'''
this script is used for basic process of lung 2017 in Data Science Bowl
'''
import glob
import os
import pandas as pd
import SimpleITK as sitk
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import skimage, os
from skimage.morphology import ball, disk, dilation, binary_erosion, remove_small_objects, erosion, closing, reconstruction, binary_closing
from skimage.measure import label,regionprops, perimeter
from skimage.morphology import binary_dilation, binary_opening
from skimage.filters import roberts, sobel
from skimage import measure, feature
from skimage.segmentation import clear_border
from skimage import data
from scipy import ndimage as ndi
import matplotlib
#matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import pydicom
import scipy.misc
import numpy as npfilename='E:\\JLS\\dcm_data\\luna\\subsets\\subset1\\1.3.6.1.4.1.14519.5.2.1.6279.6001.173106154739244262091404659845.mhd'
#filename='E:\\DcmData\\xlc\\Fracture_data\\mhd_raw\\1.3.12.2.1107.5.1.4.75751.30000018103122041563700126965.mhd'
itkimage = sitk.ReadImage(filename)#读取.mhd文件
numpyImage = sitk.GetArrayFromImage(itkimage)#获取数据,自动从同名的.raw文件读取#numpyImage[numpyImage > -600] = 1
#numpyImage[numpyImage <= -600] = 0
def get_segmented_lungs(im, plot=False):'''This funtion segments the lungs from the given 2D slice.'''if plot == True:f, plots = plt.subplots(4, 2, figsize=(5, 40))'''Step 1: Convert into a binary image.'''binary = im < -600if plot == True:plots[0][0].axis('off')plots[0][0].set_title('binary image')plots[0][0].imshow(binary, cmap=plt.cm.bone)'''Step 2: Remove the blobs connected to the border of the image.'''cleared = clear_border(binary)if plot == True:plots[0][1].axis('off')plots[0][1].set_title('after clear border')plots[0][1].imshow(cleared, cmap=plt.cm.bone)'''Step 3: Label the image.'''label_image = label(cleared)if plot == True:plots[1][0].axis('off')plots[1][0].set_title('found all connective graph')plots[1][0].imshow(label_image, cmap=plt.cm.bone)'''Step 4: Keep the labels with 2 largest areas.'''areas = [r.area for r in regionprops(label_image)]areas.sort()if len(areas) > 2:for region in regionprops(label_image):if region.area < areas[-2]:for coordinates in region.coords:label_image[coordinates[0], coordinates[1]] = 0binary = label_image > 0if plot == True:plots[1][1].axis('off')plots[1][1].set_title(' Keep the labels with 2 largest areas')plots[1][1].imshow(binary, cmap=plt.cm.bone)'''Step 5: Erosion operation with a disk of radius 2. This operation isseperate the lung nodules attached to the blood vessels.'''selem = disk(2)binary = binary_erosion(binary, selem)if plot == True:plots[2][0].axis('off')plots[2][0].set_title('seperate the lung nodules attached to the blood vessels')plots[2][0].imshow(binary, cmap=plt.cm.bone)'''Step 6: Closure operation with a disk of radius 10. This operation isto keep nodules attached to the lung wall.'''selem = disk(10)binary = binary_closing(binary, selem)if plot == True:plots[2][1].axis('off')plots[2][1].set_title('keep nodules attached to the lung wall')plots[2][1].imshow(binary, cmap=plt.cm.bone)'''Step 7: Fill in the small holes inside the binary mask of lungs.'''edges = roberts(binary)binary = ndi.binary_fill_holes(edges)if plot == True:plots[3][0].axis('off')plots[3][0].set_title('Fill in the small holes inside the binary mask of lungs')plots[3][0].imshow(binary, cmap=plt.cm.bone)'''Step 8: Superimpose the binary mask on the input image.'''im=(255/1800 *im +1200*255/1800)get_high_vals = binary == 0im[get_high_vals] = 170im=np.rint(im)if plot == True:plots[3][1].axis('off')plots[3][1].set_title('Superimpose the binary mask on the input image')plots[3][1].imshow(im, cmap=plt.cm.bone)return im
def plot_ct_scan(scan):'''plot a few more images of the slices:param scan::return:'''f, plots = plt.subplots(int(scan.shape[0] / 20) + 1, 4, figsize=(50, 50))for i in range(0, scan.shape[0], 5):plots[int(i / 20), int((i % 20) / 5)].axis('off')plots[int(i / 20), int((i % 20) / 5)].imshow(scan[i])
for idx in range(1):print(len(numpyImage))plot_ct_scan(numpyImage)data = numpyImage[50]print(data[314][303])plt.figure(100)plt.imshow(data, cmap='gray')im=get_segmented_lungs(data, plot=True)print(im[7][7])print(im[314][303],np.max(np.max(im)),np.min(np.min(im)))plt.figure(200)plt.imshow(im, cmap='gray')
plt.show()

结果如下:

原图与最终结果如下:

没缩放到[0,255]时的最终结果与缩放之后的图是一致的,原图与最终结果中间颜色不太一致应该是画图自适应的缘故,中间部分值是一样的(没缩放到[0,255]之前)。

把-600hu作为阈值获得一个0-1二值三维图。并把其中的小块都补上,最终得到一个仅含肺区域三维图这步直接做卡在了参考的http://shartoo.github.io/medical_image_process/中measure.marching_cubes函数已经被移除无法画出3d图,结果很不直观,其实上面一步代码中已经用到-600hu作为阈值,而并把其中的小块都补上,最终得到一个仅含肺区域三维图这一步在二维层面也已经得到了。重新拼接起来就是3维。

其他链接外部组织的切片去掉这步比较麻烦,感觉还是在上面代码中根据肺部面积占总面积的比重来判断,上面代码中添加代码如下:

    '''Step 8: Superimpose the binary mask on the input image.'''sum=0for r in regionprops(label_image):sum=sum+r.areaproportion=sum/(512*512)LP.append(proportion)

函数添加一个LP=[] 参数,最后返回LP(lung proportion),最后要选取128*128*128.根据比重最大值来选那128个切片。

但是还有一个问题是还没有归一化尺度,感觉是要放之之前要做的。那么先归一化尺度为[1,0.5556,0.5556](zxy)另一片技术文档。代码是根据上一篇博文中的参考中的代码修改的:

from os import listdir
import numpy as np
import Provider
from scipy import ndimage# Directories
baseSubsetDirectory = r'E:/JLS/dcm_data/luna/subsets/subset'
targetSubsetDirBase = r'E:/JLS/dcm_data/luna/Resampled_1_0.7_0.7/subsets/subset'RESIZE_SPACING = [1, 0.5556, 0.5556]
NUM_SUBSET = 10for setNumber in range(NUM_SUBSET):subsetDirectory = baseSubsetDirectory + str(setNumber)list = listdir(subsetDirectory)subsetList = []# Create Subset Listfor file in list:if file.endswith(".mhd"):subsetList.append(file)for file in subsetList:try:fileName = file[:-4]filePath = subsetDirectory + '/' + filevolumeImage, numpyOrigin, numpySpacing = Provider.load_itk_image(filePath)resize_factor = numpySpacing / RESIZE_SPACINGnew_real_shape = volumeImage.shape * resize_factor# volumeImage[volumeImage <= -600]= 0# volumeImage[volumeImage > -600] = 1new_shape = np.round(new_real_shape)real_resize = new_shape / volumeImage.shapenew_volume = ndimage.zoom(volumeImage, zoom=real_resize)

然后将两段代码拼接起来,博文太长了就先不放了,等下篇博文再放。获得128*128*128的立方体的代码也是。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26320.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据挖掘竞赛】——糖尿病遗传风险检测挑战赛(科大讯飞)

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

【开源】23个优秀的机器学习数据集

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 作者 | Nikola M. Zivkovic 译者 | 王强 策划 | 凌敏 本文最初发布于 rubikscode.com 网站&#xff0c;经原作者授权由 InfoQ 中文站翻译并分享。 Iris 数据集的那些示例…

数据分析也能造假!你得小心这些不为人知的坑

数据分析看似科学理性&#xff0c;但是只要是人参与的工作&#xff0c;就没有不能造假的&#xff0c;尤其是类似数据分析这种工作&#xff0c;很容易产生诡辩论&#xff0c;我们需要实时擦亮眼睛&#xff01; 作为一个小头目&#xff0c;经常会读到来自各种团队的数据分析报告&…

【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

数据挖掘--(实验二)关联规则实验

实验一 有趣的频繁项集 案例简介&#xff1a; 有时我们并不想寻找所有频繁项集,而只对包含某个特定元素项 的项集感兴趣。我们会寻找毒蘑菇中的一些公共特征,利用这些特征 就能避免吃到那些有毒的蘑菇。UCI 的机器学习数据集合中有一个关于肋形蘑菇的 23 种特征的数据集,每一…

数据挖掘--糖尿病遗传风险检测

文章目录 赛事背景数据特征介绍数据处理导入数据并查看分析数据数据清洗特征工程 构建模型建立训练数据集和测试数据集构建模型 赛事背景 截至2022年&#xff0c;中国糖尿病患者近1.3亿。中国糖尿病患病原因受生活方式、老龄化、城市化、家族遗传等多种因素影响。同时&#xff…

【数据分析】业务分析之ABtest

A/B测试 AB测试是为Web或App界面或流程制作两个&#xff08;A/B&#xff09;或多个&#xff08;A/B/n&#xff09;版本&#xff0c;在同一时间维度&#xff0c;分别让组成成分相同&#xff08;相似&#xff09;的访客群组&#xff08;目标人群&#xff09;随机的访问这些版本&a…

生物信息学竞赛:糖尿病数据挖掘

糖尿病数据挖掘 一理&#xff1a;机器学习量化分析糖尿病致病因子下载&#xff1a;临床数据线性回归预测糖尿病LightGBM 预测糖尿病糖尿病因子分析变量相关性分析 一文&#xff1a;当前科学理解慢病之王的解决方案是什么怎么治疗怎么预防 一理&#xff1a;机器学习量化分析糖尿…

VS Code插件之Debugger for Chrome

号称2018最火的编辑器&#xff0c;不用用怎么行&#xff1f; 不多说直接开始踩坑之路。 要在vs中启动chrome控制台怎么办&#xff1f;vscode并没有集成环境&#xff0c;这里我们需要借助一个插件Debugger for Chrome。 选择左边安装包选项&#xff0c;点击商店搜索Debugger for…

Vscode对C/C++可视化的代码跟踪调试

文章目录 可视化的代码跟踪调试1、安装Visual Studio Code2、用vscode编译调试C\C 总结 可视化的代码跟踪调试 ubantu18.04的环境下&#xff0c;在命令行工具gdb调试基础上&#xff0c;利用可视化调试前端软件Visual Studio Code&#xff0c;&#xff08;后端依然依赖gcc、gdb…

VS Code真机测试步骤

VS Code真机测试步骤 前提&#xff1a;你的电脑跟你的手机是在同一个网络环境下。电脑连手机热点&#xff1b; 1&#xff0e; 在扩展里搜索live server&#xff0c;下载安装&#xff1b; 2&#xff0e; 打开cmd 命令窗口&#xff08;快捷键是winr&#xff09;&#xff1b; 输入…

VS Code调试C代码

1、前言 首先说明的是vscode是代码编辑器&#xff0c;并不是编译器&#xff0c;它本身并不能编译C语言。 在这里我们使用的是MinGW-w64作为C语言的编译器。MinGW-w64的前身是MinGW的全称是&#xff1a;Minimalist GNU on Windows。它实际上是将经典的开源 C语言 编译器 GCC 移…

VScode的代码截图插件CodeSnap

CodeSnap : 在 VS Code 中为您的代码截取漂亮的屏幕截图&#xff01; 插件名&#xff1a;CodeSnap官方地址&#xff1a;CodeSnap - Visual Studio Marketplace特征&#xff1a; 快速保存代码的屏幕截图将屏幕截图复制到剪贴板显示行号许多其他配置选项用法&#xff1a;选中需要…

Vscode——调试数据可视化插件debug-visualizer

debug-visualizer是一款极其优秀的调试数据可视化插件 安装方法 第一步&#xff1a;vscode插件库安装 debug-visualizer第二步&#xff1a;环境内输入 pip install vscodedebugvisualizer 使用方法 启动调试Ctrl Shift P 打开命令面板&#xff0c;输入 Debug Visualizer: …

VS Code 最好的 Git 可视化插件

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447; 作者丨小集 来源丨小集&#xff08;ID&#xff1a;zsxjtip&#xff09; Visual Studio Code 有几组 git 命令来为您的代码存储库执行和执行多项任务。但是&#xff0…

如何使用VScode软件测试接口

我们知道&#xff0c;Visual Studio Code&#xff08;简称VScode&#xff09;软件一般用于编写前端代码&#xff0c;但其实&#xff0c;它也可以很方便的用于接口测试&#xff0c;达到和postMan一样的效果。 怎么实现呢&#xff1f; 步骤如下&#xff1a; 1.安装 REST Clien…

视频特效软件有哪些?这些软件值得一试

大家平常在制作视频时&#xff0c;经常需要将多个视频拼接&#xff0c;但是如果两个视频中间没有什么转场过渡的话&#xff0c;会显得很单调。我们可以增加一些转场、音乐、特效&#xff0c;这样整支视频看起来效果会好很多。讲到视频特效&#xff0c;可能有些小伙伴会觉得它很…

python :超级大乐透

体育彩票 超级大乐透 dlt.py # codingutf-8 import randomdef xuanhao(total, count):element [x1 for x in range(total)]result []for i in range(count):res element[random.randint(0, len(element)-1)]element.remove(res)result.append(res)return result# 超级大乐透…

发卡网源码

简介&#xff1a;发卡网带代理功能&#xff0c;安装简单。 网盘地址&#xff1a;https://pan.baidu.com/s/1E3AtqCmBZPjXgaiUEXrM6Q 提取码:rsu4 展示&#xff1a;

最新鲸发卡企业发卡网系统源码+免授权

正文: 心心念念的鲸发卡来啦&#xff0c;企业发卡源码&#xff0c;鲸发卡。目前全网最稳定的发卡系统之一。 在运营版本&#xff0c;既然做就要把他当作一项事业来做。 程序开源无加密&#xff0c;完整运营级程序&#xff0c;非市面上垃圾程序BUG一堆。 此程序经过市场验证…