Project 5:
请分割出眼底视网膜图像中的血管
图一
图二
图三
图四
以上是要进行处理的四张眼底视网膜血管图像。
待解决的问题:
如何从视网膜图像中将血管准确清晰的分割出来
1.采用哪种方法作为图像预处理
2.采用哪种二值化的方法进行分割
3.图像的去噪
思路及原理:
对图像先进行预处理,分别采用灰度图处理、色道分离、灰度图翻转、二值化处理等方法得到预处理图。
再对图像进行二值化处理,阈值分割,根据需要再对图像进行去噪处理。最终得到合适的眼底视网膜血管分割图。
算术平均法的自适应二值化利用cv2.adaptiveThreshold实现,此函数的原型为:
其中:
src为输入图像;
maxval为输出图像的最大值;
adaptiveMethod设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;
thresholdType:阈值的类型;
blockSize: b的值;
C为从均值中减去的常数,用于得到阈值;
dst为目标图像。
在本题中,我发现采用自适应二值法效果比固定阈值二值法效果更好,于是我就用自适应二值法来进行处理。
滤波方式,主要应对椒盐噪声,中值滤波通常采用一个含奇数个点的滑动窗口,用窗口的中的灰度值的中值来代替中心点的灰度值,可以滤掉椒盐噪声产生的突兀的像素点,其实就是对这个窗口中的灰度值进行排序,然后将其中值赋值给中心点即可。
函数返回处理结果,第一个参数是待处理图像,第二个参数是孔径的尺寸,一个大于1的奇数。比如这里是5,中值滤波器就会使用5×5的范围来计算。即对像素的中心值及其5×5邻域组成了一个数值集,对其进行处理计算,当前像素被其中值替换掉。
如果在某个像素周围有白色或黑色的像素,这些白色或黑色的像素不会选择作为中值(最大或最小值不用),而是被替换为邻域值。
编程实现:
首先是读取原图片,并定义一个函数用来显示图片,方便在后面调用。并得到该图像的大小。
分别得到灰度图、色道分离以后得到的三张灰度图、对灰度图均衡化以后的图、灰度图翻转以后的图。
对图像进行二值化处理,来分割图像中的血管部分
滤波以后产生了很多椒盐噪声,采用中值滤波去掉
显示预处理以后的图,以及二值化分割以后的图。得到相应结果,挑选结果最好的图。
结果及分析:
第一张图:
由上述六图看出Green、Red通道的灰度图最清晰,接下来对它们进行二值化处理得到。
可见上图有很多椒盐噪声,对他们进行中值滤波得到
经过中值滤波以后的图好很多,第一张图效果最好
同理,对第二幅、第三幅、第四幅图像做同样的处理,得到六幅不同的预处理图、二值化图以及去噪以后的图像,并筛选出效果最好的一幅来作为最后的效果图
结论:
分别得到四幅分割血管图,基本把血管分割了出来,完成了预期目标。
领取专属 10元无门槛券
私享最新 技术干货