http://blog.csdn.net/qq_26898461/article/details/47123405

几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移、旋转和尺度不变性。

在连续情况下,图像函数为 ,那么图像的p+q阶几何矩(标准矩)定义为:

 

p+q阶中心距定义为:

 

其中 和 代表图像的重心,

对于离散的数字图像,采用求和号代替积分:

 

 

 和 分别是图像的高度和宽度;

归一化的中心距定义为:

 ;其中

利用二阶和三阶归一化中心矩构造了7个不变矩 :

这7个不变矩构成一组特征量,Hu.M.K在1962年证明了他们具有旋转,缩放和平移不变性。

实际上,在对图片中物体的识别过程中,只有 和 不变性保持的比较好,其他的几个不变矩带来的误差比较大,有学者认为只有基于二阶矩的不变矩对二维物体的描述才是真正的具有旋转、缩放和平移不变性( 和 刚好都是由二阶矩组成的)。不过我没有证明是否是真的事这样的。

由Hu矩组成的特征量对图片进行识别,优点就是速度很快,缺点是识别率比较低,我做过手势识别,对于已经分割好的手势轮廓图,识别率也就30%左右,对于纹理比较丰富的图片,识别率更是不堪入眼,只有10%左右。这一部分原因是由于Hu不变矩只用到低阶矩(最多也就用到三阶矩),对于图像的细节未能很好的描述出来,导致对图像的描述不够完整。

Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述得比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。

定义如下:

① (p+q)阶不变矩定义:

② 对于数字图像,离散化,定义为:

③ 归一化中心矩定义:

④Hu矩定义

-------------------------------------------------------------------------------------------------------------------------------

二 实现(源码)

①自编函数模块

 //#################################################################################//  double M[7] = {0};        //HU不变矩  bool HuMoment(IplImage* img)  {  int bmpWidth = img->width;  int bmpHeight = img->height;  int bmpStep = img->widthStep;   int bmpChannels = img->nChannels;      uchar*pBmpBuf = (uchar*)img->imageData;

 double m00=0,m11=0,m20=0,m02=0,m30=0,m03=0,m12=0,m21=0;  //中心矩  double x0=0,y0=0;    //计算中心距时所使用的临时变量(x-x')  double u20=0,u02=0,u11=0,u30=0,u03=0,u12=0,u21=0;//规范化后的中心矩 //double M[7];    //HU不变矩  double t1=0,t2=0,t3=0,t4=0,t5=0;//临时变量,  //double Center_x=0,Center_y=0;//重心  int Center_x=0,Center_y=0;//重心  int i,j;            //循环变量

 //  获得图像的区域重心(普通矩) double s10=0,s01=0,s00=0;  //0阶矩和1阶矩   for(j=0;j<bmpHeight;j++)//y     { for(i=0;i<bmpWidth;i++)//x         {             s10+=i*pBmpBuf[j*bmpStep+i];             s01+=j*pBmpBuf[j*bmpStep+i];             s00+=pBmpBuf[j*bmpStep+i];         }     }     Center_x=(int)(s10/s00+0.5);     Center_y=(int)(s01/s00+0.5);

 //  计算二阶、三阶矩(中心矩)     m00=s00;  for(j=0;j<bmpHeight;j++)      { for(i=0;i<bmpWidth;i++)//x          {              x0=(i-Center_x);              y0=(j-Center_y);              m11+=x0*y0*pBmpBuf[j*bmpStep+i];              m20+=x0*x0*pBmpBuf[j*bmpStep+i];              m02+=y0*y0*pBmpBuf[j*bmpStep+i];              m03+=y0*y0*y0*pBmpBuf[j*bmpStep+i];             m30+=x0*x0*x0*pBmpBuf[j*bmpStep+i];              m12+=x0*y0*y0*pBmpBuf[j*bmpStep+i];              m21+=x0*x0*y0*pBmpBuf[j*bmpStep+i];          }      } 

 //  计算规范化后的中心矩: mij/pow(m00,((i+j+2)/2)     u20=m20/pow(m00,2);      u02=m02/pow(m00,2);      u11=m11/pow(m00,2);     u30=m30/pow(m00,2.5);      u03=m03/pow(m00,2.5);     u12=m12/pow(m00,2.5);      u21=m21/pow(m00,2.5);

 //  计算中间变量     t1=(u20-u02);      t2=(u30-3*u12);      t3=(3*u21-u03);      t4=(u30+u12);     t5=(u21+u03);

 //  计算不变矩      M[0]=u20+u02;      M[1]=t1*t1+4*u11*u11;      M[2]=t2*t2+t3*t3;      M[3]=t4*t4+t5*t5;     M[4]=t2*t4*(t4*t4-3*t5*t5)+t3*t5*(3*t4*t4-t5*t5);     M[5]=t1*(t4*t4-t5*t5)+4*u11*t4*t5;     M[6]=t3*t4*(t4*t4-3*t5*t5)-t2*t5*(3*t4*t4-t5*t5);

 returntrue; }
②调用OpenCV方法
//  利用OpenCV函数求7个Hu矩    CvMoments moments;    CvHuMoments hu;    cvMoments(bkImgEdge,&moments,0);     cvGetHuMoments(&moments, &hu);     cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl;    cvMoments(testImgEdge,&moments,0);     cvGetHuMoments(&moments, &hu);     cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl;

-------------------------------------------------------------------------------------------------------------------------------

