图像矩
moments(
InputArray array,//输入数据
bool binaryImage=false // 是否为二值图像
)
面积
contourArea(
InputArray contour,//输入轮廓数据
bool oriented// 默认false、返回绝对值)
弧长
arcLength(
InputArray curve,//输入曲线数据
bool closed// 是否是封闭曲线)
过程:
提取图像边缘
发现轮廓
计算每个轮廓对象的矩
计算每个对象的中心、弧长、面积
点多边形测试
测试一个点是否在给定的多边形内部,边缘或者外部
pointPolygonTest(
InputArray contour,// 输入的轮廓
Point2f pt, // 测试点
bool measureDist // 是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,true返回实际距离
返回数据是double类型)
基于距离变换与分水岭的图像分割
cv::distanceTransform(InputArray src, OutputArray dst, OutputArray labels, int distanceType, int maskSize, int labelType=DIST_LABEL_CCOMP)
distanceType = DIST_L1/DIST_L2,
maskSize = 3x3,最新的支持5x5,推荐3x3、
labels离散维诺图输出
dst输出8位或者32位的浮点数,单一通道,大小与输入图像一致
cv::watershed(InputArray image, InputOutputArray markers)
流程
1.将白色背景变成黑色-目的是为后面的变换做准备
2. 使用filter2D与拉普拉斯算子实现图像对比度提高,sharp
3. 转为二值图像通过threshold
4. 距离变换
5. 对距离变换结果进行归一化到[0~1]之间
6. 使用阈值,再次二值化,得到标记
7. 腐蚀得到每个Peak - erode
8.发现轮廓 – findContours
9. 绘制轮廓- drawContours
10.分水岭变换 watershed
11. 对每个分割区域着色输出结果