1 图像矩概念
矩、中心矩等概念直接看百科http://en.wikipedia.org/wiki/Image_moment
应用方面包括:一阶矩求质心、不变矩HuMoments形状匹配、二阶矩求orientation
2 质心
这里仅使用二值图做矩计算,用于物体形状分析,灰度图还需考虑像素强度。
首先,计算一个二值图的一到三阶矩,直接用moments。
Moments m = moments(img,true);
double c_x = m.m10/m.m00;
double c_y = m.m01/m.m00;
可直接求出质心c_x,c_y.
3 不变矩
见《学习opencv》,这里不做介绍
4 Orientation
原理出处见这里:http://people.csail.mit.edu/bkph/courses/papers/RoVis/ch3_BI_geometric.pdf
计算公式也不难:http://en.wikipedia.org/wiki/Image_moment
该理论跟最小二乘法直线拟合有点像,区别在于前者使用矩来计算(输入是一整张图像),后者通过拟合方法计算(输入是一系列点坐标)。
cv::Moments m =cv::moments(img);
//中心
float x_ = m.m10/m.m00;
float y_ = m.m01/m.m00;
//中心距, my_mu20 = mu20
float my_mu20 = m.m20 - x_*m.m10;
float mu20 = m.mu20;
//计算旋转,两种计算等价,theta = theta2
float theta = 0.5*atan2(2*m.mu11,(m.mu20-m.mu02)) * 180/3.1415;
//wiki公式
float u20 = m.m20/m.m00 - x_*x_;//u20 = m.mu20/m.mu00 = m.mu20/m.m00
float u02 = m.m02/m.m00 - y_*y_;
float u11 = m.m11/m.m00 - x_*y_;
float theta2 = 0.5*atan2(2*u11,(u20-u02)) * 180/3.1415;
后来用fitLine取参数CV_DIST_L2做了简单对比,结果差别不大。
Vec4f linePara;
fitLine(linePts,linePara,CV_DIST_L2,0,0.01,0.01);
灰色是二值点,白色粗线是矩计算结果,白色细线是拟合计算结果: