对了,我最近开通了微信公众号,计划是两边会同步更新,并逐步的会将博客上的文章同步至公众号中。
感兴趣的朋友可以扫描下方的二维码或者搜索“里先森sements”来关注,欢迎来玩~!


本文中的主要参考文献如下:

  • 【图像算法】图像特征:几何不变矩–Hu矩 - SkySeraph - 博客园: https://www.cnblogs.com/skyseraph/archive/2011/07/19/2110183.html
  • 图像的矩特征 - ☆Ronny丶 - 博客园: https://www.cnblogs.com/ronny/p/3985810.html
  • 《图像处理、分析与机器视觉》
  • 《数字图像处理》冈萨雷斯–第十一章-不变矩

目录

  • 一、矩的概念
  • 二、Hu矩
    • 2.1 (p+q)阶不变矩的定义
    • 2.2 归一化中心距
    • 2.3 Hu矩定义
    • 2.4 Hu矩计算代码

一、矩的概念

图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰。图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个。

针对于一幅图像,我们把像素的坐标看成是一个二维随机变量(X,Y)(X,Y),那么一幅灰度图像可以用二维灰度密度函数来表示,因此可以用矩来描述灰度图像的特征。

不变矩(Invariant Moments)是一处高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性。M.K.Hu在1961年首先提出了不变矩的概念。1979年M.R.Teague根据正交多项式理论提出了Zernike矩。下面主要介绍这两种矩特征的算法原理与实现。

二、Hu矩

2.1 (p+q)阶不变矩的定义

对于灰度分布为f(x,y)f(x,y)f(x,y)的图像,其(p+q)(p+q)(p+q)阶矩定义为:

mpq=∬xpyqf(x,y)dxdyp,q=0,1,2,⋯m_{pq}=\iint x^py^qf(x,y)dxdy\qquad p,q=0,1,2,\cdotsmpq​=∬xpyqf(x,y)dxdyp,q=0,1,2,⋯

其(p+q)(p+q)(p+q)阶中心矩定义为:

μpq=∬(x−x0)p(y=y0)qf(x,y)dxdy\mu_{pq}=\iint(x-x_0)^p(y=y_0)^qf(x,y)dxdyμpq​=∬(x−x0​)p(y=y0​)qf(x,y)dxdy

其中,矩心为:

x0=m10m00,y0=m01m00x_0=\frac {m_{10}}{m_{00}},y_0=\frac {m_{01}}{m_{00}}x0​=m00​m10​​,y0​=m00​m01​​

由于数字图像属于离散化数据,离散状态下,f(x,y)f(x,y)f(x,y)的(p+q)(p+q)(p+q)阶普通矩和中心矩的公式如下:

mpq=∑x=1M∑y=1Nxpyqf(x,y)m_{pq}=\sum_{x=1}^M\sum_{y=1}^Nx^py^qf(x,y)mpq​=x=1∑M​y=1∑N​xpyqf(x,y)

μpq=∑x=1M∑y=1N(x−x0)p(y−y0)qf(x,y)其中p,q=0,1,2,⋯\mu_{pq}=\sum_{x=1}^M\sum_{y=1}^N(x-x_0)^p(y-y_0)^qf(x,y)\quad\text{其中}\quad p,q=0,1,2,\cdotsμpq​=x=1∑M​y=1∑N​(x−x0​)p(y−y0​)qf(x,y)其中p,q=0,1,2,⋯

离散化后的矩心x0与y0的计算方法同连续状态下的计算公式。

p、q即在x、y这两个像素位置上的多少次方。在p、q不为0时,求mpqm_{pq}mpq​可以看作 x的p次方 与 y的q次方 作为权重叠加到当前x、y位置上的灰度值,然后累加。当求m00m_{00}m00​时,可知仅为图像的灰度值进行累加。

2.2 归一化中心距

当图像发生变化,如平移、旋转等,mpqm_{pq}mpq​也发生变化。而由于μpq\mu_{pq}μpq​式与中心有关,其对平移不敏感,但依旧对旋转敏感。为了解决这个问题,这里提出归一化中心矩

ypq=μpqμ00ry_{pq}=\frac {\mu_{pq}}{\mu_{00}^r}ypq​=μ00r​μpq​​

式中:r=p+q+22p+q=2,3,⋯r=\frac {p+q+2}{2} \quad p+q=2,3,\cdotsr=2p+q+2​p+q=2,3,⋯

归一化中心矩使用的是中心矩进行的计算。可以注意到,归一化中心矩计算ypqy_{pq}ypq​时使用的μ00\mu_{00}μ00​从数值上来看,就等同于m00m_{00}m00​。

2.3 Hu矩定义

Hu利用二阶和三阶中心矩(即p+q=2,3p+q = 2,3p+q=2,3)构造了7个不变矩I1∼I7I_1\sim I_7I1​∼I7​,这7个不变矩构成一组特征量,Hu.M.K在1962年证明了他们具有旋转,缩放和平移不变性,它们在连续图像条件下可以保持平移、缩放和旋转不变。具体定义如下:

