目录
种子区域生长算法
弊端
现状
改进
种子区域生长算法
弊端
我们都知道种子区域生长算法是基于图像像素的运算操作,可简单分为4联通和8联通。但种子区域生长算法处理较大任务量时,处理效率大幅度降低。
现状
现在大部分人选择将大幅图像分区,进行种子区域生长算法处理,之后再将分区的结果拼接。这样的虽然会增加种子区域生长算法的处理速度,但是由于图像分区运行,每个分区不存在衔接,拼接后的结果会存在明显的条带现象或者衔接不自然现象。
改进
先假设有一副灰度图像g=[0,255];种子区域生长的基本原理是将灰度值作为阈值判断条件,重点来了:我们可以将二维图像三维化,这里的三维化是一种我们自己的想象,并非程序处理。将灰度图像的x方向和y方向作为xy轴,将每个像素的灰度值作为高z轴,那这个灰度图像就变成了一个三维的类似柱状图的东西。
那么这个三维图沿着x或者y轴投影就可以类似得到下面的图:(再强调一遍:高度就是灰度值)
?好了,我们开始重新从这个视角来看种子区域生长算法的处理流程,假设种子点阈值seed_th设定为90(th=90),即灰度值g>90的像素点被认定为种子点;分类的阈值image_th设定为50(image_th=50),即灰度值大于50的像素且与种子点构成4连通或者8连通区域的会判定为真,并重新作为新的种子点,灰度值小于50或者灰度值大于50但是不能与种子点构成4连通或者8连通区域的判定为假。
那么从上图中就可以认为A区域为种子点,因为A区域的灰度值大于90。B为真值,D区和C区域为假。
改进的要点!!!!
我们可以看出C区和B区是两个独立的联通区域,C区中的像素不能通过灰度值g大于50的像素到达A区,但B区可以。也就是B区的联通区域中包含种子点,C区并没有包含。那么我们只要事先获得B和C两个联通区域,只要判断区域内是否存在种子点,如果存在(例如B区)即整个联通区域都是真值,如果不存在(例如C区)就整个联通区域都判定为假,这样就将传统的像素处理提升到了区域处理。
那么问题就来到了如果获取图像的联通区域
retval, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8)
opencv库的cv2.connectedComponentsWithStats可以实现对联通区域的获取和操作。
我之前写过这个函数处理不规则联通区域的方法,这是传送门
相信看完这个文章就会运用opencv来实现对种子点的改进,经过测试,处理全球影像数据,种子区域生长区域处理时间为90个小时,改进后仅18个小时,精度相差0.5%。
本文是个人实验所得结论,如有疑问可以随时交流,这个改进并没有经过大量实验测试,如有人经过改进后出现不同结果,欢迎交流学习。
|