三 相似性准则

①法一

//  计算相似度1double dbR =0; //相似度double dSigmaST =0;    double dSigmaS =0;    double dSigmaT =0;    double temp =0;      {for(int i=0;i<7;i++)    {        temp = fabs(Sa[i]*Ta[i]);        dSigmaST+=temp;        dSigmaS+=pow(Sa[i],2);        dSigmaT+=pow(Ta[i],2);    }}    dbR = dSigmaST/(sqrt(dSigmaS)*sqrt(dSigmaT));

②法二

 1 //  计算相似度2  double dbR2 =0; //相似度  double temp2 =0;  double temp3 =0;        {for(int i=0;i<7;i++)      {        temp2 += fabs(Sa[i]-Ta[i]);          temp3 += fabs(Sa[i]+Ta[i]);     }}    dbR2 =1- (temp2*1.0)/(temp3);

Hu不变矩原理及opencv实现相关推荐

  1. Hu不变矩+BP神经网络,实现对图像的分类(pytorch实现)

    文章目录 1.网络模型 2.数据集制作 3.模型训练.保存.加载和使用 1.网络模型 方案,如图所示. 先对图片,用hu矩进行特征提取,每个图片产生7个特征值.这7个特征值作为数据,再加上一个标签值. ...

  2. OpenCV 中的矩(moments)和 Hu不变矩(HuMoments)

    文章目录 引言 矩的定义 OpenCV中的矩(moments) OpenCV中的Hu不变矩(HuMoments) 矩的应用 代码示例 参考链接 引言 我们在图像处理的任务中,常常需要对某些形状区域进行 ...

  3. 机器学习图像特征提取—Hu矩(Hu不变矩)原理及代码

    目录 1 矩的概念 2 Hu不变矩 3 利用opencv-python计算Hu矩 1 矩的概念 图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数 ...

  4. 获取图像的Hu不变矩

    使用C++.opencv获取图像的Hu不变矩 矩函数在图像分析中有着广泛的应用,如模式识别.目标分类.目标识别与方位估计.图像编码与重构等.一个从一幅数字图形中计算出来的矩集,通常描述了该图像形状的全 ...

  5. java求sobel算子代码_sobel算子原理及opencv源码实现

    sobel算子原理及opencv源码实现 简要描述 sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测. 原理 算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去 ...

  6. 双目相机标定以及立体测距原理及OpenCV实现

    转载 双目相机标定以及立体测距原理及OpenCV实现 http://blog.csdn.net/dcrmg/article/details/52986522?locationNum=15&fp ...

  7. 20轮廓-hu不变矩的测试程序

    20轮廓-hu不变矩的测试程序 程序对使用轮廓的hu矩进行测试: #include <cv.h> #include <cxcore.h> #include <highgu ...

  8. RANSAC(随机采样一致算法)原理及openCV代码实现

    <RANSAC(随机采样一致算法)原理及openCV代码实现> 原文: http://www.lai18.com/content/1046939.html  本文转自:http://b ...

  9. 角点检测(Harris Shi-Tomas)的原理及OpenCV API 的应用

    角点检测(Harris & Shi-Tomas)的原理及OpenCV API 的应用 这篇博客的内容主要时对参考中多篇博客的总结. 1. 角点 在现实世界中,角点对应于物体的拐角,道路的十字路 ...

最新文章

  1. 1.3创建项目「深入浅出ASP.NET Core系列」
  2. matlab 多条函数颜色渐变(没多大用处)
  3. tl-wn821n无线网卡驱动 linux,tl-wn821n win10驱动
  4. 看完这篇文章之后,终于明白了编译到底怎么回事
  5. OAuth2(二)——实现
  6. 【小题目】写JAVA程序时可以创建一个名为123.java的源文件吗
  7. NYOJ-----最少乘法次数
  8. python猴子偷桃递归_C++猴子偷桃问题
  9. C盘pagefile.sys不可删除,解决磁盘占用太满的问题
  10. linux下find用法 find -name *.so -exec ll {} \;
  11. [转]文本分类入门(番外篇)特征选择与特征权重计算的区别
  12. 第十一天-linux的硬链接和软连接的区别
  13. 程序员必须要熟知的英文单词--更新中
  14. Word OpenXML常用标签openxml标签
  15. 【网络编程】TCP 网络应用程序开发
  16. mysql数据库导出数据乱码问题_Mysql数据库导出来的是乱码如何解决
  17. 数据结构——左倾红黑树
  18. 程序员 怎样成为自由职业_如何成为一名成功的自由程序员
  19. 仿微信、微博发朋友圈,文字+图片+视频
  20. 四年级计算机课程表制作教案,四年级上信息技术教案设计班级课程表吉教版.docx...

热门文章

  1. linux ati显卡驱动下载,教你在Linux中安装ATI显卡驱动(图)
  2. [转载记录]系统的UIM卡介绍
  3. qt获得当前窗口所在屏幕的大小
  4. 1分钟快速了解MindMapper 与MindManager间的不同点
  5. 传输层 TCP 拥塞控制(2):拥塞避免
  6. 数据可视化之绘制世界人口地图
  7. Maestro 薛定谔软件简单分子对接案例
  8. 数据库里面date类型时间有时差,时区问题
  9. Javascript:谈谈JS的全局变量跟局部变量(转zyz511919766)
  10. “血战”户用光伏之一:市场需求在哪里?