不变矩
- 格式:pdf
- 大小:728.88 KB
- 文档页数:5
7个hu不变矩c++程序小试/blog/static/1207335020095247423457/Opencv 2009-06-24 19:04 阅读246 评论6 字号:大大中中小小我使用OpenCV中的函数cvGetHumoments()计算7个hu不变矩时始终有错误,为了得到结果我自己用C++编写了一段计算7个hu不变矩的程序。
说明:图片必须是等边长的,即宽和高相等。
****或许图片宽不能大于40像素,如果是边缘检测后的线条图像,图像宽高的限制会降低。
如果你有什么好的想法,不妨留言交流一下。
#include "cv.h"#include "cxcore.h"#include "highgui.h"#include <iostream.h>float MOMENTS_M(IplImage* MAT,int p,int q) //空间距{CvScalar scl;float M_sum_y;float M_sum_xy;int H,W;H=MAT->height;W=MA T->width;for(int i=0;i<H;i++){ for(int j=0;j<W;j++){scl=cvGet2D(MA T,i,j);M_sum_y+=scl.val[0]*pow(j,q);}M_sum_xy+=pow(i,p)*M_sum_y;}return M_sum_xy;}float MOMENTS_U(IplImage* MAT,int p,int q,float X_,float Y_) //中心距{CvScalar scl;float N_sum_y;float N_sum_xy;int H,W;H=MAT->height;W=MA T->width;for(int i=0;i<H;i++){ for(int j=0;j<W;j++){scl=cvGet2D(MA T,i,j);N_sum_y+=scl.val[0]*pow(j-Y_,q);}N_sum_xy+=pow(i-X_,p)*N_sum_y;}return N_sum_xy;}//归一化的中心距void main(){int M00,M01,M10,M11,M02,M20,M12,M21,M03,M30;float X_,Y_;float U00,U02,U20,U11,U03,U30,U21,U12;float N02,N20,N11,N03,N30,N12,N21;float H1,H2,H3,H4,H5,H6,H7;// IplImage* img;IplImage* mat;mat=cvLoadImage("pic5_00.jpg",0);// mat=cvCreateImage(img->height,img->width,8); // cvCopy(img,mat);M00=MOMENTS_M(mat,0,0);M01=MOMENTS_M(mat,0,1);M10=MOMENTS_M(mat,1,0);M11=MOMENTS_M(mat,1,1);M02=MOMENTS_M(mat,0,2);M20=MOMENTS_M(mat,2,0);M12=MOMENTS_M(mat,1,2);M21=MOMENTS_M(mat,2,1);M03=MOMENTS_M(mat,0,3);M30=MOMENTS_M(mat,3,0);X_=M10/M00;Y_=M01/M00;U00=M00;U02=M02-M01*Y_;U20=M20-M10*X_;U11=M11-M10*Y_;U03=M03-3*M02*X_+2*M10*X_*X_;U30=M30-3*M02*Y_+2*M01*Y_*Y_;U12=M12-2*M11*Y_-M02*X_+2*M10*Y_*Y_;U21=M21-2*M11*X_-M20*Y_+2*M01*X_*X_;cout<<U00<<"XXX"<<U02<<"XXX"<<U20<<"XXX"<<U11<<"XXX"<<U03<<"XXX"<<U30 <<"XXX"<<U12<<"XXX"<<U21<<endl;N02=U02/U00/U00;N20=U20/U00/U00;N11=U11/U00/U00;N03=U03/U00/U00/sqrt(U00);N30=U30/U00/U00/sqrt(U00);N12=U12/U00/U00/sqrt(U00);N21=U21/U00/U00/sqrt(U00);cout<<N02<<"XXX"<<N20<<"XXX"<<N11<<"XXX"<<N03<<"XXX"<<N30<<"XXX"<<N12 <<"XXX"<<N21<<endl;//hu7个不变距H1=N20+N02;H2=(N20-N02)* (N20-N02)+4*N11*N11;H3=(N30-3*N12)* (N30-3*N12)+(3*N21-N03)* (3*N21-N03);H4=(N30+N12)* (N30+N12)+(N21+N03)* (N21+N03);H5=((N30-3*N12)*(N30+N12)*((N30+N12)*(N30+N12)-3*(N21+N03)*(N21+N03))+(3*N21-N03)*(N21+N03)*(3*(N30+N12)* (N30+N12)-(N21+N03)* (N21+N03)))*100000;H6=(N20-N02)*((N30+N12)* (N30+N12)-(N21+N03)* (N21+N03))+4*N11*(N30+N12)*(N21+N03);H7=((3*N21-N03)*(N30+N12)*((N30+N12)*(N30+N12)-3*(N21+N03)*(N21+N03))+(3*N12-N30)*(N21+N03)*(3*(N30+N12)* (N30+N12)- (N21+N03)* (N21+N03)))*100000;cout<<H1<<"XXX"<<H2<<"XXX"<<H3<<"XXX"<<H4<<"XXX"<<H5<<"XXX"<<H6<<"XX X"<<H7<<endl;}。
不变矩特征1 前言不变矩在计算机视觉中有着重要的应用,它是一种将图像中的特征向量表示成二维矩阵形式的方法。
在处理图像的时候,由于图像的旋转、平移等操作都会导致图像的特征向量发生变化,因此需要一种能够忽略这些变化的特征向量表示方法。
不变矩的提出正是为了解决这个问题。
2 不变矩的定义不变矩是指一种将图像中的特征描述成矩阵形式的方式,且这种表示具有旋转、平移、缩放、镜像等变换不变性的特性。
在计算过程中,由于图像的形状、位置等因素的变化都会导致特征向量的改变,因此需要寻找一种能够消除这些因素影响的描述方法。
不变矩就是以这种目的而产生的一种表示方法。
3 不变矩的计算方法计算不变矩的过程比较复杂,需要从图像中提取相应的特征点,并计算这些特征点的矩,然后通过对这些特征点的矩进行组合和变换,得到不变矩的值。
在具体的计算方法上,可以有多种不同的方式,常见的包括:中心矩、哈里斯矩、轮廓矩、Zernike矩等。
其中,中心矩是最常用的。
中心矩具有旋转不变性等特点,在图像处理中应用广泛。
它的计算方法如下:(1)将图像二值化,并计算出图像的重心坐标(X0,Y0);(2)通过对像素点与重心坐标的距离进行多项式展开,得到图像的二阶、三阶中心矩;(3)通过对中心矩进行归一化操作,得到不变矩。
其中,归一化是指将所有的中心矩都除以图像的面积,这样可以保证不同面积的图像具有相同的不变矩。
4 不变矩的应用不变矩在图像处理中有着广泛的应用,特别是在目标检测、图像匹配、特征提取等领域都起到了非常重要的作用。
具体来说,其主要应用包括以下几个方面:(1)目标检测:利用不变矩可以快速计算出目标区域的位置、形状等特征,可以实现高效的目标检测。
(2)特征匹配:不变矩的特点在于能够消除图像的变换影响,因此可以实现精确的特征匹配。
(3)形状识别:不变矩可以将图像的形状表示成矩阵形式,并保持旋转、缩放、平移、镜像等操作的不变性,因此可以实现准确的形状识别。
第8章 形状描述与识别描述形状特征参数的方法主要有两类:基于区域的特征参数和基于边界的特征参数。
8.1 区域描述参数区域特征参数主要是通过区域内的所有像素点的集合来获得对形状特征参数的描述。
这些参数可以是几何参数,也可以是密度参数,还可以是区域的二维变换(如傅立叶变换和小波变换)系数或能量谱等。
对于形状特征的描述,人们已提出了许多方法,比较典型的有不变矩法、傅立叶描述子、边缘直方图法、小波重要系数法、小波轮廓表示法、几何参数法等。
1.基于区域的不变矩对于二维连续函数 ()y x f ,,其 ()q p +阶矩定义为(,),0,1,2,p q pq m x y f x y dxdyp q ∞∞-∞-∞==⎰⎰(8-3)根据唯一性定理说明,如果 ()y x f ,分段连续,且只在 xy 平面的有限部分有非 0值,则所有各阶矩皆存在,并且矩序列 pq m 唯一地由 ()y x f ,所确定。
反之,pq m 也唯一地确定了()y x f ,。
()y x f ,的中心矩可表示如下:dxdy y x f y y x x q p pq ),()()(--=⎰⎰∞∞-∞∞-μ(8-4)式中1000m x m =,0100my m=。
对于数字图像,用求和代替积分:∑∑--=xyq p pq y x f y y x x ),()()(μ(8-5) ∑∑=xyq p pq y x f y x m ),((8-6)零阶矩∑∑=xyy x f m ),(00为()y x f ,的均值,对于二值图像即为区域的面积。
∑∑=xyy x xf m ),(10,∑∑=xyy x yf m ),(01除以零阶矩00m 后得:10010000,m m x y m m ==是图像的重心坐标。
中心矩是反映图像相对于重心分布的度量。
例如,20μ和02μ分别表示图像围绕通过重心的垂直和水平轴线的惯性矩;30μ和03μ可以度量图像对于垂直和水平轴线的对称性等。
实验六基于Hμ不变矩的图像描述一、实验目的巩固不变矩的原理并编程二、实验要求1、学习Hμ不变矩原理,根据其定义式和最后的不变矩组φ1—φ7,编程实现对不同情况下同一目标物的描述2、不同情况下目标物包括正常、平移、旋转、尺度变换等主要程序如下。
输入的是二值化图像,输出对应的不变矩。
main.m文件内容如下:clear all;close all;clc;img=imread('shen.jpeg');fai1=two_dim_moment(img);% 原图img1=imresize(img,2);fai2=two_dim_moment(img1);%缩放img2=imrotate(img,90);fai3=two_dim_moment(img2);%旋转se=translate(strel(1),[20 20]);img3=imdilate(img,se);fai4=two_dim_moment(img3);%平移将对应的结果贴图如下:原图的不变矩组img=imread('shen.jpeg');fai1=two_dim_moment(img);%原图缩放后的不变矩组img1=imresize(img,2);fai2=two_dim_moment(img1);%缩放旋转后的不变矩组img2=imrotate(img,90);fai3=two_dim_moment(img2);%旋转平移后的不变矩组se=translate(strel(1),[20 20]);img3=imdilate(img,se);fai4=two_dim_moment(img3);%平移调用函数two_dim_moment.m 文件程序如下:function fai=two_dim_moment(img)[m n]=size(img);img=double(img);mm=zeros(4,4);for y=1:mfor x=1:nfor q=1:4for p=1:4mm(q,p)=mm(q,p)+x^(p-1)*y^(q-1)*img(y,x); endendendendmean_x=mm(2,1)/mm(1,1);mean_y=mm(1,2)/mm(1,1);u00=mm(1,1);u11=mm(2,2)-mean_y*mm(2,1);u20=mm(3,1)-mean_x*mm(2,1);u02=mm(1,3)-mean_y*mm(1,2);u30=mm(4,1)-3*mean_x*mm(3,1)+2*mean_x^2*mm(2,1);u03=mm(1,4)-3*mean_y*mm(1,3)+2*mean_y^2*mm(1,2);u21=mm(3,2)-2*mean_x*mm(2,2)-mean_y*mm(3,1)+2*mean_x^2*mm(1 ,2);u12=mm(2,3)-2*mean_y*mm(2,2)-mean_x*mm(1,3)+2*mean_y^2*mm(2 ,1);n20=u20/u00^2;n02=u02/u00^2;n11=u11/u00^2;n30=u30/u00^2.5;n03=u03/u00^2.5;n12=u12/u00^2.5;n21=u21/u00^2.5;fai(1) = n20 + n02;fai(2) = (n20-n02)^2 + 4*n11^2;fai(3) = (n30-3*n12)^2 + (3*n21-n03)^2;fai(4) = (n30+n12)^2 + (n21+n03)^2;fai(5) =(n30-3*n12)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n21-n0 3)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);fai(6) =(n20-n02)*((n30+n12)^2-(n21+n03)^2)+4*n11*(n30+n12)*(n21+n0 3);fai(7) =(3*n21-n03)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n12-n3 0)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);end。
Hu不变矩在图像识别中的应用与实现作者:张鸿锋李婉琪曾昭君麦志杰来源:《科技资讯》2014年第30期摘要:Hu不变矩是图像的一种统计特征,因其具有平移、旋转与比例不变性而被广泛应用于图像识别领域。
该文以MATLAB作为技术实现平台,以Hu不变矩作为判断依据,配合数字形态学、欧氏判据等数学方法,通过基于MATLAB的算法进行程序设计,实现区域图像特征数据获取,并与库内图像特征数据进行对比,选出与最接近的一组数据,实现图像识别的目的。
计算机模拟结果表明该方法的有效性和可行性。
关键词:Hu不变矩图像特征模式识别应用中图分类号:TP391 文献标识码:A 文章编号:1672-3791(2014)10(c)-0005-04模式识别,指使用计算机利用数学技术方法,对表征事物或现象的各种形式的(数值的、文字的和逻辑关系的)信息进行处理和分析,以对事物或现象进行描述、辨认、分类和解释的过程。
其中,我们把环境与客体统称为“模式”。
该文讨论对数字图像进行模式识别,包含对图像进行特征提取与匹配的过程。
图像特征有两类表示方法,一类是轮廓特征,另一类是区域特征。
图像的轮廓特征主要针对物体的外边界,常使用链码,傅里叶描述子、Hough变换进行描述;图像的区域特征则关系到整个形状区域,常用边界特征法、傅里叶形状描述符法、几何参数法、形状不变矩法和小波描述符(Wavelet Deor)等方法描述。
而图像特征匹配是指将待检测图像的图像特征与给定图像的数据进行比对,使用如互相关性、欧氏判据等方法,判断两者是否使用同一类型图像的操作。
Hu不变矩作为形状不变矩的其中一种计算方式,具有平移、比例和旋转不变性,这使其在在图像识别的过程中,能减少如待测图像的大小归一化与位置居中等预处理步骤,降低运算成本,提高运算速率。
本文将使用Matlab平台,应用Hu不变矩作为特征提取技术,结合数学形态学、欧氏判据等运算方法,实现图像识别功能。
1 Hu不变矩的定义与计算方式M.K.Hu在1962年提出了Hu不变矩。
不变矩
1 关于Hu不变矩的性质
在黎曼积分意义下,将二维(p+q)阶矩定义为:
相应的(p+q)阶中心矩则定义如下:
将积分符号换成求和符号会比较助于理解,但是为了保持证明的完整性,仍然保留积分符号考虑整个实数域。
这7个不变矩构成一组特征量,Hu.M.K在1962年证明了他们具有旋转,缩放和平移不变性。
Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述得比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。
2 关于Zernike不变矩
2.1Zernike不变矩简介
Zernike矩是基于Zernike多项式的正交化函数,所利用的正交多项式集是1个在单位圆内的完备正交集。
Zernike矩是复数矩,一般把Zernike矩的模作为特征来描述物体形状。
1个目标对象的形状特征可以用1组很小的Zernike矩特征向量很好的表示,低阶矩特征向量描述的是1幅图像目标的整体形状,高阶矩特征向量描述的是图像目标的细节。
2.2Zernike多项式数学描述
2.3Zernike的特点
1)当计算1幅图像的Zernike矩时,以该图像的形心(也称作重心)为原点,把像素坐标映射到单位圆内。
2)Zernike 矩是一组正交矩,具有旋转不变性的特性,即旋转目标并不改变其模值。
3)低阶矩特征向量描述的是1幅图像目标的整体形状,高阶矩特征向量描述的是图像目标的细节。
4)通过标准矩来归一化的图像,可以做到平移和尺度不变性。
2.4应用
由于Zernike矩是用来描述图像目标的几何形状信息,所以Zernike图像矩可应用于手势识别、形状识别、图像分类等几何形状明显的特征物。
但是不能用来识别丰富的纹理信息的物体。