Python 斑点检测 SimpleBlobDetector

OpenCV 常用函数

斑点检测 SimpleBlobDetector_create

定义

斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力.斑点通常是指与周围有着颜色和灰度差别的区域。

函数原理

  1. 阈值:通过使用以minThreshold开始的阈值对源图像进行阈值处理,将源图像转换为多个二进制图像。这些阈值以thresholdStep递增,直到maxThreshold。因此,第一个阈值为minThreshold,第二个阈值为minThreshold + thresholdStep,第三个阈值为minThreshold + 2 x thresholdStep,依此类推;

  2. 分组:在每个二进制图像中,连接的白色像素被分组在一起。我们称这些二进制blob;

  3. 合并:计算二进制图像中二进制斑点的中心,并合并比minDistBetweenBlob更近的斑点;

  4. 中心和半径计算:计算并返回新合并的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<float>::max();
 
    filterByInertia = true;    //斑点惯性率的限制变量
    minInertiaRatio = 0.1f;    //斑点的最小惯性率
    maxInertiaRatio = std::numeric_limits<float>::max();    //斑点的最大惯性率
 
    filterByConvexity = true;    //斑点凸度的限制变量
    minConvexity = 0.95f;    //斑点的最小凸度
    maxConvexity = std::numeric_limits<float>::max();    //斑点的最大凸度

按颜色,大小和形状来过滤斑点类型:

  1. 按颜色:首先需要设置filterByColor =True。设置blobColor = 0可选择较暗的blob,blobColor = 255可以选择较浅的blob。
  2. 按大小:可以通过设置参数filterByArea = 1以及minArea和maxArea的适当值来基于大小过滤blob。例如。设置minArea = 100将滤除所有少于100个像素的斑点。
  3. 按圆度:这只是测量斑点距圆的距离。例如。正六边形的圆度比正方形高。要按圆度过滤,请设置filterByCircularity =1。然后为minCircularity和maxCircularity设置适当的值。圆度定义为

Python 斑点检测 SimpleBlobDetector_第1张图片
圆的为圆度为1,正方形的圆度为PI/4,依此类推。Python 斑点检测 SimpleBlobDetector_第2张图片

  1. 按凸性:凸度定义为(斑点的面积/凸包的面积)。现在,形状的“凸包”是最紧密的凸形,它完全包围了该形状,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。直观感受上,凸性越高则里面“奇怪的部分”越少。
    要按凸度过滤,需设置filterByConvexity
    = true,minConvexity、maxConvexity应该属于[0,1],而且maxConvexity> minConvexity。
  2. 按惯性比:这个词汇比较抽象。我们需要知道Ratio可以衡量形状的伸长程度。简单来说。对于圆,此值是1,对于椭圆,它在0到1之间,对于直线,它是0。
    按惯性比过滤,设置filterByInertia = true,并设置minInertiaRatio、maxInertiaRatio同样属于[0,1]并且maxConvexity> minConvexity。

绘制特征点函数cv2.drawKeypoints()

drawKeypoints(image, keypoints, outImage, color=None, flags=None):

  • image:输入图像;
  • keypoints:获取的特征点;
  • outImage:输出图像;
  • color:颜色,默认为随机颜色;
  • flsgs:绘制点的模式,有以下四种模式
  1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:默认值,只绘制特征点 的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标
  2. cv2.DRAW_RICH_KEYPOINTS:绘制带方向的圆,同时显示坐标,size和方向;
  3. cv2.DRAW_OVER_OUTIMAGE:只绘制特征点的坐标点;
  4. cv2.NOT_DRAW_SINGLE_POINT:单点特征点不被绘制。

keypoints
Python 斑点检测 SimpleBlobDetector_第3张图片

你可能感兴趣的:(图像处理,计算机视觉,opencv,图像处理)