今天学习blob的可用于斑点检测,其实这个斑点只是普通的这么叫法,专业点是的Blob是图像中共享某些共同属性(例如灰度值)的一组连接的像素。

如下图是今天检测的试验图

算法过程是:
1:Thresholding(二值化过程):通过对源图像进行阈值化,将源图像转换为若干二值图像,阈值从minThreshold开始。这些阈值通过thresholdStep递增,直到maxThreshold。所以第一个阈值是minThreshold,第二个是minThreshold + thresholdStep,第三个是minThreshold + 2 x thresholdStep,以此类推。

2:Grouping:在每个二值图像中,相互之间的白色像素被组合在一起。我们称这些为二值blobs。

3:Merging:计算二值图像中二值blobs的中心,并合并距离小于minDistBetweenBlobs 的 blobs。

4:Center & Radius Calculation:计算并返回新合并的blobs 的中心和半径。

# 导入库
import cv2
import numpy as npdef cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止cv2.destroyAllWindows()# Blob是图像中共享某些共同属性(例如灰度值)的一组连接的像素。也可以说是斑点之类的。也就是一块相同的区域。
# 这一点在特征检测中也是有提到的。# 读取图像,并且转为灰度图
img = cv2.imread("images/blob.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 用默认参数设置检测器
detector = cv2.SimpleBlobDetector_create()# 检测blobs,得到一堆的关键点,之前我们在SIFT特征检测中也是得到了这个信息。
keypoints = detector.detect(gray)
keypoints_array = np.array(keypoints)
print(keypoints_array.shape)
for kp in keypoints:print("关键点的位置是: pt[0]:{}\tpt[1]:{}\tangle:{}\tsize:{}".format(kp.pt[0], kp.pt[1], kp.angle, kp.size))# 用红色圆圈画出检测到的blobs
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS 确保圆的大小对应于blob的大小
im_with_keypoints = cv2.drawKeypoints(gray, keypoints_array,np.array([]), (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 结果显示
cv_show_image("Keypoints", im_with_keypoints)

使用默认参数情况下的效果:

发现有一些没有检测上,我们试着更改下参数试一试,比如调整二值化的阈值,调宽一些,面积的范围放宽一些,圆度放宽一点。

# 导入库
import cv2
import numpy as npdef cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止cv2.destroyAllWindows()# 读取图像
im = cv2.imread("images/blob.jpg", cv2.IMREAD_GRAYSCALE)# 设置SimpleBlobDetector参数
params = cv2.SimpleBlobDetector_Params()# 改变阈值
# 只会检测minThreshold 和 maxThreshold之间的
params.minThreshold = 10
params.maxThreshold = 240# 按Color:首先,您需要设置filterByColor = 1。
# 设置blobColor = 0来选择较暗的Blobs,设置blobColor = 255来选择较亮的Blobs。
params.filterByColor = True
params.blobColor = 0# 根据面积过滤
# 按大小:可以根据大小过滤Blobs,方法是设置参数filterByArea = 1,以及适当的minArea和maxArea值。
# 例如,设置minArea = 100将过滤掉所有像素个数小于100的Blobs。
params.filterByArea = True
params.minArea = 10
params.maxArea = 1000# 根据Circularity过滤,这个参数是(圆度)
# 这只是测量了这个blob与圆的距离。正六边形的圆度比正方形高。
# 要根据圆度进行过滤,设置filterByCircularity = 1。然后设置适当的minCircularity和maxCircularity值。
params.filterByCircularity = True
params.minCircularity = 0.1# 根据Convexity过滤,这个参数是(凹凸性)
# 凸性定义为(Blob的面积/它的凸包的面积)。现在,凸包的形状是最紧的凸形状,完全包围了形状。
# 设置filterByConvexity = 1,然后设置0≤minConvexity≤1和maxConvexity(≤1)。
params.filterByConvexity = True
params.minConvexity = 0.14
params.maxConvexity = 1# 根据Inertia过滤,惯性比
# 它衡量的是一个形状的伸长程度。例如,对于圆,这个值是1,对于椭圆,它在0和1之间,对于直线,它是0。
# 初步可以认为是外接矩形的长宽比,圆的外接矩形的长宽相等,椭圆是有长短轴,短轴长度除以长轴长度,介于0~1
# 直线可以认为没有宽度,因此是0
params.filterByInertia = True
params.minInertiaRatio = 0.01# 创建一个带有参数的检测器
detector = cv2.SimpleBlobDetector_create(params)# 检测blobs
keypoints = detector.detect(im)
keypoints_array = np.array(keypoints)
print(keypoints_array.shape)# 用红色圆圈画出检测到的blobs
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS 确保圆的大小对应于blob的大小
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 结果显示
cv_show_image("Keypoints", im_with_keypoints)

调整完参数的效果是:

本文学习自
https://blog.csdn.net/weixin_43229348/article/details/120448954

【opencv学习】Blob检测斑点相关推荐

  1. opencv SimpleBlobDetector blob分析斑点检测原理详解

    文章目录 概念 一.SimpleBlobDetector算法原理 二.opencv 类接口原型: 三.代码示例: 四.运行效果: 概念 Blob是图像中具有某些共同属性(如灰度值.圆度等如下图所示属性 ...

  2. OpenCV学习——轮廓检测

    前言 轮廓检测是传统视觉中非常常用的功能,这里简单记录一下opencv中的轮廓检测算法使用方法,至于理论,后续有机会再去细品. 国际惯例: OpenCV官方的轮廓检测教程python版 OpenCV中 ...

  3. opencv角点检测学习总结

    学习opencv 角点检测 如果一个点在两个正交方向上都有明显的导数,则我们认为此点更倾向于是独一无二的,所以许多可跟踪的特征点都是角点. 一下为角点检测中用到的一些函数 cvGoodFeatures ...

  4. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  5. 计算机视觉OpenCv学习系列:第十部分、实时人脸检测

    第十部分.实时人脸检测 第一节.实时人脸检测 1.OpenCV人脸检测支持演化 2.OpenCV DNN检测函数 3.代码练习与测试 学习参考 第一节.实时人脸检测 1.OpenCV人脸检测支持演化 ...

  6. 限时删!一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)

    AI 显然是最近几年非常火的一个新技术方向,从几年前大家认识到 AI 的能力,到现在产业里已经在普遍的探讨 AI 如何落地了. 计算机视觉目前在很多领域都已经实现了商业应用,从现实市场规模角度,目前人 ...

  7. opencv学习笔记(二):基于肤色的人手检测

    opencv学习笔记(二):基于肤色的人手检测 原文:http://blog.csdn.net/wzmsltw/article/details/50849810 先写了人手的检测程序,下一步基于检测程 ...

  8. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  9. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

最新文章

  1. WebSocket实战之————Workerman服务器的安装启动
  2. java 监控usb端口插拔_如何监控某种类型的USB设备的插拔?
  3. python with方法
  4. 【三种解法】Not so Mobile UVA - 839_19行代码AC
  5. 面试题5,接口和抽象类的区别
  6. 漫步最优化十九——封闭算法
  7. 并发编程应用场景_linux网络编程之select函数的并发限制和poll函数应用举例
  8. Save as XPS in Office “12”
  9. 程序员面试金典——番外篇之下一个较大元素II
  10. 删数问题(Noip1994)--贪心
  11. 瞒不住了!超过4000人都在这里死磕3D视觉技术
  12. python 装饰器常见场景与用法
  13. OPPO Find X5系列领衔OPPO春季新品发布会,多款产品亮相
  14. Premiere Pro 中的键盘快捷键
  15. iReport编辑报表,以及打印PDF
  16. 面试系列-1 大厂面试幂等性
  17. html简单的文字自动出现效果,8个华丽的HTML5文字动画特效赏析
  18. 常用小工具使用记录整理
  19. 开源私有lorawan server搭建
  20. 先验分布、后验分布、共轭先验分布

热门文章

  1. html5canvas简单画图
  2. Windows Serivce服务实现过程和打包安装
  3. WCF性能优势体现 【转】
  4. JavaScript 内存机制(前端同学进阶必备)
  5. 浏览器 JavaScript HTTP 库的大比拼:SugerAgent VS Axios
  6. 容器编排技术 -- Kubernetes kubectl label 命令详解
  7. 容器编排技术 -- Kubernetes kubectl create poddisruptionbudget 命令详解
  8. 容器编排技术 -- Windows Server 容器
  9. Oracle 12C DataGuard部署以及维护
  10. How to Install and Configure OpenSSH Server In Linux