【【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中,版本在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();
}