图像轮廓匹配

(1)普通矩:
图像概率密度分布函数为f(x,y)的二维连续随机函数的p+q阶原点矩m_pq

各阶矩的物理意义:
0阶矩(m_00)-----------------为目标区域的质量
1阶矩(m_01,m_10)------------表示目标区域的质心
2阶矩(m_02,m_11,m_20)-------表示旋转半径
3阶矩(m_03,m_12,m_21,m_30)--描述目标的方位和斜度,反应目标的扭曲程度

    但矩要能够作为一种特征描述方法得到运用,其要与目标的空间变换(平移、尺度、旋转)无关。因此在几何矩的基本定义基础上,进一步构造平移不变、尺度不变、旋转不变矩阵。
(2)中心矩:构造平移不变性
质心坐标:
为使矩具有平移不变性,利用质心坐标构造中心矩:

(3)归一化中心矩:构造尺度不变性
为抵消尺度变化对中心矩的影响,用零阶中心矩μ_00(表示面积)对其余各阶中心矩进行归一化处理,得到归一化中心矩为

(4)hu矩:构造旋转不变性

    这样七个矩(可以理解为七个数值)构成了一个七维向量,即:我们可以用一个七维向量来描述一个图像或轮廓,这个向量具有以上三种不变性。
    由Hu矩组成的特征量对图片进行识别,优点就是速度很快,缺点是识别率比较低,Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述得比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。

OpenCV中实现:
普通矩、中心矩和hu矩的计算
  1. void cvMoments( const CvArr* arr, CvMoments* moments, int binary V_DEFAULT(0));  
  2. //arr:图像(1-通道或3-通道,有COI设置)或多边形(点的CvSeq或一族点的向量)  
  3. //moments:返回矩状态接口的指针  
  4. //binary:(仅对图像)如果标识为非零,则所有零像素点为0,其它的被看成1  
  5. /*函数cvMoments 计算最高达三阶的空间和中心矩,并且将结果存在结构moments 中、矩用来计算形状的重心、面积、主轴和其它形状特征,如 7Hu 不变量等*/  
  6.   
  7. void cvGetHuMoments( CvMoments* moments, CvHuMoments* hu_moments );  
  8. //moments:返回矩状态接口的指针  
  9. //hu_moments:矩阵结构的指针  
代码如下:
  1. #include "stdafx.h"  
  2. #include "cv.h"  
  3. #include "highgui.h"  
  4. #include "cxcore.h"  
  5. #include "cvaux.h"  
  6.   
  7. int main(int argc, char* argv[])  
  8. {  
  9.     //产生一幅图像  
  10.     IplImage* src;  
  11.     src = cvCreateImage(cvSize(10,10),8,1);  
  12.     //图像初始值清零  
  13.     cvZero(src);  
  14.     //图像的前面5行5列赋值为255  
  15.     for(int yy=0;yy<5;yy++)  
  16.     {  
  17.         for(int xx=0;xx<5;xx++)  
  18.         {  
  19.             cvSetReal2D(src,yy,xx,255);  
  20.         }  
  21.     }  
  22.   
  23.     double m00,m10,m01;  
  24.   
  25.     //定义矩变量  
  26.     CvMoments moment;  
  27.     //计算原始矩和中心矩  
  28.     cvMoments(src,&moment,2);  
  29.   
  30.     m00 = cvGetSpatialMoment(&moment,0,0);  
  31.     m10 = cvGetSpatialMoment(&moment,1,0);  
  32.     m01 = cvGetSpatialMoment(&moment,0,1);  
  33.   
  34.     //计算质心坐标  
  35.     float x = (float)(m10/m00);  
  36.     float y = (float)(m01/m00);  
  37.   
  38.     //定义hu矩变量  
  39.     CvHuMoments humoment;  
  40.   
  41.     //计算hu矩  
  42.     cvGetHuMoments(&moment,&humoment);  
  43.   
  44.     return 0;  
  45. }  

轮廓匹配
  1. double cvMatchShapes( const void* object1, const void* object2,  
  2. int method, double parameter CV_DEFAULT(0));  
  3. //object1:第一个轮廓或灰度图像  
  4. //object2:第二个轮廓或灰度图像  
  5. //method:比较方法  
  6. //parameter:比较方法的参数  
代码如下:
  1. #include "stdafx.h"  
  2. #include "highgui.h"  
  3. #include "cv.h"  
  4. #include "cxcore.h"  
  5.   
  6. /* 
  7. *函数功能:获取输入图像 的轮廓 
  8. *输入:  
  9. *srcIn : 单通道图像 
  10. *返回: 
  11. *CvSeq* : 存储轮廓信息 
  12. */  
  13. CvSeq* getImageContour(IplImage* srcIn)  
  14. {  
  15.     IplImage* src;  
  16.     src = cvCreateImage(cvGetSize(srcIn),8,1);    
  17.     //拷贝图像   
  18.     cvCopy(srcIn,src);  
  19.     //创建空间  
  20.     CvMemStorage* mem = cvCreateMemStorage(0);  
  21.     CvSeq* seq;  
  22.     if(!mem)  
  23.     {  
  24.         printf("mem is null");  
  25.     }  
  26.     //二值化图像  
  27.     cvThreshold(src,src,100,255,0);  
  28.     //计算图像轮廓  
  29.     cvFindContours(src,mem,&seq);//,sizeof(CvContour),CV_RETR_CCOMP);  
  30.     //释放图像空间  
  31.     cvReleaseImage(&src);  
  32.     //返回轮廓信息  
  33.     return seq;  
  34. }  
  35.   
  36.   
  37. int main(int argc, char* argv[])  
  38. {  
  39.     //加载图像1  
  40.     IplImage* src1 = cvLoadImage("lena.jpg", 0);  
  41.     //获取图像1的轮廓  
  42.     CvSeq* contour1;  
  43.     contour1 = getImageContour(src1);  
  44.   
  45.     //加载图像2  
  46.     IplImage* src2 = cvLoadImage("char2.png",CV_LOAD_IMAGE_GRAYSCALE);  
  47.     //获取图像2的轮廓  
  48.     CvSeq* contour2;  
  49.     contour2 = getImageContour(src2);  
  50.   
  51.     //进行比对  
  52.     double result;  
  53.     result = cvMatchShapes(contour1,contour2,1);  
  54.     //输出结果  
  55.     printf("result is %f \n",result);  
  56.     getchar();  
  57.   
  58.     //释放轮廓存储空间  
  59.     cvReleaseMemStorage(&contour1->storage);  
  60.     cvReleaseMemStorage(&contour2->storage);  
  61.     //释放图像空间  
  62.     cvReleaseImage(&src1);  
  63.     cvReleaseImage(&src2);  
  64.   
  65.     return 0;  
  66. }  

原文地址:http://blog.csdn.net/cp32212116/article/details/38374015
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值