利用OpenCV检测图像块

本文摘录自 Blob Detection Using OpenCV ( Python, C++ ) 关于图像块的检测方法的总结,用于之后的学习和工程应用。

 

§00   言

本文摘录自 Blob Detection Using OpenCV ( Python, C++ ) 关于图像块的检测方法的总结,用于之后的学习和工程应用。

  本文将会介绍使用OpenCV进行图像块简单检测算法。

0.1 什么是图像块?

  所谓图像块就是在图像中一组相邻的具有相同特性(比如灰度值)像素区域。在前面的图像中,那些紧挨在一起的黑色像素区域就是图像块。图像块检测就是找到并标记出这些区域。

0.2 检测样例代码

  OpenCV提供了检测图像块的方便方法并使用不同特征将它们过滤出来。 下面以简单示例开始:

  • Python
# Standard imports
import cv2
import numpy as np;

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

# Set up the detector with default parameters.
detector = cv2.SimpleBlobDetector()

# 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 keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)
  • C++
using namespace cv;
// Read image
Mat im = imread( "blob.jpg", IMREAD_GRAYSCALE );

// Set up the detector with default parameters.
SimpleBlobDetector detector;

// Detect blobs.
std::vector<KeyPoint> keypoints;
detector.detect( im, keypoints);

// Draw detected blobs as red circles.
// DrawMatchesFlags::DRAW_RICH_KEYPOINTS flag ensures the size of the circle corresponds to the size of blob
Mat im_with_keypoints;
drawKeypoints( im, keypoints, im_with_keypoints, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS );

// Show blobs
imshow("keypoints", im_with_keypoints );
waitKey(0);

 

§01 测方法


1.1 检测标准

  SimpleBlockDetector,就像函数的名字一样,是基于下面刻画的简单算法。通过参数(下面文本中的黑色加粗字体)来控制算法并使用下面步骤来实现,通过下面部分了解这些参数是如何被设置的。

  • Thresholding : Convert the source images to several binary images by thresholding the source image with thresholds starting at minThreshold. These thresholds are incremented by thresholdStep until maxThreshold. So the first threshold is minThreshold, the second is minThreshold + thresholdStep, the third is minThreshold + 2 x thresholdStep, and so on.
  • Grouping : In each binary image, connected white pixels are grouped together. Let’s call these binary blobs.
  • Merging : The centers of the binary blobs in the binary images are computed, and blobs located closer than minDistBetweenBlobs are merged.
  • Center & Radius Calculation : The centers and radii of the new merged blobs are computed and returned.

1.2 检测参数

  检测原理是通过图像块的颜色、尺寸和形状。通过 SimpleBlobDetector 的参数的设置制定检测方法,从而将相应的图像块过滤出来。

1.2.1 颜色

  通过这个特征进行检测算法似乎已经不能持续了。通过代码的测试他表现出存在逻辑错误。

  开始你需要设置 filterByColor=1。 设置 blockColor=0 选择黑色图像, blobColor=255 是检测亮的图像块。 通过尺寸:你可以通过参数 filterByArea=1来基于尺寸选择不同的图像块,选择恰当的 minArea, maxArea 参数设置检测范围。 比如设置 minArea=100是指图像块至少具有100个像素。 通过形状的方法:具有三种不同的参数。下面依次给出。

1.2.2 圆度

  这是用来度量图像块与圆的相似度。 正六边形比正方向更接近于圆形。通过设置 filterByCircularity=1 来选择圆度方法。选择 minCircularity, maxCircularity 合适的参数圆度范围。 圆度的定义为在:

C i r c u l a r i t y = 4 π A r e a ( P e r i m e t e r ) 2 Circularity = {{4\pi Area} \over {\left( {Perimeter} \right)^2 }} Circularity=(Perimeter)24πArea

  这表明的圆度为 1,方形具有 圆度 0.785,以此类推。

1.2.3 凸度

  一图值千言。凸度定义为(图像块的面积/凸覆盖的面积)。凸覆盖是一个紧紧包围住图像的凸图形。 通过设置filterByConvexity=1来选择凸度来检测图像,使用 0 ≤ minConvexity ≤ 1 以及 maxConvexity ≤ 1 来指明检测参数范围。

1.2.4 惯性比

  不要因为这个名词把你吓着。使用数学里这些难懂的词语可以非常简明的刻画物体特性。 你所需知道的就是 惯性比是对形状如何被拉长的度量, 比如,圆形,惯性比就是1。一个椭圆的惯性比在0 到 1 之间,对于直线,对应的惯性比则是0. 利用惯性比来过滤图像块需要设置 filterByInertia=1, 并通过在0 ~ 1之间的 minInertialRatio, maxInertiaRatio参数表明检测参数范围。

 

§02 现代码


  置 SimpleBlobDetector 非常容易,下面给出了相应的代码示例。

  • Python
# 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
params.filterByCircularity = True
params.minCircularity = 0.1

# Filter by Convexity
params.filterByConvexity = True
params.minConvexity = 0.87

# Filter by Inertia
params.filterByInertia = True
params.minInertiaRatio = 0.01

# 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)
  • C++

  与OpenCV3相比, OpenCV2 中设置SimpleBlobDetector参数存在少许的不同。下面代码中使用宏定义 CV_MAJOR_VERSION 来检查 OpenCV的版本。 在OpenCV3中,SimpleBlobDetector::create的方法创建一个灵活的指针。下面代码给出了相应的用法:

// Setup SimpleBlobDetector parameters.
SimpleBlobDetector::Params params;

// Change thresholds
params.minThreshold = 10;
params.maxThreshold = 200;

