Hu矩图像轮廓匹配

1.1普通矩的计算

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

各阶矩的物理意义:

0阶矩(m00)为目标区域的质量

1阶矩(m01, m10)表示目标区域的质心

2阶矩(m02, m20, m11)表示旋转半径

3阶矩(m03, m30, m12, m21)描述目标的方位和斜度,反应目标的扭曲程度

但矩要能够作为和种特征描述方法得到应用,其要与目标的空间变换(平移,尺度,旋转)无关。因此在几何矩的基本定义基本上,进一步构造平移不变、尺度不变和旋转不变矩组。

1.2中心矩:构造平移不变性

质心坐标

为了使矩具有平移不变性,利用质心坐标,构造中心矩:

1.3归一化中心矩:构造尺度不变性

为抵消尺度变化对中心矩的影响,用零阶中心矩u00对其余各阶中心矩进行归一化处理,得到归一化中心矩为

1.4Hu矩:构造旋转不变性

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

1.5OpenCV的实现计算hu矩

1.5.1普通矩和中心矩的计算

void cvMoments(const CvArr* arr, CvMoments*moments, int binary=0);
//arr: 图像(1-通道或3-通道,有COI设置)或多边形(点的CvSeq或一族点的向量)
//moments: 返回的矩状态接口的指针
/*binary: (仅对图像)如果标识为非零,则所有零像素点被当成零,其它的被看成1 */
/*函数cvMoments计算最高达三阶的空间和中心矩,并且将结果存在结构moments中。矩用来计算形状的重心,面积,主轴和其它的形状特征,如7Hu不变量等。*/


void cvGetHuMoments(CvMoments* moments,CvHumoments* hu_moments);
//moments: 矩状态结构的指针
//hu_moments: 矩结构的指针

1.5.2范例

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "cvaux.h"
 
int main(int argc, char* argv[])
{
       //产生一幅图像
       IplImage*src;
       src= cvCreateImage(cvSize(10,10),8,1);
       //图像初始值清零
       cvZero(src);
       //图像的前面5行5列赋值为255
       for(intyy=0;yy<5;yy++)
       {
              for(intxx=0;xx<5;xx++)
              {
                     cvSetReal2D(src,yy,xx,255);
              }
       }
 
       doublem00,m10,m01;
 
       //定义矩变量
       CvMomentsmoment;
       //计算原始矩和中心矩
       cvMoments(src,&moment,2);
 
       m00= cvGetSpatialMoment(&moment,0,0);
       m10= cvGetSpatialMoment(&moment,1,0);
       m01= cvGetSpatialMoment(&moment,0,1);
 
       //计算质心坐标
       floatx = (float)(m10/m00);
       floaty = (float)(m01/m00);
 
       //定义hu矩变量
       CvHuMomentshumoment;
 
       //计算hu矩
       cvGetHuMoments(&moment,&humoment);
 
       return0;
} 

1.5.3轮廓匹配

double cvMatchShapes( const void* object1,const void* object2,
int method, double parameterCV_DEFAULT(0));
//object1:第一个轮廓或灰度图像
//object2:第二个轮廓或灰度图像
//method:比较方法
//parameter:比较方法的参数

1.5.4范例

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"
 
/*
*函数功能:获取输入图像 的轮廓
*输入:
*srcIn : 单通道图像
*返回:
*CvSeq* : 存储轮廓信息
*/
CvSeq* getImageContour(IplImage* srcIn)
{
       IplImage*src;
       src= cvCreateImage(cvGetSize(srcIn),8,1);
       //拷贝图像
       cvCopy(srcIn,src);
       //创建空间
       CvMemStorage*mem = cvCreateMemStorage(0);
       CvSeq*seq;
       if(!mem)
       {
              printf("memis null");
       }
       //二值化图像
       cvThreshold(src,src,100,255,0);
       //计算图像轮廓
       cvFindContours(src,mem,&seq);//,sizeof(CvContour),CV_RETR_CCOMP);
       //释放图像空间
       cvReleaseImage(&src);
       //返回轮廓信息
       returnseq;
}
 
 
int main(int argc, char* argv[])
{
       //加载图像1
       IplImage*src1 = cvLoadImage("lena.jpg", 0);
       //获取图像1的轮廓
       CvSeq*contour1;
       contour1= getImageContour(src1);
 
       //加载图像2
       IplImage*src2 = cvLoadImage("char2.png",CV_LOAD_IMAGE_GRAYSCALE);
       //获取图像2的轮廓
       CvSeq*contour2;
       contour2= getImageContour(src2);
 
       //进行比对
       doubleresult;
       result= cvMatchShapes(contour1,contour2,1);
       //输出结果
       printf("resultis %f \n",result);
       getchar();
 
       //释放轮廓存储空间
       cvReleaseMemStorage(&contour1->storage);
       cvReleaseMemStorage(&contour2->storage);
       //释放图像空间
       cvReleaseImage(&src1);
       cvReleaseImage(&src2);
 
       return0;
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hu是一种对图像进行形状匹配的方法,它是一组可旋转、平移和缩放不变的图像特征。在Python中,我们可以使用OpenCV库来计算Hu,以下是Hu轮廓匹配的基本步骤: 1. 读取待匹配图像和模板图像,并进行灰度化。 2. 对待匹配图像和模板图像进行二值化处理。 3. 使用findContours()函数找到待匹配图像和模板图像的轮廓。 4. 计算待匹配图像和模板图像的Hu。 5. 使用matchShapes()函数计算待匹配图像和模板图像的形状相似度。 下面是一个示例代码,演示了如何使用OpenCV计算Hu并进行轮廓匹配: ```python import cv2 # 读取待匹配图像和模板图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 灰度化 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 二值化 ret1, thresh1 = cv2.threshold(gray1, 127, 255, cv2.THRESH_BINARY) ret2, thresh2 = cv2.threshold(gray2, 127, 255, cv2.THRESH_BINARY) # 轮廓提取 contours1, hierarchy1 = cv2.findContours(thresh1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) contours2, hierarchy2 = cv2.findContours(thresh2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # 计算Hu moments1 = cv2.moments(contours1[0]) hu1 = cv2.HuMoments(moments1).flatten() moments2 = cv2.moments(contours2[0]) hu2 = cv2.HuMoments(moments2).flatten() # 计算形状相似度 match_value = cv2.matchShapes(contours1[0], contours2[0], cv2.CONTOURS_MATCH_I1, 0) # 输出结果 print('Hu moments of image1:', hu1) print('Hu moments of image2:', hu2) print('Match value:', match_value) ``` 在上面的示例代码中,我们首先读取了两张图像并进行了灰度化和二值化处理,然后使用findContours()函数找到了两张图像的轮廓。接着,我们分别计算了两张图像的Hu,并使用matchShapes()函数计算了它们的形状相似度。最后,我们输出了Hu和形状相似度的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值