HuMoments函数
一、-------------------------------------------------------------------HuMoments函數-------------------------------------------------------------------------------------------
1、函數作用:
利用圖像的矩,計算出圖像的不變矩,,,,,,圖像的不變矩不會因為圖像的旋轉 、縮放 、鏡像而變化,
通常用于圖像的識別,,,,這是圖像保持不變的一個特征。
圖像矩的公式:
Hu矩是從中心矩中計算得到。即七個由歸一化中心矩組合成的矩:??
?其中中心矩和歸一化中心矩的定義為:
?
?
在c語言中:
?? 我們可以使用cvContoursMoments函數、cvMoments函數方便的得到輪廓的矩集,然后再相應的方法或函數獲取各種矩。
??? 特定的矩:cvGetSpatialMoment函數
??? 中心矩:cvGetCentralMoment函數
??? 歸一化中心矩:cvGetNormalizedCentralMoment函數
??? Hu矩:cvGetHuMoments函數
C++:?void?HuMoments(const Moments&?m, OutputArray?hu)
C++:?void?HuMoments(const Moments&?moments, double?hu[7])
參數詳解:
const Moments&?m:第一個參數是圖像的矩
?OutputArray?hu:輸出的圖像的不變矩
3、opencv代碼
#include <cv.h> #include <cxcore.h> #include <highgui.h> #include <cvaux.h> #include <iostream> #include <string> #include <strstream> #include <iomanip> #include <cmath> using namespace std;void imRotate(IplImage *src,IplImage *dst,double angle , CvPoint2D32f center,double scale = 1 );int main() {time_t StartTime = clock();IplImage *src = cvLoadImage("f:\\images\\test1.bmp",CV_LOAD_IMAGE_GRAYSCALE);cvShowImage("src",src);CvMemStorage *storage = cvCreateMemStorage();CvSeq *contour = NULL;CvRNG rng = cvRNG(-1);while(1){double scalar = cvRandReal(&rng)*0.8;if(scalar < 0.3 )continue;double angle = cvRandReal(&rng)*360;IplImage *dst = cvCreateImage(cvSize(src->width,src->height),8,1);imRotate(src,dst,angle,cvPoint2D32f(src->width/2,src->height/2),scalar);cvShowImage("dst",dst);cvThreshold(dst,dst,100,255,CV_THRESH_BINARY);cvFindContours(dst,storage,&contour);CvMoments moments;CvHuMoments huMoments;cvMoments(dst,&moments,1);cvGetHuMoments(&moments, &huMoments);cout<<"("<<setprecision(3)<<dec<<scalar<<")"<<" ";for(int i = 0;i<7;++i){cout<<setiosflags(ios::scientific)<<setprecision(4)<<((double*)&huMoments)[i]<<' ';}cout<<endl;cvReleaseImage(&dst);cvClearSeq(contour);if(cvWaitKey() == 27)break;}time_t EndTime = clock();cout<<double(EndTime - StartTime)/CLOCKS_PER_SEC<<endl; }void imRotate(IplImage *src, IplImage *dst,double angle , CvPoint2D32f center,double scale) {assert(src->width == dst->width && src->height == dst->height &&src->depth == dst->depth &&src->nChannels == dst->nChannels);CvMat *mapMatrix = cvCreateMat(2,3,CV_32FC1);cv2DRotationMatrix(center,angle,scale,mapMatrix); //旋轉縮放為仿射變換,此處求變換矩陣cvWarpAffine(src,dst,mapMatrix); }
相似性準則
①法一
// 計算相似度1 double dbR =0; //相似度 double dSigmaST =0;double dSigmaS =0;double dSigmaT =0;double temp =0; {for(int i=0;i<7;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);
總結
以上是生活随笔為你收集整理的HuMoments函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: moments函数
- 下一篇: findContours函数