《Hu矩阵(13页).doc》由会员分享,可在线阅读,更多相关《Hu矩阵(13页).doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、- Hu矩阵:旋转,缩放和平移不变性。(1)hu矩的概念在连续情况下,图像函数为,那么图像的p+q阶几何矩(标准矩)定义为:p+q阶中心距定义为:其中和代表图像的重心,对于离散的数字图像,采用求和号代替积分:和分别是图像的高度和宽度;归一化的中心距定义为:;其中利用二阶和三阶归一化中心矩构造了7个不变矩:这7个不变矩构成一组特征量,Hu.M.K在1962年证明了他们具有旋转,缩放和平移不变性。实际上,在对图片中物体的识别过程中,只有和不变性保持的比较好,其他的几个不变矩带来的误差比较大,有学者认为只有基于二阶矩的不变矩对二维物体的描述才是真正的具有旋转、缩放和平移不变性(和刚好都是由二阶矩组成
2、的)。不过我没有证明是否是真的事这样的。由Hu矩组成的特征量对图片进行识别,优点就是速度很快,缺点是识别率比较低,我做过手势识别,对于已经分割好的手势轮廓图,识别率也就30%左右,对于纹理比较丰富的图片,识别率更是不堪入眼,只有10%左右。这一部分原因是由于Hu不变矩只用到低阶矩(最多也就用到三阶矩),对于图像的细节未能很好的描述出来,导致对图像的描述不够完整。Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述得比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。(2)opencv 的实现计算hu矩普通矩和中心矩的计算Void cvMome
3、nts(const CvArr*arr,CvMoments*moments, int binary = 0)arr:图像(1-通道或3通道,有COI设置)或者多边形(点的CvSeq或一族点的向量)moments:返回矩阵态度接口的指针binary(仅对图像)如果标识为非0,则所有零像素点被当成零,其它的被看成1.Double cvGetSpatialMoment(&moment, p, q);/得到普通矩Double cvGetCentralMoment(&moment, p, q);/ 得到中心矩计算hu矩Void cvGetHuMoment(CvMoments *moment,CvHuMo
4、ments *humoment)代码:1. IplImage*src=cvCreateImage(cvSize(10,10),8,1);2. cvZero(src);3. for(intyy=0;yy5;yy+)4. 5. for(intxx=0;xx5;xx+)6. 7. cvSetReal2D(src,yy,xx,255);8. 9. 10. doublem00,m10,m01;11. CvMomentsmoment;12. cvMoments(src,&moment,2);/第三个像素点非0,则所有的0像素点被当做0,非0像素点被当做113. m00=cvGetSpatialMoment
5、(&moment,0,0);/得到普通矩14. m10=cvGetSpatialMoment(&moment,1,0);15. m01=cvGetSpatialMoment(&moment,0,1);16. doubleu20;17. u20=cvGetCentralMoment(&moment,2,0);/得到中心矩18. CvHuMomentshumoment;19. cvGetHuMoments(&moment,&humoment);20. doublehu1=humoment.hu1;/得到hu矩21. couthu1endl;OPENCV还提供了输入图像直接进行hu矩匹配的函数,返回
6、的是两个图像或轮廓之间hu矩的相似度:double cvMatchShapes(const void*object1,const void*object2,int method,doubleparameter=0);计算两个轮廓之间hu矩相似程度:cpp1. #include2. #includecv.h3. #includecxcore.h4. #includehighgui.h5. usingnamespacestd;6. 7. CvSeq*getImageContours(CvArr*src)8. 9. cvThreshold(src,src,100,255,CV_THRESH_BINA
7、RY);10. CvMemStorage*storage=cvCreateMemStorage(0);11. CvSeq*contours;12. cvFindContours(src,storage,&contours);13. returncontours;14. 15. intmain()16. 17. IplImage*src1=cvLoadImage(,0);18. CvSeq*contours1=getImageContours(src1);/得到src1的轮廓19. IplImage*src2=cvLoadImage(,0);20. CvSeq*contours2=getImag
8、eContours(src2);21. doubleresult=cvMatchShapes(contours1,contours2,1);/根据输入的图像或轮廓来计算它们的hu矩的相似度22. coutresultstorage);24. cvReleaseMemStorage(&contours1-storage);25. cvReleaseImage(&src1);26. cvReleaseImage(&src2);27. return0;28. (3)案例:给出了10副图片,其中2.jpg和11.jpg非常相似,我们代码是要实现的在311.jgp找到与2.jpg最相似的图片。代码:cp
9、p1. #include2. #include3. #include4. #includecv.h5. #includecxcore.h6. #includehighgui.h7. usingnamespacestd;8. 9. intmain()10. 11. IplImage*srcColor=cvLoadImage(E:study_opencv_videolesson15_32.jpg,1);12. IplImage*src=cvCreateImage(cvGetSize(srcColor),8,1);13. cvCvtColor(srcColor,src,CV_BGR2GRAY);14
10、. if(!src)15. 16. coutNoImageLoadendl;17. 18. inti;19. stringstreamss;20. stringpath;21. stringstr;22. IplImage*dst=NULL,*dstColor;23. charc256;24. doubleresult,maxResult=1000*256*256;25. IplImage*resultMap=NULL;26. for(i=3;i12;i+)27. 28. path=E:study_opencv_videolesson15_3;29. ss.clear();30. ssstr;
11、32. str+=.jpg;33. path+=str;34. ss.clear();35. ssc;37. dstColor=cvLoadImage(c,1);38. dst=cvCreateImage(cvGetSize(dstColor),8,1);39. cvCvtColor(dstColor,dst,CV_BGR2GRAY);40. result=cvMatchShapes(src,dst,1);41. if(maxResultresult)42. 43. resultMap=cvCreateImage(cvGetSize(dstColor),8,3);44. maxResult=r
12、esult;45. cvCopy(dstColor,resultMap);46. 47. 48. cvNamedWindow(srcColor,0);49. cvNamedWindow(resultMap,0);50. cvShowImage(resultMap,resultMap);51. cvShowImage(srcColor,srcColor);52. cvWaitKey(0);53. cvReleaseImage(&src);54. cvReleaseImage(&srcColor);55. cvReleaseImage(&dst);56. cvReleaseImage(&dstColor);57. cvReleaseImage(&resultMap);58. cvDestroyWindow(srcColor);59. cvDestroyWindow(resultMap);60. return0;61. 第 15 页-