图像处理之图像特征:几何不变矩

编程入门 行业动态 更新时间:2024-10-22 19:49:12

<a href=https://www.elefans.com/category/jswz/34/1769353.html style=图像处理之图像特征:几何不变矩"/>

图像处理之图像特征:几何不变矩

一 原理

    几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移、旋转和尺度不变性。 定义如下:

① (p+q)阶不变矩定义:

② 对于数字图像,离散化,定义为:

 

③ 归一化中心矩定义:

④Hu矩定义

 



//#################################################################################//
double M[7] = {0};        //HU不变矩
bool HuMoment(IplImage* img)
{
int bmpWidth = img->width;
int bmpHeight = img->height;
int bmpStep = img->widthStep; 
int bmpChannels = img->nChannels;uchar*pBmpBuf = (uchar*)img->imageData;double m00=0,m11=0,m20=0,m02=0,m30=0,m03=0,m12=0,m21=0;  //中心矩 
double x0=0,y0=0;    //计算中心距时所使用的临时变量(x-x') 
double u20=0,u02=0,u11=0,u30=0,u03=0,u12=0,u21=0;//规范化后的中心矩
//double M[7];    //HU不变矩 
double t1=0,t2=0,t3=0,t4=0,t5=0;//临时变量, 
//double Center_x=0,Center_y=0;//重心 
int Center_x=0,Center_y=0;//重心 
int i,j;            //循环变量//  获得图像的区域重心(普通矩)
double s10=0,s01=0,s00=0;  //0阶矩和1阶矩  
for(j=0;j<bmpHeight;j++)//y{
for(i=0;i<bmpWidth;i++)//x{s10+=i*pBmpBuf[j*bmpStep+i];s01+=j*pBmpBuf[j*bmpStep+i];s00+=pBmpBuf[j*bmpStep+i];}}Center_x=(int)(s10/s00+0.5);Center_y=(int)(s01/s00+0.5);//  计算二阶、三阶矩(中心矩)m00=s00; 
for(j=0;j<bmpHeight;j++) {
for(i=0;i<bmpWidth;i++)//x { x0=(i-Center_x); y0=(j-Center_y); m11+=x0*y0*pBmpBuf[j*bmpStep+i]; m20+=x0*x0*pBmpBuf[j*bmpStep+i]; m02+=y0*y0*pBmpBuf[j*bmpStep+i]; m03+=y0*y0*y0*pBmpBuf[j*bmpStep+i];m30+=x0*x0*x0*pBmpBuf[j*bmpStep+i]; m12+=x0*y0*y0*pBmpBuf[j*bmpStep+i]; m21+=x0*x0*y0*pBmpBuf[j*bmpStep+i]; } } //  计算规范化后的中心矩: mij/pow(m00,((i+j+2)/2)u20=m20/pow(m00,2); u02=m02/pow(m00,2); u11=m11/pow(m00,2);u30=m30/pow(m00,2.5); u03=m03/pow(m00,2.5);u12=m12/pow(m00,2.5); u21=m21/pow(m00,2.5);//  计算中间变量t1=(u20-u02); t2=(u30-3*u12); t3=(3*u21-u03); t4=(u30+u12);t5=(u21+u03);//  计算不变矩 M[0]=u20+u02; M[1]=t1*t1+4*u11*u11; M[2]=t2*t2+t3*t3; M[3]=t4*t4+t5*t5;M[4]=t2*t4*(t4*t4-3*t5*t5)+t3*t5*(3*t4*t4-t5*t5); M[5]=t1*(t4*t4-t5*t5)+4*u11*t4*t5;M[6]=t3*t4*(t4*t4-3*t5*t5)-t2*t5*(3*t4*t4-t5*t5);returntrue;
}

下面的代码计算轮廓的矩,并根据1阶中心矩得到轮廓的质心,代码如下:

src = imread( "../star1.jpg" ,1 );/// Convert image to gray and blur it
cvtColor( src, src_gray, CV_BGR2GRAY );
blur( src_gray, src_gray, Size(3,3) );namedWindow( "image", CV_WINDOW_AUTOSIZE );
imshow( "image", src );Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;//利用canny算法检测边缘
Canny( src_gray, canny_output, thresh, thresh*2, 3 );
namedWindow( "canny", CV_WINDOW_AUTOSIZE );
imshow( "canny", canny_output );
//查找轮廓
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );//计算轮廓矩
vector<Moments> mu(contours.size() );
for( int i = 0; i < contours.size(); i++ ){ mu[i] = moments( contours[i], false ); }//计算轮廓的质心
vector<Point2f> mc( contours.size() );
for( int i = 0; i < contours.size(); i++ ){ mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); }//画轮廓及其质心
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ ){Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );circle( drawing, mc[i], 4, color, -1, 8, 0 );}namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
imshow( "Contours", drawing );//打印轮廓面积和轮廓长度
printf("\t Info: Area and Contour Length \n");
for( int i = 0; i< contours.size(); i++ ){printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) );Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );circle( drawing, mc[i], 4, color, -1, 8, 0 );}


更多推荐

图像处理之图像特征:几何不变矩

本文发布于:2024-03-09 15:07:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1725328.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:图像处理   几何   图像   特征

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!