opencv二值图孔洞填充算法(方法系转载)

来源:互联网 发布:sql2000附加数据库金蝶 编辑:程序博客网 时间:2024/04/25 23:09

方法原文见:http://geniusshare.i.sohu.com/blog/view/149854097.htm 作者:天才的自省



 孔洞者,不与大背景联通却具有大背景颜色的像素也,所以思路如下:将大背景全部用前景色(白色)填充(cvFloodFill函数,一(0,0)为种子点即可),即得到孔洞图(此时孔洞用为黑色),然后将此图二值反转,即得到用白色表示的孔洞图,然后将此空洞图与原二值图相加(使用cvAdd函数即可)即可将孔洞填充掉,这个方法目前寂静基本上可以填充孔洞,但是还有一点瑕疵,那就是用完cvFloodFill函数填充大背景后边界却保留下来了,即未填充,当然这个对孔洞填充来说的视觉效果上没有什么影响的,但是严格来讲还是有一点问题的,我查阅了cvFloodFill函数的参数说明,却未看出到底是什么使得边缘不被填充而被保留了下来,如果解决了这个问题,那这个填充算法就完美了。


实现代码:

IplImage* otst_test=cvLoadImage("f:\\S1212L06_ROI.jpg",CV_LOAD_IMAGE_GRAYSCALE);IplImage* fillHole=cvCreateImage(cvGetSize(otst_test),IPL_DEPTH_8U,1);CIrisLocalization  tt;double teet=tt.otsu((unsigned char*)otst_test->imageData,otst_test->height,otst_test->width,0,0,otst_test->width,otst_test->height,0);cvThreshold(otst_test,otst_test,teet,255,CV_THRESH_BINARY);cvNamedWindow("src");cvShowImage("src",otst_test);fillHole=cvCloneImage(otst_test);cvFloodFill(fillHole,cvPoint(0,0),cvScalarAll(1));cvNot(otst_test,otst_test);cvNamedWindow("not");cvShowImage("not",otst_test);cvAdd(otst_test,fillHole,otst_test,NULL);cvNamedWindow("fillHole");cvShowImage("fillHole",fillHole);cvNamedWindow("result");cvShowImage("result",otst_test);



原创粉丝点击