Opencv之斑点(Blob)检测SimpleBlobDetector_create

摘要:
图像特征点的检测包括角点和斑点。斑点是指2D图像与其周围环境之间存在颜色和灰度差异的区域,具有更好的稳定性和抗干扰能力。斑点通常是指与周围环境有颜色和灰度差异的区域。我们需要从一些X射线照片或细胞显微照片中提取具有特殊意义的斑点的位置或数量。通过使用以minThreshold开头的阈值对源图像进行阈值设置。

转载:(158条消息) Opencv之斑点(Blob)检测--SimpleBlobDetector_create_ancy的博客-CSDN博客

斑点(Blob)的定义: 图像特征点检测包括角点和斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力.斑点通常是指与周围有着颜色和灰度差别的区域。在实际地图中,往往存在着大量这样的斑点,如一颗树是一个斑点,一块草地是一个斑点,一栋房子也可以是一个斑点。由于斑点代表的是一个区域,相比单纯的角点,它的稳定性要好,抗噪声能力要强,所以它在图像配准上扮演了很重要的角色。同时有时图像中的斑点也是我们关心的区域,比如在医学与生物领域,我们需要从一些X光照片或细胞显微照片中提取一些具有特殊意义的斑点的位置或数量。

SimpleBlobDetector_create的原理:

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

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

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

4. 中心和半径计算:计算并返回新合并的Blob的中心和半径。

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

1. 按颜色:首先需要设置filterByColor =True。设置blobColor = 0可选择较暗的blob,blobColor = 255可以选择较浅的blob。

2. 按大小:可以通过设置参数filterByArea = 1以及minArea和maxArea的适当值来基于大小过滤blob。例如。设置minArea = 100将滤除所有少于100个像素的斑点。

3. 按圆度:这只是测量斑点距圆的距离。例如。正六边形的圆度比正方形高。要按圆度过滤,请设置filterByCircularity =1。然后为minCircularity和maxCircularity设置适当的值。圆度定义为()。圆的为圆度为1,正方形的圆度为PI/4,依此类推。

4. 按凸性:凸度定义为(斑点的面积/凸包的面积)。现在,形状的“凸包”是最紧密的凸形,它完全包围了该形状,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。直观感受上,凸性越高则里面“奇怪的部分”越少。要按凸度过滤,需设置filterByConvexity = true,minConvexity、maxConvexity应该属于[0,1],而且maxConvexity> minConvexity。

5. 按惯性比:这个词汇比较抽象。我们需要知道Ratio可以衡量形状的伸长程度。简单来说。对于圆,此值是1,对于椭圆,它在0到1之间,对于直线,它是0。按惯性比过滤,设置filterByInertia = true,并设置minInertiaRatio、maxInertiaRatio同样属于[0,1]并且maxConvexity> minConvexity。

按凸性(左低右高) 按惯性比(左低右高)

SimpleBlobDetector_Params参数说明:
SimpleBlobDetector::Params::Params()
{
thresholdStep = 10; //二值化的阈值步长,即公式1的t
minThreshold = 50; //二值化的起始阈值,即公式1的T1
maxThreshold = 220; //二值化的终止阈值,即公式1的T2
//重复的最小次数,只有属于灰度图像斑点的那些二值图像斑点数量大于该值时,该灰度图像斑点才被认为是特征点
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(); //斑点的最大凸度
}
代码展示:

# -*- coding:utf-8 -*-
import cv2
import numpy as np

# Read image
im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE)

# 设置SimpleBlobDetector_Params参数
params = cv2.SimpleBlobDetector_Params()
# 改变阈值
params.minThreshold = 10
params.maxThreshold = 200
# 通过面积滤波
params.filterByArea = True
params.minArea = 1500
# 通过圆度滤波
params.filterByCircularity = True
params.minCircularity = 0.1
# 通过凸度滤波
params.filterByConvexity = True
params.minConvexity = 0.87
# 通过惯性比滤波
params.filterByInertia = True
params.minInertiaRatio = 0.01
# 创建一个检测器并使用默认参数
detector = cv2.SimpleBlobDetector_create(params)
# 检测blobs.
key_points = detector.detect(im)

# 绘制blob的红点
draw_image = cv2.drawKeypoints(im, key_points, np.array([]), (0, 0, 255),
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show blobs
cv2.imshow("key_points", draw_image)
cv2.waitKey(0)
效果展示:


————————————————
版权声明:本文为CSDN博主「ancy_i_cv」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014072827/article/details/111033547

免责声明:文章转载自《Opencv之斑点(Blob)检测SimpleBlobDetector_create》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇B样条曲线曲面(附代码).NET新手系列(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用memset()要注意

原型如下: ptr是要写入的内存块的指针,value是要写入的值,num是从ptr指向的首地址开始一共要写入的字节数。 要注意num传入的参数 错误示范:    实际上sizeof(InDegree)是4,等于sizeof(int)。也就是说这里的num参数只是一个指针的大小,没有完成初始化工作,除了第一个数组元素外,剩下的都是随机值。 应该改成:...

图像质量测评

目录 1. 图像质量 2. 原理 2.1. MTF的基本介绍 2.2. MTF曲线解读 2.3. MTF的计算 3. 测试工具3.1. DxO Analyzer 4. Imatest 4.1. 成像质量测试 4.2. 色彩还原测试 4.3. 分析动态范围 5. ImageJ 测试 6. 开源项目:image-quality-asses...

原创-PromQL语法

匹配标签值时可以是等于,也可以使用正则表达式。总共有下面几种匹配操作符: =:完全相等 !=: 不相等 =~: 正则表达式匹配 !~: 正则表达式不匹配 Prometheus的4种数据类型如下。·瞬时向量(Instant vector):一组时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。也就是说,表达式的返回值中只会包含该时间序列中最新的一...

图像质量评估 (IQA) 论文笔记: Convolutional Neural Networks for No-Reference Image Quality Assessment

图像质量评估 (IQA) 论文笔记: Convolutional Neural Networks for No-Reference Image Quality Assessment Convolutional Neural Networks for No-Reference Image Quality Assessment Le Kang1 , Peng...

CSS3 -- 透明色(rgba)

1、rgba 描述   rgb:红r、绿g、蓝b   rgba:红r、绿g、蓝b、透明度Alpha   取值:     r、g、b值:正整数(0 ~ 255) | 百分数( 0.0% ~ 100.0%);(超出范围的数值将被截至其最接近的取值极限。并非所有浏览器都支持使用百分数值。)     a透明度值:取值0~1之间;(不可为负) 2、rgba 兼容...

集合与函数

变量用来记录状态的变化。 可变类型与不可变类型:修改变量的值,ID值不变,则为可变数据类型,如果修改变量的值,ID变了,则该变量为不可变类型。 1.不可变类型:字符串,数字,元组,用frozenset()创建的集合为不可变集合。没有add()等方法。 2.可变数据类型:列表,字典,集合 访问顺序分类: 1.顺序访问:字符串,列表,元组 2.映射:字典 3....