【图像算法OpenCV】几何不变矩--Hu矩
原文地址 http://blog.csdn.NET/daijucug/article/details/7535370
一 原理
几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移、旋转和尺度不变性。 定义如下:
① (p+q)阶不变矩定义:

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

③ 归一化中心矩定义:

④Hu矩定义


-------------------------------------------------------------------------------------------------------------------------------
二 实现(源码)
Code
1 //#################################################################################//
2 double M[7] = {0}; //HU不变矩
3 bool HuMoment(IplImage* img)
4 {
5 int bmpWidth = img->width;
6 int bmpHeight = img->height;
7 int bmpStep = img->widthStep;
8 int bmpChannels = img->nChannels;
9 uchar*pBmpBuf = (uchar*)img->imageData;
10
11 double m00=0,m11=0,m20=0,m02=0,m30=0,m03=0,m12=0,m21=0; //中心矩
12 double x0=0,y0=0; //计算中心距时所使用的临时变量(x-x')
13 double u20=0,u02=0,u11=0,u30=0,u03=0,u12=0,u21=0;//规范化后的中心矩
14 //double M[7]; //HU不变矩
15 double t1=0,t2=0,t3=0,t4=0,t5=0;//临时变量,
16 //double Center_x=0,Center_y=0;//重心
17 int Center_x=0,Center_y=0;//重心
18 int i,j; //循环变量
19
20 // 获得图像的区域重心(普通矩)
21 double s10=0,s01=0,s00=0; //0阶矩和1阶矩
22 for(j=0;j<bmpHeight;j++)//y
23 {
24 for(i=0;i<bmpWidth;i++)//x
25 {
26 s10+=i*pBmpBuf[j*bmpStep+i];
27 s01+=j*pBmpBuf[j*bmpStep+i];
28 s00+=pBmpBuf[j*bmpStep+i];
29 }
30 }
31 Center_x=(int)(s10/s00+0.5);
32 Center_y=(int)(s01/s00+0.5);
33
34 // 计算二阶、三阶矩(中心矩)
35 m00=s00;
36 for(j=0;j<bmpHeight;j++)
37 {
38 for(i=0;i<bmpWidth;i++)//x
39 {
40 x0=(i-Center_x);
41 y0=(j-Center_y);
42 m11+=x0*y0*pBmpBuf[j*bmpStep+i];
43 m20+=x0*x0*pBmpBuf[j*bmpStep+i];
44 m02+=y0*y0*pBmpBuf[j*bmpStep+i];
45 m03+=y0*y0*y0*pBmpBuf[j*bmpStep+i];
46 m30+=x0*x0*x0*pBmpBuf[j*bmpStep+i];
47 m12+=x0*y0*y0*pBmpBuf[j*bmpStep+i];
48 m21+=x0*x0*y0*pBmpBuf[j*bmpStep+i];
49 }
50 }
51
52 // 计算规范化后的中心矩: mij/pow(m00,((i+j+2)/2)
53 u20=m20/pow(m00,2);
54 u02=m02/pow(m00,2);
55 u11=m11/pow(m00,2);
56 u30=m30/pow(m00,2.5);
57 u03=m03/pow(m00,2.5);
58 u12=m12/pow(m00,2.5);
59 u21=m21/pow(m00,2.5);
60
61 // 计算中间变量
62 t1=(u20-u02);
63 t2=(u30-3*u12);
64 t3=(3*u21-u03);
65 t4=(u30+u12);
66 t5=(u21+u03);
67
68 // 计算不变矩
69 M[0]=u20+u02;
70 M[1]=t1*t1+4*u11*u11;
71 M[2]=t2*t2+t3*t3;
72 M[3]=t4*t4+t5*t5;
73 M[4]=t2*t4*(t4*t4-3*t5*t5)+t3*t5*(3*t4*t4-t5*t5);
74 M[5]=t1*(t4*t4-t5*t5)+4*u11*t4*t5;
75 M[6]=t3*t4*(t4*t4-3*t5*t5)-t2*t5*(3*t4*t4-t5*t5);
76
77 returntrue;
78 }
②调用OpenCV方法
1 // 利用OpenCV函数求7个Hu矩
2 CvMoments moments;
3 CvHuMoments hu;
4 cvMoments(bkImgEdge,&moments,0);
5 cvGetHuMoments(&moments, &hu);
6 cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl;
7 cvMoments(testImgEdge,&moments,0);
8 cvGetHuMoments(&moments, &hu);
9 cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl;
-------------------------------------------------------------------------------------------------------------------------------
三 相似性准则
①法一
// 计算相似度1
double dbR =0; //相似度
double dSigmaST =0;
double dSigmaS =0;
double dSigmaT =0;
double temp =0;
{for(int i=0;i<8;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
2 double dbR2 =0; //相似度
3 double temp2 =0;
4 double temp3 =0;
5 {for(int i=0;i<7;i++)
6 {
7 temp2 += fabs(Sa[i]-Ta[i]);
8 temp3 += fabs(Sa[i]+Ta[i]);
9 }}
10 dbR2 =1- (temp2*1.0)/(temp3);
【图像算法OpenCV】几何不变矩--Hu矩的更多相关文章
- 几何不变矩--Hu矩
[图像算法]图像特征: ---------------------------------------------------------------------------------------- ...
- opencv —— moments 矩的计算(空间矩/几何矩、中心距、归一化中心距、Hu矩)
计算矩的目的 从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的几何特征信息,如大小,位置.方向和形状等.这种描述能力广泛应用于各种图像处理.计算机视觉和机器人 ...
- Hu矩SVM训练及检测-----OpenCV
关键词:Hu矩,SVM,OpenCV 在图像中进行目标物识别,涉及到特定区域内是否存在目标物,SVM可在样本量较少情况下对正负样本(图片中前景背景)做出良好区分,图片基本特征包括诸如HOG.LBP.H ...
- opencv计算两个轮廓之间hu矩相似程度,MatchShapes
https://blog.csdn.net/jiake_yang/article/details/52589063 [OpenCV3.3]通过透视变换矫正变形图像 https://blog.csdn. ...
- opencv中的图像矩(空间矩,中心矩,归一化中心矩,Hu矩)
严格来讲矩是概率与统计中的一个概念,是随机变量的一种数字特征.设 x 为随机变量,C为常数,则量E[(x−c)^k]称为X关于C点的k阶矩.比较重要的两种情况如下: 1.c=0,这时a_k=E(X^k ...
- 【OpenCV】轮廓的特征矩Moment
opencv中的矩主要包括以下几种:空间矩,中心矩和中心归一化矩. class Moments { public: ...... // 空间矩 double m00, m10, m01, m20, m ...
- 【图像基础】图像不变性特征HU矩和Zernike矩
参考 1. 图像不变性特征: 2. matlab实现: 3. HU矩和Zernike矩: 完
- Hu矩
close all; clear all; I1=imread('lena.bmp'); angle=; T=[cos(angle),sin(angle),;-sin(angle),cos(angle ...
- 形状特征提取-Hu不变矩(转载)
[原文部分转载]:http://blog.csdn.net/wrj19860202/archive/2011/04/16/6327094.aspx 在连续情况下,图像函数为 ,那么图像的p+q阶几何矩 ...
随机推荐
- Oracle 11 安装教程(桌面类)
准备文件: http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_1of2.zip http://downlo ...
- 队列BlockingQueue的简单例子
队列,当进行多线程编程的时候,很多时候可能会用到,队列是先进先出的,我们可以将要执行的任务放置在队列内缓存起来,当线程池中线程可以使用的时候,我们就从队列中获取一个任务执行.. 当前是一个队列的简单例 ...
- laravel各种请求类
curl请求类 composer require php-curl-class/php-curl-class
- C++ 头文件的理解
变量.函数在使用前必须被声明.至于函数里干了什么,编译时不关注,链接(link)时,才会去搜寻所有编译后的文件,寻找函数具体干了什么. *.h头文件干的事情就像“复制-粘贴”,哪里引用,就把*.h内容 ...
- CKEditor从word粘贴问题
最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...
- 收藏一个ST表模板
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...
- 【csp模拟赛1】不服来战 (challenge.cpp)
[题目描述] 最近小 Z 和他的朋友都迷上了一款手机游戏:不服来战. 游戏的设定十分简单,在游戏开始时,会给出一排共 N 个灯,有的灯是开着 的有的是关着的,每个灯都有一个分数.而玩家可以进行任意次操 ...
- 【csp模拟赛1】T1 心有灵犀
[题目描述] 爱玩游戏的小 Z 最近又换了一个新的游戏.这个游戏有点特别,需要两位玩 家心有灵犀通力合作才能拿到高分. 游戏开始时,两位玩家会得到同一个数字 N,假设这个数字共有 t 位数码, 然后两 ...
- typedef struct和指针
在学习链表时遇到了typedef已经用typedef定义的指针,不是很懂,某浪里有位博主的博文写的很详细,我直接粘过来 假设我们定义一个结构体: typedef struct ANSWER_HEADE ...
- LVS集群之DR模式
今天来讲LVS-DR模式集群实现负载均衡的搭建方法 环境 主机名 IP 系统 角色 dir DIP:192.168.199.9 VIP:192.168.199.8 rhel7.4 集群服务器 no ...