【EMGUCV】simpleblob detector 斑点检测

来源:互联网 发布:买家淘宝违规怎么处理 编辑:程序博客网 时间:2024/06/08 11:51

本文主要介绍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πAreaperimeterperimeter,当圆心率范围为[minCircularity ,maxCircularity )时,选中该blob
4)minInertiamaxInertia:惯性率,椭圆最小的直径跟最大的直径之间的比。当惯性率范围为[minInertiaRatio ,maxInertiaRatio)时,选中该blob
5)convexity:凸度,凸度公式是areaareaOfConvexHull,blob面积除以凸包面积,当该凸度在为[minConvexity ,maxConvexity )时,选中该blob

以下是从 其他网站上看到的比较形象的图示:

这里写图片描述

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

Image<Gray, byte> imgGray = img.Convert<Gray, byte>();/* blob detector *///Gray Gavg = imgGray.GetAverage();double minValue = 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<Bgr, byte> 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();}
0 0
原创粉丝点击