// Filter by Area.
params.filterByArea = true;
params.minArea = 1500;

// Filter by Circularity
params.filterByCircularity = true;
params.minCircularity = 0.1;

// Filter by Convexity
params.filterByConvexity = true;
params.minConvexity = 0.87;

// Filter by Inertia
params.filterByInertia = true;
params.minInertiaRatio = 0.01;

#if CV_MAJOR_VERSION < 3   // If you are using OpenCV 2

  // Set up detector with params
  SimpleBlobDetector detector(params);

  // You can use the detector this way
  // detector.detect( im, keypoints);

#else

  // Set up detector with params
  Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);

  // SimpleBlobDetector::create creates a smart pointer. 
  // So you need to use arrow ( ->) instead of dot ( . )
  // detector->detect( im, keypoints);

#endif

▲ 图2.1  不同检测方法示例

▲ 图2.1 不同检测方法示例

 

  结 ※


  文对 Blob Detection Using OpenCV ( Python, C++ ) 中介绍Si
  mpleBlobDetector函数的使用方法进行总结,以备今后的学习和使用。


■ 相关文献链接:

● 相关图表链接:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 利用OpenCV进行图像识别是一种常见的计算机视觉应用。OpenCV是一个开源计算机视觉库,支持多种编程语言,包括C++、Python等。它提供了丰富的图像处理和计算机视觉算法,可以用来进行图像识别、目标检测、人脸识别、手势识别等任务。 在进行图像识别时,首先需要加载和处理图像OpenCV提供了读取、保存和处理图像的函数,可以对图像进行灰度化、二值化、滤波等预处理操作,以提高后续识别的准确性。 接下来,可以使用OpenCV提供的特征提取算法,如SIFT、SURF、HOG等,来提取图像的特征。这些算法可以提取出图像中的关键特征点或特征向量,用于识别或匹配。 然后,可以使用OpenCV提供的机器学习算法,如支持向量机(SVM)、K最近邻(KNN)等,来训练一个分类器或回归器。通过给分类器提供一系列已知的图像样本和其对应的标签,可以训练模型,使其可以自动识别未知图像。 最后,可以使用训练好的模型对新的图像进行识别。将新的图像输入到分类器中,分类器将输出一个标签,表示图像所属的类别。根据这个标签,可以判断图像中的物体或场景是什么。 总之,利用OpenCV进行图像识别可以实现多种应用,如车牌识别、人脸识别、文字识别等。通过选择合适的图像处理和机器学习算法,可以有效提高图像识别的准确性和效率。 ### 回答2: OpenCV是一个开源的计算机视觉库,常用于图像处理和计算机视觉任务。使用OpenCV进行图像识别可以通过以下步骤实现。 1. 导入OpenCV库:首先需要安装并导入OpenCV库,确保可以在代码中使用相关函数和类。 2. 加载图像:使用OpenCV的函数或方法加载待识别的图像文件。可以通过指定文件路径或者从摄像头实时获取图像。 3. 图像预处理:在进行图像识别之前,通常需要进行一些预处理操作。比如调整图像大小、灰度化处理、去除噪声等。这些预处理操作有助于提高识别准确率和效果。 4. 特征提取:通过OpenCV提供的函数或方法,从图像中提取出有用的特征信息。这些特征可以是图像的边缘、角点、颜色直方图等等,可以根据具体任务选择合适的特征。 5. 训练模型:使用提取出的特征数据,训练一个机器学习模型或者深度学习模型。可以选择使用OpenCV的机器学习模,也可以使用其他深度学习框架如TensorFlow、PyTorch等。 6. 图像识别:使用训练好的模型对新的图像进行识别。将预处理和特征提取应用到待识别图像上,然后输入到模型中进行识别。根据不同的任务,可以得到不同的识别结果,比如物体识别、手势识别、人脸识别等。 7. 分析结果:根据识别结果进行分析,可以对图像内容进行标记、分类、计数等处理。根据具体需求,可以输出结果图像、生成报告或者执行其他进一步的操作。 总之,通过使用OpenCV进行图像识别,可以实现从加载图像到预处理、特征提取、模型训练和图像识别的完整过程,提供了强大的工具和函数库来支持各种图像识别任务。通过合理的处理和使用相关技术,可以实现高效准确的图像识别应用。 ### 回答3: OpenCV是一个开源的计算机视觉库,可以帮助我们进行图像和视频处理。通过使用OpenCV,我们可以实现图像识别的功能。 在使用OpenCV进行图像识别时,我们可以首先加载并读取待识别的图像。然后,可以应用不同的技术和算法对图像进行处理和分析。例如,我们可以使用特征提取算法,如SIFT(尺度不变特征变换)或SURF(加速稳健特征),来提取图像中的关键点和特征描述符。然后,可以使用这些特征描述符进行匹配,以识别图像中的物体或场景。 另外,我们还可以使用机器学习算法来训练图像分类器,以识别不同类别的图像。对于训练图像分类器,我们需要准备一组已标记的图像数据集,然后使用OpenCV提供的机器学习算法,如支持向量机(SVM)或卷积神经网络(CNN),进行训练和优化。训练完成后,我们就可以使用这个分类器对新的未知图像进行分类和识别。 此外,OpenCV还提供了其他功能,如人脸识别、目标跟踪、图像分割等。通过使用这些功能,我们可以进一步提高图像识别的准确性和性能。 综上所述,利用OpenCV进行图像识别可以通过特征提取和匹配、机器学习分类器等技术来实现。OpenCV作为一个强大的计算机视觉库,为我们提供了丰富的工具和算法,方便我们进行图像识别和处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值