斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力.斑点通常是指与周围有着颜色和灰度差别的区域。
函数原理-
阈值:通过使用以minThreshold开始的阈值对源图像进行阈值处理,将源图像转换为多个二进制图像。这些阈值以thresholdStep递增,直到maxThreshold。因此,第一个阈值为minThreshold,第二个阈值为minThreshold + thresholdStep,第三个阈值为minThreshold + 2 x thresholdStep,依此类推;
-
分组:在每个二进制图像中,连接的白色像素被分组在一起。我们称这些二进制blob;
-
合并:计算二进制图像中二进制斑点的中心,并合并比minDistBetweenBlob更近的斑点;
-
中心和半径计算:计算并返回新合并的Blob的中心和半径。
SimpleBlobDetector::Params::Params()
{
thresholdStep = 10; //二值化的阈值步长
minThreshold = 50; //二值化的起始阈值
maxThreshold = 220; //二值化的终止阈值
//重复的最小次数,只有属于灰度图像斑点的那些二值图像斑点数量大于该值时,该灰度图像斑点才被认为是特征点
minRepeatability = 2;
//最小的斑点距离,不同二值图像的斑点间距离小于该值时,被认为是同一个位置的斑点,否则是不同位置上的斑点
minDistBetweenBlobs = 10;
filterByColor = true; //斑点颜色的限制变量
blobColor = 0; //表示只提取黑色斑点;如果该变量为255,表示只提取白色斑点
filterByArea = true; //斑点面积的限制变量
minArea = 25; //斑点的最小面积
maxArea = 5000; //斑点的最大面积
filterByCircularity = false; //斑点圆度的限制变量,默认是不限制
minCircularity = 0.8f; //斑点的最小圆度
//斑点的最大圆度,所能表示的float类型的最大值
maxCircularity = std::numeric_limits::max();
filterByInertia = true; //斑点惯性率的限制变量
minInertiaRatio = 0.1f; //斑点的最小惯性率
maxInertiaRatio = std::numeric_limits::max(); //斑点的最大惯性率
filterByConvexity = true; //斑点凸度的限制变量
minConvexity = 0.95f; //斑点的最小凸度
maxConvexity = std::numeric_limits::max(); //斑点的最大凸度
按颜色,大小和形状来过滤斑点类型:
- 按颜色:首先需要设置filterByColor =True。设置blobColor = 0可选择较暗的blob,blobColor = 255可以选择较浅的blob。
- 按大小:可以通过设置参数filterByArea = 1以及minArea和maxArea的适当值来基于大小过滤blob。例如。设置minArea = 100将滤除所有少于100个像素的斑点。
- 按圆度:这只是测量斑点距圆的距离。例如。正六边形的圆度比正方形高。要按圆度过滤,请设置filterByCircularity =1。然后为minCircularity和maxCircularity设置适当的值。圆度定义为
圆的为圆度为1,正方形的圆度为PI/4,依此类推。
- 按凸性:凸度定义为(斑点的面积/凸包的面积)。现在,形状的“凸包”是最紧密的凸形,它完全包围了该形状,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。直观感受上,凸性越高则里面“奇怪的部分”越少。
要按凸度过滤,需设置filterByConvexity
= true,minConvexity、maxConvexity应该属于[0,1],而且maxConvexity> minConvexity。 - 按惯性比:这个词汇比较抽象。我们需要知道Ratio可以衡量形状的伸长程度。简单来说。对于圆,此值是1,对于椭圆,它在0到1之间,对于直线,它是0。
按惯性比过滤,设置filterByInertia = true,并设置minInertiaRatio、maxInertiaRatio同样属于[0,1]并且maxConvexity> minConvexity。
drawKeypoints(image, keypoints, outImage, color=None, flags=None):
- image:输入图像;
- keypoints:获取的特征点;
- outImage:输出图像;
- color:颜色,默认为随机颜色;
- flsgs:绘制点的模式,有以下四种模式
- cv2.DRAW_MATCHES_FLAGS_DEFAULT:默认值,只绘制特征点 的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标
- cv2.DRAW_RICH_KEYPOINTS:绘制带方向的圆,同时显示坐标,size和方向;
- cv2.DRAW_OVER_OUTIMAGE:只绘制特征点的坐标点;
- cv2.NOT_DRAW_SINGLE_POINT:单点特征点不被绘制。
keypoints



