设 X 和 Y 是随机变量,c 为常数,k 为正整数,
如果E(|X−c|k)E(|X−c|k)存在,则称E(|X−c|k)E(|X−c|k)为 X 关于点 c 的 k 阶矩。
c = 0 时, 称为 k 阶原点矩;
c = E(x) 时,称为 k 阶中心矩。
如果E(|X−c1|p⋅|Y−c2|q)E(|X−c1|p⋅|Y−c2|q)存在,则称其为 X,Y 关于 c 点 p+q 阶矩。
当图像为二值图时, V(i,j) 只有0(黑),1(白)两个值。 M10 就是图像上所以白色区域 x坐标值的累加。因此,一阶矩可以用来求二值图像的重心
Mat image = imread(imagename, 0);//读入灰度图
Mat binary;
//二值,椭圆是黑色的,所以反色下
threshold(image, binary, 200, 255, CV_THRESH_BINARY_INV);
Moments m = moments(binary, true);//moments()函数计算出三阶及一下的矩
Point2d center(m.m10 / m.m00, m.m01 / m.m00);//此为重心
//计算方向
double a = m.m20 / m.m00 - center.xcenter.x;
double b = m.m11 / m.m00 - center.xcenter.y;
double c = m.m02 / m.m00 - center.ycenter.y;
double theta = fastAtan2(2b,(a - c))/2;//此为形状的方向
int main(int argc, char** argv)
{
Mat image = imread(argv[1]);
cvtColor(image, image, CV_BGR2GRAY);
Moments mts = moments(image);
double hu[7];
HuMoments(mts, hu);
for (int i=0; i<7; i++)
{
cout << log(abs(hu[i])) <
return 0;
}
Hu矩在图像描述上有广泛的应用,但是其低阶几何矩与图像整体特征有关,不包含太多的图像细节信息,而高阶几何矩易受噪声影响,因此很难利用几何矩恢复图像。
Zernike矩能够很容易地构造图像的任意高阶矩,并能够使用较少的矩来重建图像。Zernike矩是基于Zernike多项式的正交化函数,虽然其计算比较复杂,但是Zernide矩在图像旋转和低噪声敏感度方面具有较大的优越性。由于Zernike矩具有图像旋转不变性,而且可以构造任意高阶矩,所以被广泛应用对目标进行识别中。