二值图像(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
)