0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二值图像分析最常见的方式

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-08-12 10:45 次阅读

轮廓属性

二值图像分析最常见的一个主要方式就是轮廓发现轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经过轮廓分析我们可以得到轮廓各种有用的属性信息、常见的如下:

轮廓面积

轮廓周长

轮廓几何矩

轮廓的最小外接矩形

轮廓的最大外接矩形

轮廓的最小外接圆

轮廓的最小外接三角形

轮廓拟合(支持拟合直线、椭圆、圆)

轮廓的凸包

轮廓层次信息提取

多边形逼近

计算欧拉数

函数介绍

OpenCV中提供大量轮廓分析函数,通过这些函数我们可以方便快捷的得到轮廓的各种有用属性信息、高效完成各种二值图像分析需求,下面是我总结的一些常用的函数列表与说明。

OpenCV中轮廓发现函数如下:

voidcv::findContours(
InputArrayimage,
OutputArrayOfArrayscontours,
OutputArrayhierarchy,
intmode,
intmethod,
Pointoffset=Point()
)

参数解释如下:

image: 输入图像、八位单通道的,背景为黑色
contours: 得到的轮廓图像
hierarchy: 层次图像,根据需要提取轮廓层次信息
mode: 决定提取到层次信息内容,是多层还是单层
method: 每个轮廓的编码信息
offset: 表示轮廓偏移,默认为0

轮廓分析相关的常用函数

//计算轮廓面积
doublecv::contourArea(
InputArraycontour,
booloriented=false
)
//计算轮廓周长
doublecv::arcLength(
InputArraycurve,
boolclosed
)
//计算几何矩与中心距
Momentscv::moments(
InputArrayarray,
boolbinaryImage=false
)
//计算最小外接矩形
RotatedRectcv::minAreaRect(
InputArraypoints
)
//计算最大外接矩形
Rectcv::boundingRect(
InputArrayarray
)
//计算最小外接圆/拟合圆
voidcv::minEnclosingCircle(
InputArraypoints,
Point2f¢er,
float&radius
)
//计算最小外接三角形/拟合三角形
doublecv::minEnclosingTriangle(
InputArraypoints,
OutputArraytriangle
)
//拟合直线
voidcv::fitLine(
InputArraypoints,
OutputArrayline,
intdistType,
doubleparam,
doublereps,
doubleaeps
)
//拟合椭圆
RotatedRectcv::fitEllipse(
InputArraypoints
)
//计算凸包
voidcv::convexHull(
InputArraypoints,
OutputArrayhull,
boolclockwise=false,
boolreturnPoints=true
)
//多边形逼近-逼近真实形状
voidcv::approxPolyDP(
InputArraycurve,
OutputArrayapproxCurve,
doubleepsilon,
boolclosed
)

灵活使用上述轮廓属性信息,可以实现对二值图像的几何形状判别、测量、面积过滤、获取每个对象的几何属性包括面积、周长、编码点、形状、层次/位置信息、欧拉数、中心位置、倾斜角度。

综合运用代码演示

2020年 以前我分享过一些综合使用的例子,列表如下(都看过你就赢了):

二值图像分析案例精选

OpenCV二值图像案例分析精选 | 第二期

OpenCV轮廓层次分析实现欧拉数计算

OpenCV寻找复杂背景下物体的轮廓

如何识别出轮廓准确的长和宽

OpenCV中几何形状识别与测量

OpenCV中BLOB特征提取与几何形状分类

OpenCV直线拟合检测

OpenCV中实现曲线与圆拟合

这里再分享一个硬币计数的例子!

原图如下:

代码如下:

//加载图像
Matimg=imread("D:/CoinsB.png");
imshow("OriginalImage",img);

//阈值化操作
Matgray,binary;
cvtColor(img,gray,COLOR_BGR2GRAY);
floatt=threshold(gray,binary,0,255,THRESH_BINARY|THRESH_OTSU);
imshow("binary",binary);
imwrite("D:/binary1.png",binary);

//形态学操作
Matse=getStructuringElement(MORPH_RECT,Size(3,3));
morphologyEx(binary,binary,MORPH_OPEN,se,Point(-1,-1));

//轮廓发现
vectorhireachy;
vector>contours;
bitwise_not(binary,binary);
findContours(binary,contours,hireachy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point());
Matresult=img.clone();
Point2fcenter;
floatradius;

