初步肺部分割---记录一个星期的苦逼生活
肺部分割结果不是很好,望大神们指教,不慎感激
一:一开始的想法:
由于最近在学习计算机视觉,使用OpenCV开发程序,所以第一个想法是使用OpenCV里自带的一个分割函数Canny进行分割。我写了一个简单的程序,输入我是从给的肺的资料中随便挑了一个,如下:
然后运行canny边缘检测,通过调整canny函数中的小阈值和大阈值,得到如下结果:
二:自己的算法思想:
然后我了解到canny边缘检测是根据梯度变化检测边缘的,只要梯度出现明显变化就认为是边缘,在上图中边缘明显出来了,但是我们只要肺部的边缘,而不需要其他边缘,所以使用canny边缘检测是不行的。
然后我看图像想出了一个方法可以检测肺部的区域,具体的思想如下:
首先读入图像,然后对图像一行一行的扫描。首先从左往右扫描,如果出现了像素值明显变化,即从白变成黑,那么它一定是左肺的起始点,然后再往后扫描,如果出现像素值从黑变到白,那么这个点就是左肺的末点。此时停止扫描,转化到从右开始往左扫描,利用同前面的思想可以找到右肺的部分。
伪代码如下:
对于图像的每一行像素:
从左往右扫描此行:
Flag=0;//flag是一个标志,0表示未找到起始点,1表示找到起始点,2表示找到终止点
如果flag == 0{
如果当前像素大于某个阈值的时候(此处的阈值表示白色的范围),且这个像素的后一个像素小于某个阈值的时候(此处的阈值表示黑色的范围),那么可以断定是左肺的起始点(此行的左肺的起始点)。
Flag = 1;
}
如果flag ==1{
如果当前像素小于某个阈值的时候(此处的阈值表示黑色的范围),且这个像素的后一个像素大于某个阈值的时候(此处的阈值表示白色的范围),那么断定是左肺的终止点(此行的左肺的终止点)。
Flag = 2;
}
如果flag == 2{
Break;
从右往左扫描此行:
Flag=0;//flag是一个标志,0表示未找到起始点,1表示找到起始点,2表示找到终止点
如果flag == 0{
如果当前像素大于某个阈值的时候(此处的阈值表示白色的范围),且这个像素的前一个像素小于某个阈值的时候(此处的阈值表示黑色的范围),那么可以断定是右肺的起始点(此行的右肺的起始点)。
Flag = 1;
}
如果flag ==1{
如果当前像素小于某个阈值的时候(此处的阈值表示黑色的范围),且这个像素的前一个像素大于某个阈值的时候(此处的阈值表示白色的范围),那么断定是右肺的终止点(此行的右肺的终止点)。
Flag = 2;
}
如果flag == 2{
Break;
//算法结束