[opencv-python] Opencv学习之Blob分析

概述

Blob即图像中一组具有某些共同属性(如,灰度值)的连接像素。使用Blob检测可以快速从灰度图像中定位跟提取各种常见的几何形状。Opencv提供了根据面积、灰度值、圆度、凸度、惯量进行过滤得到符合需求的各种Blob形状,实现检测的定位与检测。

1.设置Blob检测器参数

# Setup SimpleBlobDetector parameters
 params = cv2.SimpleBlobDetector_Params()

Blob对象检测算法,支持一下五种过滤方式:

 

filterByArea #面积过滤,True表示启用 filterByCircularity #圆度过滤,True表示启用 filterByColor #值过滤,True表示启用 filterByConvexity #凸度过滤,True表示启用 filterByInertia #惯量过滤,True表示启用

2.实例程序(含注释)

# Standard imports
import cv2
import numpy as np

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

# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()

# Change thresholds 
params.minThreshold = 10 #自定义下阈值
params.maxThreshold = 200 #自定义上阈值

# Filter by Area.
params.filterByArea = True
params.minArea = 1500 #自定义最小面积(即检测大于此面积的斑点)

# Filter by Circularity 根据圆度过滤(圆的圆度为1,正方形的圆度为0.785,不熟悉圆度的以此为参考):
params.filterByCircularity = False
params.minCircularity = 0.1 #自定义最小圆度

# Filter by Convexity 根据凹凸性过滤(凹凸性=Blob面积/凸包面积):
params.filterByConvexity = False
params.minConvexity = 0.87 #自定义最小凹凸性
    
# Filter by Inertia 根据惯性比过滤(0<=惯性比<=1):
params.filterByInertia = False
params.minInertiaRatio = 0.01 自定义最小惯性比

# Filter by Color 根据颜色过滤
params.filterByColor=True
params.blobColor=0 #选择较暗斑点
params.blobColor=255 #选择较亮斑点

# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
	detector = cv2.SimpleBlobDetector(params)
else : 
	detector = cv2.SimpleBlobDetector_create(params)


# Detect blobs.
keypoints = detector.detect(im)

# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
# the size of the circle corresponds to the size of blob

im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show blobs
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

图片

3.Blob参数设置(原理简介)

在OpenCV中实现的叫做SimpleBlobDetector,它基于以下描述的相当简单的算法,并且进一步由参数控制,具有以下步骤。

thresholdStep = 10 #二值化的阈值步长      
minThreshold = 50 #二值化的起始阈值   
maxThreshold = 200 #二值化的终止阈值       
         
#重复的最小次数,只有属于灰度图像斑点的那些二值图像斑点数量大于该值时,该灰度图像斑点才被认为是特征点
      
minRepeatability =2
     
#最小的斑点距离,不同二值图像的斑点间距离小于该值时,被认为是同一个位置的斑点,否则是不同位置上的斑点
      
minDistBetweenBlobs = 10 

filterByColor = True #斑点颜色的限制变量
blobColor = 0 #表示只提取黑色斑点;如果该变量为255,表示只提取白色斑点
    
filterByArea  = True #斑点面积的限制变量
minArea = 25 #斑点的最小面积
maxArea = 5000 #斑点的最大面积

filterByCircularity  = True #斑点圆度的限制变量,默认是不限制
minCircularity =0.8 #斑点的最小圆度
     
filterByInertia = True #斑点惯性率的限制变量
minInertiaRatio =0.1 #斑点的最小惯性率
    
filterByConvexity = True #斑点凸度的限制变量
minConvexity =0.95 #斑点的最小凸度

阈值:通过使用以minThreshold开始的阈值对源图像进行阈值处理,将源图像转换为多个二进制图像。这些阈值以thresholdStep递增,直到maxThreshold。因此,第一个阈值为minThreshold,第二个阈值为minThreshold + thresholdStep,第三个阈值为minThreshold + 2 x thresholdStep,依此类推;
分组:在每个二进制图像中,连接的白色像素被分组在一起。我们称这些二进制blob;
合并:计算二进制图像中二进制斑点的中心,并合并比minDistBetweenBlob更近的斑点;
中心和半径计算:计算并返回新合并的Blob的中心和半径。

