基于漫水填充法的二值图像封闭孔洞填充

将大背景全部用前景色(白色)填充(cvFloodFill函数,一(0,0)为种子点即可),即得到孔洞图(此时孔洞用为黑色),然后将此图二值反转,即得到用白色表示的孔洞图,然后将此空洞图与原二值图相加(使用cvAdd函数即可)即可将孔洞填充掉。

只对封闭孔洞有效

/**************************************************************/
/*               基于漫水填充的二值图像的封闭孔洞填充         */
/* 思路:用白色填充整个背景区域,得到的孔洞为黑色。           */
/* 反转后得到白色的孔洞,与原二值图像相加得到填充后的图像。   */
/**************************************************************/
void fillhole(IplImage *input,IplImage *output)
{
	IplImage *input_copy=cvCreateImage(cvGetSize(input),input->depth,1);
	cvCopy(input,input_copy);
	char *Pointer;
	for(int y=0;yheight;y++)
	{
		Pointer=input_copy->imageData+y*input_copy->widthStep;
		if(Pointer[0]==0)
			cvFloodFill(input_copy,cvPoint(0,y),cvScalarAll(255));
		if(Pointer[input_copy->width-1]==0)
			cvFloodFill(input_copy,cvPoint(input_copy->width,y),cvScalarAll(255));
	}
	for(int x=0;xwidth;x++)
	{
		Pointer=input_copy->imageData+x;
		if(Pointer[0]==0)
			cvFloodFill(input_copy,cvPoint(x,0),cvScalarAll(255));
		if(Pointer[input_copy->height-1]==0)
			cvFloodFill(input_copy,cvPoint(x,input_copy->height-1),cvScalarAll(255));
	}
	cvNot(input_copy,input_copy);
	cvAdd(input,input_copy,output,NULL);
}

实验结果:

基于漫水填充法的二值图像封闭孔洞填充_第1张图片


你可能感兴趣的:(opencv,learning)