opencv-二值图像之轮廓

二值图像(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 轮廓检索算法的模式

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

ContourApproximationModes 轮廓的近似方法

method statement
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
)
上一篇:单目相机校正和Mat、Bitmap、Image<Bgr,byte>相互转换


下一篇:【OpenCV】形态学运算:腐蚀、膨胀、开运算、闭运算