【数字图像处理学习笔记之三】Blob分析

         Blob在机器视觉中是指图像中的具有相似颜色、纹理等特征所组成的一块连通区域。Blob分析就是对这一块连通区域进行几何分析得到一些重要的几何特征,例如:区域的面积、中心点坐标、质心坐标、最小外接矩形、主轴等。

         Blob分析的一般步骤

(1)图像分割:分离出前景和背景

(2)连通性分析:根据目标的连通性对目标区域进行标记,或者叫拓扑性分析

(3)特征量计算:描述了区域的几何特征,这些几何特征不依赖与灰度值

        一个很简单的例子:

         1.图像分割

             将图像分离为目标像素和背景像素,初始分割之后一般需要进行形态学处理才能满足使用要求。常用分割方法:直接输入;硬阈值分割;软阈值分割。常用形态学处理包括:连通、膨胀、腐蚀、开操作、闭操作、顶帽变换、击中与不击中变换、交集、差异、骨架、边界等。

阈值分割又包括:

1)简单阈值分割threshold

适用范围:目标与背景之间存在灰度差(如果环境稳定,阈值可以在离线状态下一次确定)

2)动态阈值分割dyn_threshold

适用范围:背景不均一无法确定全局阈值、目标经常表现为比背景局部亮一些或者暗一些。这时候需要通过其领域来找到一个合适的阈值进行分割。确定其领域的方法是:通过一些平滑滤波算子来确定领域,例如mean_image或者binomial_filter

3)自动全局阈值方法bin_threshold

4)watersheds_threshold

          2.特征量计算常用

area_center,区域面积Area中心RowColumn

area_center_gray,区域面积Area灰度中心RowColumn

smallest_rectangle1最小外接矩形

smallest_rectangle2最小外接仿射矩形,

compactness,紧凑度

elliptic_axis,计算region区域中的椭圆参数

intensity,计算region区域的灰度平均值和偏差

min_max_gray,最小最大灰度值


  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用OpenCV的C++例程,用于在图像中检测矩形区域并进行blob分析: ```c++ #include <opencv2/opencv.hpp> #include <iostream> #include <vector> using namespace cv; using namespace std; int main() { // 读取图像文件 Mat img = imread("test.jpg", IMREAD_GRAYSCALE); // 二值化图像 Mat binary_img; threshold(img, binary_img, 0, 255, THRESH_BINARY_INV | THRESH_OTSU); // 查找轮廓 vector<vector<Point>> contours; findContours(binary_img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 筛选矩形轮廓 vector<Rect> rects; for (size_t i = 0; i < contours.size(); i++) { Rect rect = boundingRect(contours[i]); if (rect.width > 10 && rect.height > 10 && rect.width < img.cols && rect.height < img.rows) { rects.push_back(rect); } } // 显示矩形 for (size_t i = 0; i < rects.size(); i++) { rectangle(img, rects[i], Scalar(255, 0, 0), 2); } // 显示图像 imshow("result", img); waitKey(); // 对每个矩形进行blob分析 for (size_t i = 0; i < rects.size(); i++) { // 提取矩形区域 Mat roi = binary_img(rects[i]); // 构建blob分析器 SimpleBlobDetector::Params params; params.minDistBetweenBlobs = 10; // blob之间的最小距离 params.filterByArea = true; // 根据面积筛选blob params.minArea = 50; // blob的最小面积 params.maxArea = 10000; // blob的最大面积 params.filterByCircularity = true; // 根据圆形度筛选blob params.minCircularity = 0.8; // blob的最小圆形度 params.maxCircularity = 1.0; // blob的最大圆形度 SimpleBlobDetector blob_detector(params); // 检测blob vector<KeyPoint> keypoints; blob_detector.detect(roi, keypoints); // 显示结果 Mat result; drawKeypoints(roi, keypoints, result, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS); imshow("result", result); waitKey(); } return 0; } ``` 此示例使用OpenCV的`findContours`函数查找图像中的轮廓,然后使用矩形边界框筛选出矩形轮廓。然后,它使用`SimpleBlobDetector`类对每个矩形进行blob分析,并在每个矩形上绘制检测到的blob

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值