图像的矩知识

图像的矩

  • 数学中的矩
    • 图像中的矩
      • Opencv 矩的代码
      • OpenCV计算Hu矩
      • Zernike矩
      • 参考文献

数学中的矩

设 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 阶矩。

图像中的矩

图像的矩知识_第1张图片
图像的矩知识_第2张图片
当图像为二值图时, V(i,j) 只有0(黑),1(白)两个值。 M10 就是图像上所以白色区域 x坐标值的累加。因此,一阶矩可以用来求二值图像的重心

图像的矩知识_第3张图片
图像的矩知识_第4张图片

Opencv 矩的代码

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.x
center.y;
double c = m.m02 / m.m00 - center.ycenter.y;
double theta = fastAtan2(2
b,(a - c))/2;//此为形状的方向

OpenCV计算Hu矩

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矩:
图像的矩知识_第5张图片

Zernike矩

Hu矩在图像描述上有广泛的应用,但是其低阶几何矩与图像整体特征有关,不包含太多的图像细节信息,而高阶几何矩易受噪声影响,因此很难利用几何矩恢复图像。

Zernike矩能够很容易地构造图像的任意高阶矩,并能够使用较少的矩来重建图像。Zernike矩是基于Zernike多项式的正交化函数,虽然其计算比较复杂,但是Zernide矩在图像旋转和低噪声敏感度方面具有较大的优越性。由于Zernike矩具有图像旋转不变性,而且可以构造任意高阶矩,所以被广泛应用对目标进行识别中。

图像的矩知识_第6张图片

参考文献

  1. https://www.cnblogs.com/ronny/p/3985810.html
  2. https://blog.csdn.net/qq826309057/article/details/70039397

你可能感兴趣的:(图像算法,计算机视觉,opencv,python)