//轮廓分析
for(size_tt=0;t< contours.size(); t++) {
    double area = contourArea(contours[t]);
    if (area < 1000) {
        continue;
    }
    RotatedRect rrt = fitEllipse(contours[t]);
    radius = min(rrt.size.width, rrt.size.height)/2.0;
    circle(result, rrt.center, radius, Scalar(0, 0, 255), 4, 8, 0);
    Moments mm = moments(contours[t]);
    double cx = mm.m10 / mm.m00;
    double cy = mm.m01 / mm.m00;
    circle(result, Point(cx, cy), 2, Scalar(255, 0, 0), 2, 8, 0);
}

// 显示结果
imshow("result", result);
imwrite("D:/drawing.png", result);
waitKey(0);

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • 二值图像
    +关注

    关注

    0

    文章

    14

    浏览量

    8685
  • 轮廓分析
    +关注

    关注

    0

    文章

    2

    浏览量

    6074

原文标题:OpenCV | 二值图像分析的技巧都在这里

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    变频器最常见的十大故障现象和分析处理实例

    变频器是自动化工厂中最常见的电气设备下面我们一起来看看变频器最常见的十大故障现象和分析处理实例。
    发表于 09-14 09:11 4.9w次阅读

    电工最常见电路

    电工最常见电路
    发表于 10-12 21:11

    基于FPGA的图像的膨胀算法的实现

    1 背景知识图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像
    发表于 08-14 09:08

    基于图像分块的局部阈值化方法

    针对目前局部阈值化结果存在目标虚假或断裂的缺陷,提出了一种基于图像分块的局部阈值化方法。首先,将
    发表于 05-04 11:10

    列举了20个最常见的电路

    为电子工程师的你,已经掌握了多少模拟电路呢?还应该掌握多少图纸和原理呢?本文列举了20个最常见的电路,并粗略的推断出不同层次的发烧对线路的不同理解程度,快来对照看看你是哪个程度的电子工程师。  一
    发表于 05-21 07:35

    labview中化结果显示的几种方式对比

    labview中常见图像预处理操作化的结果比较特殊,
    发表于 08-16 18:19

    实战视觉图像处理:LabVIEW化结果显示与对比

    `LabVIEW中常见图像预处理操作化的结果比较特殊,
    发表于 12-09 14:53

    最常见的fork用法是什么

    的进程一模一样,这两 个进程都会继续运行最常见的fork用法是创建一个新的进程,然后使用exec载入进制映像,替换当前进程的映像。这种情况下,派生(for
    发表于 12-15 07:38

    变频电源最常见的故障问题有哪些

    大家总结下变频电源最常见的故障问题有哪些:1、安装环境的问题2、外部的电磁感应干扰3、冷却系统问题 4、主回路故障问题以上就是变频电源最常见的四大问题,如果你在变频电源出现问题之后,只要不是人为造...
    发表于 12-30 08:11

    JPEG图像数据格式简明分析

    本文针对最常见的JPEG 图像格式的压缩数据进行分析,描述了每一字节的数据所表示的含义,同时也介绍了JPEG 图像格式中的大部分典型且必要的标记、参数等元素,这些都是对JPE
    发表于 09-18 11:05 16次下载

    常见的充电方式有哪些?

    常见的充电方式有哪些? 常见的充电方式有以下三种:    1. 恒流充电:在充电过程中保持恒定的电流给电池充电,是
    发表于 11-05 09:25 3834次阅读

    电工最常见电路集

    电工最常见电路集:
    发表于 02-28 15:39 415次下载
    电工<b class='flag-5'>最常见</b>电路集

    五种最常见的五种电机冷却方式介绍

    电机的冷却方式通常根据其功率、运行环境和设计要求来选择。以下是五种最常见的五种电机冷却方式
    发表于 08-16 09:29 2774次阅读

    OpenCV二值图像分析

    二值图像分析最常见的一个主要方式就是轮廓发现与轮廓分析,其中轮廓发现的目的是为轮廓分析做准备,经
    的头像 发表于 10-20 12:25 353次阅读

    最常见的直流负载工作方式

    最常见的直流负载工作方式  直流负载工作方式是指在直流电路中使用的各种负载方式。直流负载是用于测试和测量直流电源输出能力和能效的设备,可以模拟真实负载条件下的电流和功率需求。本文将详细
    的头像 发表于 01-18 15:12 283次阅读