并且可以进一步设置SimpleBlobDetector的参数来过滤所需的Blob类型。

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

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

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

Afa=\frac{4*PI*S}{C*C} )。圆的为圆度为1,正方形的圆度为PI/4,依此类推。

circle:Afa=\frac{4*PI*S}{C*C}=\frac{4*PI*PI*R*R}{2*PI*R*2*PI*R}=1

square:Afa=\frac{4*PI*S}{C*C}=\frac{4*PI*A*A}{4*A*4*A}=\frac{PI}{4}\approx 0.785


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

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

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
code_001 | [图片读取与显示](python/code_001/opencv_001.py) | ✔️ code_002 | [图片灰度化](python/code_002/opencv_002.py) | ✔️ code_003 | [图像创建与赋值](python/code_003/opencv_003.py) | ✔️ code_004 | [图像像素读写](python/code_004/opencv_004.py) | ✔️ code_005 | [图像像素算术操作(加减乘除)](python/code_005/opencv_005.py) | ✔️ code_006 | [图像伪彩色增强](python/code_006/opencv_006.py) | ✔️ code_007 | [图像像素操作(逻辑操作)](python/code_007/opencv_007.py) | ✔️ code_008 | [图像通道分离合并](python/code_008/opencv_008.py) | ✔️ code_009 | [色彩空间与色彩空间转换](python/code_009/opencv_009.py) | ✏️ code_010 | [图像像素值统计](python/code_010/opencv_010.py) | ✔️ code_011 | [图像像素归一化](python/code_011/opencv_011.py) | ✔️ code_012 | [视频读写](python/code_012/opencv_012.py) | ✔️ code_013 | [图像翻转](python/code_013/opencv_013.py) | ✔️ code_014 | [图像插值](python/code_014/opencv_014.py) | ✔️ code_015 | [绘制几何形状](python/code_015/opencv_015.py) | ✔️ code_016 | [图像ROI与ROI操作](python/code_016/opencv_016.py) | ✔️ code_017 | [图像直方图](python/code_017/opencv_017.py) | ✔️ code_018 | [图像直方图均衡化](python/code_018/opencv_018.py) | ✏️ code_019 | [图像直方图比较](python/code_019/opencv_019.py) | ✔️ code_020 | [图像直方图反向投影](python/code_020/opencv_020.py) | ✔️ code_021 | [图像卷积操作](python/code_021/opencv_021.py) | ✔️ code_022 | [图像均值与高斯模糊](python/code_022/opencv_022.py) | ❣️ code_023 | [中值模糊](python/code_023/opencv_023.py) | ✔️ code_024 | [图像噪声](python/code_024/opencv_024.py) | ✔️ code_025 | [图像去噪声](python/code_025/opencv_025.py) | ✔️ code_026 | [高斯双边模糊](python/code_026/opencv_026.py) | ✔️ code_027 | [均值迁移模糊(mean-shift blur)](python/code_027/opencv_027.py) | ✔️ code_028 | [图像积分图算法](python/code_028/opencv_028.py) | ✔️ code_029 | [快速的图像边缘滤波算法](python/code_029/opencv_029.py) | ✔️ code_030 | [自定义滤波器](python/code_030/opencv_030.py) | ✔️ code_031 | [Sobel算子](python/code_031/opencv_031.py) | ✔️ code_032 | [更多梯度算子](python/code_032/opencv_032.py) | ✔️ code_033 | [拉普拉斯算子(二阶导数算子)](python/code_033/opencv_033.py) | ✔️ code_034 | [图像锐化](python/code_034/opencv_034.py) | ✔️ code_035 | [USM 锐化增强算法](python/code_035/opencv_035.py) | ✔️ code_036 | [Canny边缘检测器](python/code_036/opencv_036.py) | ❣️ code_037 | [图像金字塔](python/code_037/opencv_037.py) | ✔️ code_038 | [拉普拉斯金字塔](python/code_038/opencv_038.py) | ✔️ code_039 | [图像模板匹配](python/code_039/opencv_039.py) | ✔️ code_040 | [二值图像介绍](python/code_040/opencv_040.py) | ✔️ code_041 | [基本阈值操作](python/code_041/opencv_041.py) | ✔️ code_042 | [图像二值寻找法OTSU](python/code_042/opencv_042.py) | ✏️ code_043 | [图像二值寻找法TRIANGLE](python/code_043/opencv_043.py) | ✔️ code_044 | [图像自适应阈值算法](python/code_044/opencv_044.py) | ✏️ code_045 | [图像二值与去噪](python/code_045/opencv_045.py) | ✏️ code_046 | [图像连通组件寻找](python/code_046/opencv_046.py) | ✔️ code_047 | [图像连通组件状态统计](python/code_047/opencv_047.py) | ✔️ code_048 | [轮廓寻找](python/code_048/opencv_048.py) | ❣️ code_049 | [轮廓外接矩形](python/code_049/opencv_049.py) | ❣️ code_050 | [轮廓矩形面积与弧长](python/code_050/opencv_050.py) | ✏️ code_051 | [轮廓逼近](python/code_051/opencv_051.py) | ✔️ code_052 | [几何矩计算中心](python/code_052/opencv_052.py) | ✔️ code_053 | [使用Hu矩阵实现轮廓匹配](python/code_053/opencv_053.py) | ✔️ code_054 | [轮廓圆与椭圆拟合](python/code_054/opencv_054.py) | ✔️ code_055 | [凸包检测](python/code_055/opencv_055.py) | ✏️ code_056 | [直线拟合与极值点寻找](python/code_056/opencv_056.py) | ✔️ code_057 | [点多边形测试](python/code_057/opencv_057.py) | ✔️ code_058 | [寻找最大内接圆](python/code_058/opencv_058.py) | ✔️ code_059 | [霍夫曼直线检测](python/code_059/opencv_059.py) | ✔️ code_060 | [概率霍夫曼直线检测](python/code_060/opencv_060.py) | ❣️ code_061 | [霍夫曼圆检测](python/code_061/opencv_061.py) | ❣️ code_062 | [膨胀和腐蚀](python/code_062/opencv_062.py) | ❣️ code_063 | [结构元素](python/code_063/opencv_063.py) | ✔️ code_064 | [开运算](python/code_064/opencv_064.py) | ✏️ code_065 | [闭运算](python/code_065/opencv_065.py) | ✏️ code_066 | [开闭运算的应用](python/code_066/opencv_066.py) | ✏️ code_067 | [顶帽](python/code_067/opencv_067.py) | ✔️ code_068 | [黑帽](python/code_068/opencv_068.py) | ✔️ code_069 | [图像梯度](python/code_069/opencv_069.py) | ✔️ code_070 | [基于梯度的轮廓发现](python/code_070/opencv_070.py) | ✏️ code_071 | [击中击不中](python/code_071/opencv_071.py) | ✔️ code_072 | [缺陷检测1](python/code_072) | ✔️ code_073 | [缺陷检测2](python/code_073/opencv_073.py) | ✔️ code_074 | [提取最大轮廓和编码关键点](python/code_074) | ✔️ code_075 | [图像修复](python/code_075/opencv_075.py) | ✔️ code_076 | [图像透视变换应用](python/code_076/opencv_076.py) | ✏️ code_077 | [视频读写和处理](python/code_077/opencv_077.py) | ✏️ code_078 | [识别与跟踪视频中的特定颜色对象](python/code_078) | ✔️ code_079 | [视频分析-背景/前景 提取](python/code_079/opencv_079.py) | ✔️ code_080 | [视频分析–背景消除与前景ROI提取](python/code_080) | ✔️ code_081 | [角点检测-Harris角点检测](python/code_081) | ✔️ code_082 | [角点检测-Shi-Tomas角点检测](python/code_082) | ✏️ code_083 | [角点检测-亚像素角点检测](python/code_083) | ✔️ code_084 | [视频分析-KLT光流跟踪算法-1](python/code_084) | ✏️ code_085 | [视频分析-KLT光流跟踪算法-2](python/code_085) | ✏️ code_086 | [视频分析-稠密光流分析](python/code_086) | ✏️ code_087 | [视频分析-帧差移动对象分析](python/code_087/opencv_087.py) | ✔️ code_088 | [视频分析-均值迁移](python/code_088) | ✏️ code_089 | [视频分析-连续自适应均值迁移](python/code_089) | ✏️ code_090 | [视频分析-对象移动轨迹绘制](python/code_090) | ✔️ code_091 | [对象检测-HAAR级联分类器](python/code_091) | ✔️ code_092 | [对象检测-HAAR特征分析](python/code_092) | ✔️ code_093 | [对象检测-LBP特征分析](python/code_093/opencv_093.py) | ✔️ code_094 | [ORB 特征关键点检测](python/code_094) | ✏️ code_095 | [ORB 特征描述子匹配](python/code_095) | ✔️ code_096 | [多种描述子匹配方法](python/code_096) | ✏️ code_097 | [基于描述子匹配的已知对象定位](python/code_097) | ✏️ code_098 | [SIFT 特征关键点检测](python/code_097) | ✔️ code_099 | [SIFT 特征描述子匹配](python/code_097) | ✔️ code_100 | [HOG 行人检测](python/code_100/opencv_100.py) | ✔️ code_101 | [HOG 多尺度检测](python/code_101/opencv_101.py) | ✏️ code_102 | [HOG 提取描述子](python/code_102/opencv_102.py) | ✔️ code_103 | [HOG 使用描述子生成样本数据](python/code_103/opencv_103.py) | ✔️ code_104 | [(检测案例)-HOG+SVM 训练](python/code_104/opencv_104.py) | ✔️ code_105 | [(检测案例)-HOG+SVM 预测](python/code_105/opencv_105.py) | ✔️ code_106 | [AKAZE 特征与描述子](python/code_106) | ✔️ code_107 | [Brisk 特征与描述子](python/code_107) | ✔️ code_108 | [GFTT关键点检测](python/code_108) | ✔️ code_109 | [BLOB 特征分析](python/code_109) | ✔️
要在Ubuntu上安装OpenCV-Python 4.3,你可以按照以下步骤进行操作: 1. 首先,确保你的系统已经安装了一些必要的依赖项。你可以使用以下命令安装这些依赖项: ``` sudo apt-get update sudo apt-get install -y cmake g++ wget unzip build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev libcanberra-gtk-module pkg-config ``` 2. 创建一个目录并下载OpenCV源代码。你可以使用以下命令完成这一步骤: ``` mkdir OpencvRoute && cd OpencvRoute wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip unzip opencv.zip mv opencv-4.x opencv cd opencv mkdir build cd build ``` 3. 运行cmake命令来配置编译选项。你可以使用以下命令: ``` sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. ``` 4. 编译OpenCV。你可以使用以下命令: ``` sudo make -j8 ``` 5. 安装OpenCV。你可以使用以下命令: ``` sudo make install ``` 6. 配置环境变量。你可以根据需要在你的bash配置文件中添加以下行: ``` export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.x/dist-packages ``` 请注意,上述步骤中的"4.x"应该替换为你想要安装的OpenCV版本号。此外,你可能需要根据你的Python版本和系统配置进行一些调整。 如果你需要更详细的安装说明,你可以参考[1]中提供的链接。希望对你有所帮助! 引用: [1] 安装OpenCV-Python 4.x on Ubuntu: https://github.com/opencv/opencv/blob/master/doc/tutorials/introduction/linux_install/linux_install.md

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值