说点题外话:最近参加了一个学院老师的创新项目(其实早就参加了,咸鱼划水到了现在才动 ),内容是使用机器学习算法对肾癌CT影像数据进行预测,所以就有了第一步–数据预处理(给自己挖了一个大大的坑 ),就一个数据预处理代码我写了一个多星期,我也是服了我自己了。数据保密,大家就不要想找我要数据了,我是不会给的,这个博客只是用来记录一下我的惨淡经历。
数据处理过程中遇到的坑:
1、由于自己第一次接触医学,第一次用代码实现CT数据预处理,所以都是从网上现学现用,从如何读入 n r r d nrrd nrrd文件到学长教我如何实现 d i c m dicm dicm文件数据的有效读入(这里面涉及到的知识点我忘记了,我还傻乎乎的调用了 p y t h o n python python读 d i c m dicm dicm文件的库函数,后来学长指出我的错误,索性我就直接用了学长的读 d i c m dicm dicm文件的函数),注意是需要归一化操作的。
2、一开始我基本实现了功能之后我就没管挂机了,后面我组长(和我一起进行数据预处理工作,她要是有博客的话我就@她了,一个超好看的妹子 ),比对结果图和用软件打开的原图时发现有很大的问题(遇事不要慌,有问题就解决问题 ),切出来的肾癌部分完全对不上,而且纹路也不对,然后我就陷入了无穷的调 b u g bug bug中,但是始终不知道哪错了,其实现在回想起来当时应该发现第3条里面的错误的,但是并没有(因为自己懒 ),于是尝试失败!
3、之后向学长汇报结果,请教学长时,学长跟我们(我和前面提到的组长妹子)说,图片横纵坐标是反的,然后从 n r r d nrrd nrrd文件对应的 d i c m dicm dicm索引不是正向对应的,而是反向的(不是 i i i到 i i i的,而是 i i i到 l e n − 1 − i len-1-i len−1−i的),我幡然醒悟,原来我是这里没注意啊,赶紧又是滚回去调 b u g bug bug。
4、经历过第3点的指点之后,我花了将近一周的时间(其实并没有,中间有上课的)修 b u g bug bug,然后对比结果图和软件打开的图,自我感觉应该没问题了,扔给组长仔细全面对比去了(其实是因为我电脑上的软件不知道为啥抽风了,不方便比对),然后组长妹子对比完之后告诉我还是不对,肾癌纹路不对,我懵逼,不知道为啥不对的情况下决定先确定一个事情----我没有切错帧(因为CT图是空间上的切片,所以大多数情况下前后帧差别不大),于是我经过不断地调代码跑图扔给组长(其实我也有对比的),最后总算是确定没有切错帧。这个时候问题来了,帧没错但是肿瘤部分纹路还是不对(我们的预处理是保留肿瘤部分,非肿瘤部分置为黑色背景色),我想了好久都没有想出来到底为啥。
5、在晚上睡不着的时候脑子里无意闪现出一个方法验证:因为肿瘤区域太小了不好比对,我们为何不反向操作,把肿瘤部分置为黑色,其他部分保留原色,这样不是可以同步解决两个问题:一个是4中的切错帧的问题,一个是为啥会纹路不对的问题。第二天就试了试我的想法,运行出来的效果图确实可以解决目前遇到的问题,错误一目了然:每个病人的图效果是反的(我把第一张图肿瘤的位置放在了最后一张图上去切,难怪会帧对纹路不对),仅花了半天就修好了我的 b u g bug bug(脑子果然是个好东西 ),切出来的效果图也没出错了。(真的是难为我的组长了 )
6、目前效果图存在一点点小瑕疵:切出来的图感觉带上了一层蒙蒙的灰一样,清晰度没有软件的高(由于我不是搞计算机图形学的我不太懂),如果有哪位博主知道为什么以及怎么解决,本人万分感激,欢迎评论区留言讨论。
以下是我 p y t h o n python python代码实现的数据预处理,大部分都有解释,虽然我已经优化了代码的复杂度了,但是代码写得还是不够优美,实在抱歉,有困惑的地方欢迎留言:
# 从nrrd原图图像中单独切出肿瘤区域,寻找合适肿瘤图片尺寸并放置中心位置
# !!!注意请使用绝对路径,并且路径不要包含中文
import os;
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import nrrd
import pydicom
from scipy import ndimage
import cv2