【EMGUCV】simpleblob detector 斑点检测

【【EMGUCV】simpleblob detector 斑点检测】本文主要介绍emgucv中的simpleblob detector。
算法原理 该检测器的原理主要如下:
1. 先设置步进值(thresholdStep)跟二值化阈值范围[minThreshold,maxThreshold),把原图像SrcImg在阈值范围内按照步进依次转化为二值化图像。
2. 从这些二值化图像中提取轮廓,并且计算这些轮廓的中心。
3. 根据这些轮廓的中心坐标进行分组,坐标接近的属于同一个blob,坐标要有多接近才算接近?这个通过minDistBetweenBlobs控制。
4. 最后,在找到的这些分组中,进一步根据所选的参数来进行判断是否blob。这些参数有:
1) color: 通过判断blob中心坐标的颜色是否跟所选颜色一致来决定是否要丢弃这个blob,blobColor=0表示要提取黑色的点,blobColor=255表示要提取白色的点
2)area:通过判断blob的面积,也就是像素总数是否在[minArea,maxArea)
3)circularity:圆心率,公式为: 4?π?Areaperimeter?perimeter ,当圆心率范围为[minCircularity ,maxCircularity )时,选中该blob
4) minInertiamaxInertia :惯性率,椭圆最小的直径跟最大的直径之间的比。当惯性率范围为[minInertiaRatio ,maxInertiaRatio)时,选中该blob
5)convexity:凸度,凸度公式是 areaareaOfConvexHull ,blob面积除以凸包面积,当该凸度在为[minConvexity ,maxConvexity )时,选中该blob
以下是从 其他网站上看到的比较形象的图示:
【EMGUCV】simpleblob detector 斑点检测
文章图片

具体代码
需要注意的是,EMGUCV中,版本在3.0之上才会有SimpleBlobDetector这个类。
opencv中应该是2.4版本就有了,调用方法基本一致

Image imgGray = img.Convert(); /* blob detector */ //Gray Gavg = imgGray.GetAverage(); double minValue = https://www.it610.com/article/255; double maxValue = 0; Point minLoc = new Point(); Point maxLoc = new Point(); CvInvoke.MinMaxLoc(imgGray, ref minValue, ref maxValue, ref minLoc, ref maxLoc); SimpleBlobDetectorParams blobparams = new SimpleBlobDetectorParams(); blobparams.FilterByArea = true; blobparams.MinArea = 150; blobparams.MaxArea = 1500; blobparams.MinThreshold = (float)minValue + 1; blobparams.MaxThreshold = (float)maxValue; blobparams.FilterByCircularity = false; //斑点圆度 blobparams.MinCircularity = (float)0.5; blobparams.MaxCircularity = 1; blobparams.FilterByConvexity = true; //斑点凸度 blobparams.MinConvexity = (float)0.2; blobparams.MaxConvexity = 1; blobparams.FilterByInertia = true; //斑点惯性率 blobparams.MinInertiaRatio = (float)0.4; blobparams.MaxInertiaRatio = 1; blobparams.FilterByColor = false; blobparams.ThresholdStep = 2; blobparams.MinRepeatability = new IntPtr(2); SimpleBlobDetector detector = new SimpleBlobDetector(blobparams); MKeyPoint[] keypoints = detector.Detect(imgGray); Image imgBgr = img.Copy(); foreach (MKeyPoint keypoint in keypoints) {imgBgr.Draw(new Rectangle((int)(keypoint.Point.X - keypoint.Size / 2), (int)(keypoint.Point.Y - keypoint.Size / 2), (int)keypoint.Size, (int)keypoint.Size), new Bgr(255,0,0), 1); pictureBox1.Image = imgBgr.ToBitmap(); }

    推荐阅读