{I1=y20+y02I2=(y20−y02)2+4y112I3=(y30−3y12)2+(3y21−y03)2I4=(y30+y12)2+(y21+y03)2I5=(y30−3y12)(y30+y12)[(y30+y12)2−3(y21+y03)2]+(3y21−y03)(y21+y03)[3(y30+y12)2−(y21+y03)2]I6=(y20−y02)[(y30+y12)2−(y21+y03)2]+4y11(y30+y12)(y21+y03)I7=(3y21−y03)(y30+y12)[(y30+y12)2−3(y21+y03)2]−(y30−3y12)(y21+y03)[3(y30+y12)2−(y21+y03)2]\begin{cases} I_1 = y_{20}+y_{02}\\\\ I_2 = (y_{20}-y_{02})^2+4y_{11}^2\\\\ I_3 = (y_{30}-3y_{12})^2+(3y_{21}-y_{03})^2\\\\ I_4 = (y_{30}+y_{12})^2+(y_{21}+y_{03})^2\\\\ I_5=(y_{30}-3y_{12})(y_{30}+y_{12})[(y_{30}+y_{12})^2-3(y_{21}+y_{03})^2]+(3y_{21}-y_{03})(y_{21}+y_{03})[3(y_{30}+y_{12})^2-(y_{21}+y_{03})^2]\\\\ I_6=(y_{20}-y_{02})[(y_{30}+y_{12})^2-(y_{21}+y_{03})^2]+4y_{11}(y_{30}+y_{12})(y_{21}+y_{03})\\\\ I_7=(3y_{21}-y_{03})(y_{30}+y_{12})[(y_{30}+y_{12})^2-3(y_{21}+y_{03})^2]-(y_{30}-3y_{12})(y_{21}+y_{03})[3(y_{30}+y_{12})^2-(y_{21}+y_{03})^2] \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​I1​=y20​+y02​I2​=(y20​−y02​)2+4y112​I3​=(y30​−3y12​)2+(3y21​−y03​)2I4​=(y30​+y12​)2+(y21​+y03​)2I5​=(y30​−3y12​)(y30​+y12​)[(y30​+y12​)2−3(y21​+y03​)2]+(3y21​−y03​)(y21​+y03​)[3(y30​+y12​)2−(y21​+y03​)2]I6​=(y20​−y02​)[(y30​+y12​)2−(y21​+y03​)2]+4y11​(y30​+y12​)(y21​+y03​)I7​=(3y21​−y03​)(y30​+y12​)[(y30​+y12​)2−3(y21​+y03​)2]−(y30​−3y12​)(y21​+y03​)[3(y30​+y12​)2−(y21​+y03​)2]​

2.4 Hu矩计算代码

参考自:【图像算法】图像特征:几何不变矩–Hu矩 - SkySeraph - 博客园,修正了部分格式问题与变量名,方便对照上面进行查看。

double I[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 u00=0,u11=0,u20=0,u02=0,u30=0,u03=0,u12=0,u21=0;     //中心矩 double x0=0,y0=0;                                           //计算中心距时所使用的临时变量(x-x') double y20=0,y02=0,y11=0,y30=0,y03=0,y12=0,y21=0;           //规范化后的中心矩double t1=0,t2=0,t3=0,t4=0,t5=0;                            //临时变量, int center_x0=0,center_y0=0;                                //矩心 int i,j;                                                    //循环变量//  获得图像的区域重心(普通矩)double m10=0,m01=0,m00=0;                                   //0阶矩和1阶矩  for(j=0;j<bmpHeight;j++)//y{for(i=0;i<bmpWidth;i++)//x{m10+=i*pBmpBuf[j*bmpStep+i];m01+=j*pBmpBuf[j*bmpStep+i];m00+=pBmpBuf[j*bmpStep+i];}}center_x0=(int)(m10/m00+0.5);center_y0=(int)(m01/m00+0.5);//  计算二阶、三阶矩(中心矩)u00=m00;                        //归一化中心矩计算时使用的u00从数值上来看,就等同于m00。for(j=0;j<bmpHeight;j++) {for(i=0;i<bmpWidth;i++)//x { x0=(i-center_x0); y0=(j-center_x0); u11+=x0*y0*pBmpBuf[j*bmpStep+i]; u20+=x0*x0*pBmpBuf[j*bmpStep+i]; u02+=y0*y0*pBmpBuf[j*bmpStep+i]; u03+=y0*y0*y0*pBmpBuf[j*bmpStep+i];u30+=x0*x0*x0*pBmpBuf[j*bmpStep+i]; u12+=x0*y0*y0*pBmpBuf[j*bmpStep+i]; u21+=x0*x0*y0*pBmpBuf[j*bmpStep+i]; } } //  计算规范化后的中心矩: uij/pow(u00,((i+j+2)/2) , 而u00 = m00,故直接用m00y20=u20/pow(m00,2); y02=u02/pow(m00,2); y11=u11/pow(m00,2);y30=u30/pow(m00,2.5); y03=u03/pow(m00,2.5);y12=u12/pow(m00,2.5); y21=u21/pow(m00,2.5);//  计算中间变量t1=(y20-y02); t2=(y30-3*y12); t3=(3*y21-y03); t4=(y30+y12);t5=(y21+y03);//  计算不变矩 I[0]=y20+y02; I[1]=t1*t1+4*y11*y11; I[2]=t2*t2+t3*t3; I[3]=t4*t4+t5*t5;I[4]=t2*t4*(t4*t4-3*t5*t5)+t3*t5*(3*t4*t4-t5*t5); I[5]=t1*(t4*t4-t5*t5)+4*y11*t4*t5;I[6]=t3*t4*(t4*t4-3*t5*t5)-t2*t5*(3*t4*t4-t5*t5);return true;
}

图像特征中的几何不变矩:Hu矩相关推荐

  1. 几何不变矩 Hu 矩

    几何不变矩 Hu 矩 [原文部分转载]:http://blog.csdn.net/wrj19860202/archive/2011/04/16/6327094.aspx 在连续情况下,图像函数为 ,那 ...

  2. 二值图像分析—Hu矩实现轮廓匹配

    在OpenCV中,可以很方便的得到Hu不变距,Hu矩在图像旋转.缩放.平移等操作后,仍能保持矩的不变性,所以有时候用Hu不变距更能识别图像的特征. Hu矩由于具有尺度.旋转.平移不变性,可以用来做匹配 ...

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

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

  4. Hu矩的学习,图像轮廓特征识别(二,c#实现)

    不变矩介绍: 先看教课书上的公式: 再看网上很认真的论文: 最后看冈萨雷斯的: Hu矩5,7的公式有争议,我采用数字图像处理冈萨雷斯三版的公式,不过,感到还是不满意,有问题. 我们获取轮廓的特征,在此 ...

  5. LabVIEW图像特征与机器视觉概念(理论篇—4)

    图像的特征是指图像的原始特性或属性,其中部分属于自然特征,如像素灰度.边缘和轮廓.纹理及色彩等.有些则是需要通过计算或变换才能得到的特征,如直方图.频谱和不变矩等. 为了能减少计算量并提高系统的实时性 ...

  6. 结合openCV学习DIP之传统图像特征与匹配

    前言 关于图像的预处理部分参考  结合opencv学习DIP​​​​​​​ 概述 该笔记主要是基于DIP理论➕openCV实现,学习该笔记首先要确保通读DIP理论,并由自己的话描述相关知识,并且掌握o ...

  7. 乳腺肿瘤超声图像特征

    http://blog.csdn.net/Sungden/article/details/74012171 肿瘤在超声图像中一般表现为低回声区.具体来说,可从以下各项特征入手描述不同的乳腺肿瘤: (1 ...

  8. [OpenCV实战]10 使用Hu矩进行形状匹配

    目录 1 什么是图像矩? 2 如何计算图像矩 2.1 质心获取 2.2 中心矩 2.3 Hu矩 3 基于Hu矩实现形状匹配 3.1 Hu矩的计算 3.2 基于matchShapes函数计算两个图形之间 ...

  9. Opencv:基于Hu-moments(hu矩)的形状匹配

    本文将按照以下目录展开介绍: 什么是图像矩: 如何计算图像矩: 什么是Hu矩: 如何利用Opencv计算一个图像Hu矩: 如何利用Hu-矩来寻找两个形状的相似性: 1. 什么是图像力矩 图像矩是图像像 ...

最新文章

  1. 学习!机器学习算法优缺点综述
  2. java 自动装箱自动拆箱_自动装箱和自动拆箱
  3. sk_buff结构分析
  4. 【原创】leetCodeOj ---Convert Sorted List to Binary Search Tree 解题报告
  5. as无效 mysql_mysql 排它锁无效
  6. 分页查询插件PageHelper 5.x版本
  7. numpy+pandas+matplotlib绘制误差条形图
  8. 从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构
  9. @protocol 和 category 中如何使用 @property
  10. java铲车_深入研究Java类装载机制
  11. java多级继承_java代码继承------多层继承
  12. rpm的mysql怎么安装_MySQL的rpm安装教程
  13. 理解Mach-O文件格式(1)
  14. mac更新系统版本后的安装包路径
  15. python之面向对象反射和双下方法
  16. 基于超声波的库位重定位算法
  17. 全球与中国高氧潜水电脑市场深度研究分析报告
  18. 安卓技术实战01 第一个安卓APP案例
  19. Oauth与Shiro整合的开源项目
  20. android 刷机精灵,Android专用刷机精灵 让你刷机成瘾

热门文章

  1. php自带的basename函数尽然不支持中文
  2. 搜索:搜索+优先队列
  3. vue中的project和inject
  4. Android手摸手实现一个画板功能(一)——View的拖拽
  5. 天蓝色在ps中的色值_加强天蓝色政策
  6. 重庆赛区ACM热身赛 8526. 小埋的烦恼
  7. html vb病毒,HTML_用vbs实现的一款Worm.Win32.VB.fw病毒专杀,在写了《Worm.Win32.VB.fw分析与清 - phpStudy...
  8. 【webshell管理工具之一】中国菜刀
  9. Linux命令 - 日拱一卒
  10. 一篇浅显易懂的 TS 入门指南