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

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

3天内不再提示

OpenCV二值图像分析

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2023-10-20 12:25 次阅读

轮廓属性

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

轮廓面积

轮廓周长

轮廓几何矩

轮廓的最小外接矩形

轮廓的最大外接矩形

轮廓的最小外接圆

轮廓的最小外接三角形

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

轮廓的凸包

轮廓层次信息提取

多边形逼近

计算欧拉数

函数介绍

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

    文章

    3904

    浏览量

    61310
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40790
  • 图像分析
    +关注

    关注

    0

    文章

    80

    浏览量

    18563

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

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

收藏 人收藏

    评论

    相关推荐

    最新OpenCV专题出炉啦~最全OpenCV教程及各种图像处理、目标跟踪、识别案例

    OpenCV基础知识及应用领域设计,包含OpenCV教程、OpenCV识别、OpenCV跟踪及OpenCV
    发表于 07-06 14:41

    opencv跟labview图像格式的转换

    opencv跟labview图像格式的转换,有大神会吗,教我?
    发表于 08-13 21:07

    【新手求助】关于树莓派+opencv+摄像头图像处理的问题?

    滤波;扫描图像,大致确定光斑位置;在光斑附件选取一块区域进行化;区域累加的方法求取重心;问题是这个流程下来,要费时3~4秒,想知道网上人做图像处理可以一秒十几帧甚至几十帧是怎么做到
    发表于 11-09 08:57

    OpenCV图像

    之前学过一段时间OpenCV,跟着网上的资料,自己瞎搞了个上位机,可以对摄像头采集的图像简单处理,在此献丑了,hhhhhh
    发表于 07-11 19:07

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

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

    关于OpenCV图像如何处理

    OpenCV-图像处理(25、直方图比较)
    发表于 04-27 15:14

    Vivado HLS实现OpenCV图像处理的设计流程与分析

    本文通过对OpenCV图像类型和函数处理方法的介绍,通过设计实例描述在vivadoHLS中调用OpenCV库函数实现图像处理的几个基本步骤,完成从
    发表于 07-08 08:30

    如何使用Python中的OpenCV模块检测颜色

    numpy然后,导入模块。读取图像并使用 OpenCV 模块中的 cvtColor() 函数将BGR图像转换为 HSV (色调、饱和度、) 图像
    发表于 02-09 16:31

    【EASY EAI Nano开源套件试用体验】3. OpenCV 图像处理开发测试

    -化实现黑白滤镜opencv滤镜-反向滤镜opencv滤镜-去色滤镜opencv滤镜-单色滤镜ope
    发表于 03-08 00:03

    使用opencv进行图像处理

    使用opencv进行图像处理_于仕琪,感兴趣的可以看看。
    发表于 05-03 14:45 0次下载

    基于OpenCV的灰度图像伪彩色化研究边栓成

    基于OpenCV的灰度图像伪彩色化研究_边栓成
    发表于 03-17 08:00 2次下载

    OpenCV图像修复

    OpenCV图像修复技术原理就是利用那些已经被破坏的区域的边缘, 即边缘的颜色和结构,根据这些图像留下的信息去推断被破坏的信息区的信息内容,然后对破坏区进行填补 ,以达到图像修补的目的
    发表于 01-17 09:22 2983次阅读

    OpenCV中的图像的计算

    今天我们一起学习的是OpenCV中的图像的计算,在图像计算中,分为像素级运算和代数运算这两大类,今天我们借助OpenCV中的函数一起来看看这些运算。 一:
    的头像 发表于 11-03 17:45 1908次阅读

    OpenCV库在图像处理和深度学习中的应用

    本文深入浅出地探讨了OpenCV库在图像处理和深度学习中的应用。从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解释,带领大家步入OpenCV的实战世界。
    的头像 发表于 08-18 11:33 505次阅读

    如何实现PIL和OpenCV之间图像数据的转换呢?

    PIL图像数据格式转换成OpenCV图像数据格式
    的头像 发表于 02-25 13:43 517次阅读