由一张血管图片引发的算法分析

过完年之后闲来无事,就拜读了《Visual C++数字图像处理》这本书,说中阐述了用C++语言处理图片的方法(主要针对.BMP格式的照片),实际工程中用到的一张图片如下所示:

由一张血管图片引发的算法分析_第1张图片

这是经过处理后的灰度图,如何计算血管的宽度是这个项目的一个重点 ,将图像放大可以观察到,里面有很多网格状,首先想到将网格装去除,同时也能把血管以外的白点去除,经过简单处理如下:

                                                    由一张血管图片引发的算法分析_第2张图片

虽然网格状消失,但是实际效果不是很理想,随后就否定了这样的想法,要是直接在原图中把边缘提取,通过计算边缘的像素点也是可以计算出血管的宽度,沿着这个思路,经过算法二值化如下:

                                              由一张血管图片引发的算法分析_第3张图片

其中一个参数影响二值化效果,以及途中其他白色噪点的数目,也影响着边界的模糊效果,经过反复试验得出一个适中的值,过后想着要不要把出血管以外的黑点或者小黑团去除,这里用腐蚀,膨胀会不会有效果,一度想着用类似橡皮擦的原理擦除特定面积的黑点,后来转话思想,将血管填满,用了下面两个算法得到的结果:

                                               由一张血管图片引发的算法分析_第4张图片 

                                                               算法一 通过点运算得到的结果

                                               由一张血管图片引发的算法分析_第5张图片

                                                                  算法二 通过移位运算得到的结果

比较两种算法决定采取算法二,这样的边界定位更与实际想符合,得到的图形其实就可以计算边界了,但是作为强迫症的我,还是决定把血管以外的点都去除了,得到如下干净的图:

                                                  由一张血管图片引发的算法分析_第6张图片

到此就可以计算出血管的边界。

总结:

1、无论是何种算法,适合自己项目的就是最好的,书中提到的各种算法理论要明了,在遇到类似问题最起码有个方向;

2、边缘检测或者是动态跟踪这一类算法的最基础还是对于像素点的处理,只不过是像素点与像素点事之间不是孤立的点;

3、此次的算法虽然简单,但是当初想的很复杂,其实有时候问题换个角度就能得到不一样的答案。

你可能感兴趣的:(算法,图像处理,项目)