我正在尝试实现一个在二进制图像中找到轮廓并过滤掉小轮廓的函数。
这是我的代码和示例图像。这是一个超级简单的功能,可以去除小面积的斑点。但我不断得到“边缘轮廓”而不是区域轮廓。:S
private IplImage RemoveNoise( IplImage image, int minArea )
{
List<CvPoint[]> listOfPoints = new List<CvPoint[]>();
CvSeq<CvPoint> contoursRaw;
List<ContourData> contours = new List<ContourData>();
using( CvMemStorage storage = new CvMemStorage() )
{
//find contoures
//Cv.FindContours( image, storage, out contoursRaw );
Cv.FindContours( image, storage, out contoursRaw, CvContour.SizeOf, ContourRetrieval.Tree, ContourChain.ApproxSimple );
//contoursRaw = Cv.ApproxPoly( contoursRaw, CvContour.SizeOf, storage, ApproxPolyMethod.DP, 3, true );
while( contoursRaw != null )
{
CvSeq<CvPoint> result = contoursRaw;
double area = Cv.ContourArea( result );
//filter out small regions
if( area >= minArea )
{
List<CvPoint> points = new List<CvPoint>();
int i = 0;
while( result[ i ] != null )
{
points.Add( new CvPoint( result[ i ].Value.X, result[ i ].Value.Y ) );
i++;
}
listOfPoints.Add( points.ToArray() );
}
contoursRaw = contoursRaw.HNext;
}
}
// draw large regions
IplImage output = new IplImage( image.Size, image.Depth, 1 );
output.Set( CvColor.Black );
CvPoint[][] ArrayOfPoints = listOfPoints.ToArray();
output.FillPoly( ArrayOfPoints, CvColor.White );
return output;
}
为什么我不断得到“边缘轮廓”而不是区域轮廓?
结果如下:
在此处输入图像描述