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


方法原文见: 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);



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值