ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

opencv-二值图像之轮廓

2021-01-20 21:33:28  阅读:210  来源: 互联网

标签:int InputArray double opencv 图像 二值 轮廓 cv


二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。人们经常用黑白、B&W、单色图像表示二值图像。二值图像一般用来描述字符图像,其优点是占用空间少,缺点是,当表示人物,风景的图像时,二值图像只能展示其边缘信息,图像内部的纹理特征表现不明显。这时候要使用纹理特征更为丰富的灰度图像。《百度百科》
参考:https://blog.csdn.net/qq_41498261/article/details/102808176
二值图像分析最主要的用途有轮廓发现和轮廓分析,轮廓发现的目的是准备轮廓分析。
opencv中轮廓发现的函数如下:

 void cv::findContours
    (
        InputArray image,               //输入图像,八位单通道,BG:Black
        OutputArrayOfArrays contours,   //得到轮廓
        OutputArray hierarchy,          //层次图像,根据需要提取轮廓信息
        int mode,                       //轮廓检索模式
        int method,                     //轮廓近似方法
        Point offset=Point()            //轮廓偏移,默认0
    )

每个轮廓contours都存储为点向量(例如std :: vector <std :: vector >)。
hierarchy的输出向量(例如std :: vector),包含有关图像拓扑的信息,具有与轮廓数量一样多的元素。
RetrievalModes 轮廓检索算法的模式

modelstatement
RETR_EXTERNAL仅检索极端的外部轮廓(只检测最外围的轮廓,包含在外围轮廓内的内围轮廓被忽略)
RETR_LIST检测所有的轮廓,包括内围、外围轮廓(不建立等级关系,彼此之间独立)
RETR_CCOMP检索所有轮廓并将其组织为双层结构(two-level hierarchy)
RETR_TREE检索所有轮廓,并重建嵌套轮廓的完整层次。所有轮廓建立一个等级树结构
RETR_FLOODFILL洪水填充法

ContourApproximationModes 轮廓的近似方法

methodstatement
CHAIN_APPROX_NONE绝对存储所有轮廓点(相邻的两个点的像素位置差不超过1)
CHAIN_APPROX_SIMPLE压缩水平,垂直和对角线段,仅保留其端点
CHAIN_APPROX_TC89_L1使用teh-Chinl chain 链逼近算法
CHAIN_APPROX_TC89_KCOS应用teh-Chinl chain 链逼近算法

drawContours绘制函数如下

void drawContours( 
       InputOutputArray image,   
       InputArrayOfArrays contours,             //输入轮廓,每个轮廓都存储为点向量
       int contourIdx,                          //要绘制轮廓的参数。若为负,则绘制所有轮廓
       const Scalar& color,                     //轮廓的颜色
       int thickness = 1,                       //轮廓的线的粗细。如果为负数,则绘制轮廓内部
       int lineType = LINE_8,                   //线型
       InputArray hierarchy = noArray(),        //层次结构
       int maxLevel = INT_MAX,                  //绘制轮廓的最大级别(仅当有可用的层次结构时才考虑此参数)
       Point offset = Point() 
 );

轮廓分析相关的常用函数:

  • 计算轮廓面积
double cv::contourArea(
InputArray contour,
bool oriented = false
)
  • 计算轮廓周长
double cv::arcLength(
InputArray      curve,
bool        closed
)
  • 计算几何矩与中心距
Moments cv::moments(
InputArray      array,
bool        binaryImage = false
)
  • 计算最小外接矩形
RotatedRect cv::minAreaRect(
InputArray      points
)
  • 计算最大外接矩形
Rect cv::boundingRect(
InputArray      array
)
  • 计算最小外接圆/拟合圆
void cv::minEnclosingCircle(
InputArray      points,
Point2f &        center,
float &    radius
)
  • 计算最小外接三角形/拟合三角形
double cv::minEnclosingTriangle(
InputArray      points,
OutputArray   triangle
)
  • 拟合直线
void cv::fitLine(
InputArray      points,
OutputArray   line,
int   distType,
double    param,
double    reps,
double    aeps
)
  • 拟合椭圆
RotatedRect cv::fitEllipse(
InputArray      points
)
  • 计算凸包
void cv::convexHull(
InputArray      points,
OutputArray   hull,
bool        clockwise = false,
bool        returnPoints = true
)
  • 多边形逼近-逼近真实形状
void cv::approxPolyDP(
InputArray      curve,
OutputArray   approxCurve,
double    epsilon,
bool        closed
)

标签:int,InputArray,double,opencv,图像,二值,轮廓,cv
来源: https://blog.csdn.net/qq_36682445/article/details/112908131

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有