精华内容
下载资源
问答
  • 对电力工程图纸进行矢量化的前提是正确...对原有的 HU不变距进行了修正,用于对常见电力图元的特征提取,通过 MATLAB编程得出提取的各个向 量。实验结果表明,改进的 HU不变矩具有良好的旋转、平移和缩放( RTS)不变性。
  • Hu不变距 OpenCV中计算Hu矩的公式为:   OpenCV计算矩的函数 OpenCV计算矩moments的函数 空间矩10个 OpenCV中计算Hu矩函数: 中心矩/归一化中心矩(7个) 示例程序 轮廓匹配/形状匹配 利用matchShape函数...

    目录

    矩的概念介绍

    空间矩,中心矩,中心归一化矩,Hu矩

    空间矩的公式为:

    中心矩的公式为:

    归一化的中心矩公式为

    Hu不变距

    OpenCV中计算Hu矩的公式为:

     

    OpenCV计算矩的函数

    OpenCV计算矩moments的函数

    空间矩10个

    OpenCV中计算Hu矩函数:

    中心矩/归一化中心矩(7个)

    示例程序

    轮廓匹配/形状匹配

    利用matchShape函数比较两个轮廓

    matchShapes函数第三个参数说明


    矩的概念介绍

           矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、目标识别与方位估计、图像的编码与重构等。从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的几何特征信息,如大小,位置、方向和形状等。图像矩这种描述能力广泛应用于各种图像处理、计算机视觉和机器人技术领域的目标识别与方位估计中。

    一阶矩:与形状有关;

    二阶矩:显示曲线围绕直线平均值的扩展程度;

    三阶矩:关于平均值的对称性测量;

    由二阶矩和三阶矩可以导出7个不变矩。而不变矩是图像的统计特性,满足平移、伸缩、旋转均不变的不变性、在图像识别领域得到广泛的应用。

     

    参考opencv官网 https://docs.opencv.org/3.3.0/d8/d23/classcv_1_1Moments.html

    空间矩,中心矩,中心归一化矩,Hu矩

    在OpenCV中,可以很方便的计算多边形区域的3阶特征矩,opencv中的矩主要包括以下几种:空间矩,中心矩和中心归一化矩。

    参考https://docs.opencv.org/3.3.0/d8/d23/classcv_1_1Moments.html

    class Moments { public: ......

    // 空间矩 double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;

    // 中心矩 double mu20, mu11, mu02, mu30, mu21, mu12, mu03;

    // 中心归一化矩 double nu20, nu11, nu02, nu30, nu21, nu12, nu03; }

    1 、空间矩/几何矩

           空间矩的实质为面积或者质量。可以通过一阶矩计算质心/重心。

    2、中心矩

            中心矩体现的是图像强度的最大和最小方向(中心矩可以构建图像的协方差矩阵),其只具有平移不变性,所以用中心矩做匹配效果不会很好。

    3、归一化的中心矩

          归一化后具有尺度不变性。

    4、Hu矩

    Hu矩由于具有尺度、旋转、平移不变性,可以用来做匹配。

     

    空间矩的公式为:

    可以知道,对于01二值化的图像,m00即为轮廓的面积。

    中心矩的公式为:

    其中:
    

    归一化的中心矩公式为

    注意

    ,因此不会存储值。(由二阶矩和三阶矩可以导出7个不变矩)

    轮廓的矩以相同的方式定义,但使用格林公式计算(参见http://en.wikipedia.org/wiki/Green_theorem )。 因此,由于光栅分辨率有限,为轮廓计算的力矩与为相同光栅化轮廓计算的力矩略有不同。

    注意

    由于轮廓矩是使用格林公式the Green's formula (see http://en.wikipedia.org/wiki/Green_theorem)公式计算的,因此对于具有自交叉的轮廓,您可能会得到看似奇怪的结果,例如,对于蝴蝶形轮廓,零区域(m00).

    Hu不变距

    矩的基本概念可参考:在OpenCV中,还可以很方便的得到Hu不变距,Hu不变矩在图像旋转、缩放、平移等操作后,仍能保持矩的不变性,所以有时候用Hu不变距更能识别图像的特征。Hu不变矩的基本概念请参考paper:Hu. Visual Pattern Recognition by Moment Invariants, IRE Transactions on Information Theory, 8:2, pp. 179-187, 1962, 或者参考中文介绍:http://www.cnblogs.com/skyseraph/archive/2011/07/19/2110183.html

    Hu矩由于具有尺度、旋转、平移不变性,可以用来做匹配。

    OpenCV中计算Hu矩的公式为:

    Hu不变矩主要是利用归一化中心矩构造了7个不变特征矩,由二阶矩和三阶矩可以导出7个不变矩

    image

     

    OpenCV计算矩的函数

    OpenCV计算矩moments的函数

    一阶矩:与形状有关;二阶矩:显示曲线围绕直线平均值的扩展程度;三阶矩:关于平均值的对称性测量;

    OpenCV中计算矩的函数为:Moments moments(InputArray array, bool binaryImage=false )

    Moments (double m00, double m10, double m01, double m20, double m11, double m02, double m30, double m21, double m12, double m03)

    空间矩10个

     

    OpenCV中计算Hu矩函数:

    HuMoments(const Moments& m, OutputArray hu)

    void HuMoments(const Moments& moments, double hu[7])

    中心矩/归一化中心矩(7个)

    由二阶矩和三阶矩可以导出7个不变矩

    利用归一化中心矩构造了7个不变特征矩.由二阶矩和三阶矩可以导出7个不变矩

    示例程序

    下面的代码计算轮廓的矩,并根据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 );
        }

    程序执行后效果图:

    imageimage

    轮廓匹配/形状匹配

    利用matchShape函数比较两个轮廓

    最后我们再利用matchShape函数比较两个轮廓,如果结果为0,表示两个轮廓完全相似,结果值越大,越不相似,但这个最大值好像并没有归一化,我曾经比较两个轮廓,结果值达到了10。

    image

     

    比较的代码为:

    double comres;
    comres = matchShapes(contours[0], contours[1],CV_CONTOURS_MATCH_I1, 0.0);
    printf("CV_CONTOURS_MATCH_I1 比较结果是: %f\n", comres);
    comres = matchShapes(contours[0], contours[1],CV_CONTOURS_MATCH_I2, 0.0);
    printf("CV_CONTOURS_MATCH_I2 比较结果是: %f\n", comres);
    comres = matchShapes(contours[0], contours[1],CV_CONTOURS_MATCH_I3, 0.0);
    printf("CV_CONTOURS_MATCH_I3 比较结果是: %f\n", comres);

    matchShapes函数第三个参数说明

    matchShapes函数其实比较的是两个轮廓的Hu不变矩,第三个参数决定比较的方式,下面是第三个参数的三个可选值。

    Moment矩,Hu不变矩,轮廓匹配/形状匹配 -1 

    Moment矩,轮廓特征,轮廓匹配,形状匹配 -2

    展开全文
  • 图像处理,计算形状参数,hu不变矩,并且有特定区域检测
  • 获取图像的Hu不变

    千次阅读 2019-04-22 18:23:05
    使用C++、opencv获取图像的Hu不变矩 矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、目标识别与方位估计、图像编码与重构等。一个从一幅数字图形中计算出来的矩集,通常描述了该图像形状的全局特征,并...

    使用C++、opencv获取图像的Hu不变矩

            矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、目标识别与方位估计、图像编码与重构等。一个从一幅数字图形中计算出来的矩集,通常描述了该图像形状的全局特征,并提供了大量的关于该图像不同类型的几何特性信息,比如大小、位置、方向及形状等。图像矩的这种特性描述能力被广泛地应用在各种图像处理、计算机视觉和机器人技术领域的目标识别与方位估计中。一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩则是关于平均值的对称性的测量。由二阶矩和三阶矩可以导出一组共7个不变矩。而不变矩是图像的统计特性,满足平移、伸缩、旋转均不变的不变性,在图像识别领域得到了广泛的应用。

    总结:Hu不变矩是图像的一组特征参数,主要用来描述形状,并具有平移、伸缩、旋转均不变的不变性,可用于图像分类、识别。

    关于Hu不变矩的更详细原理、计算方法可以参考:https://www.cnblogs.com/ronny/p/3985810.htmlhttps://www.cnblogs.com/mikewolf2002/p/3427564.html


    opencv中关于图像的矩的相关API:

    Moments moments(InputArray array, bool binary Image=false)

    moments0函数用于计算多边形和光栅形状的最高达三阶的所有矩。矩用来计算形状的重心、面积,主轴和其他形状特征,如7Hu不变量等。
    第一个参数,InputArray类型的aray,输入参数,可以是光栅图像(单通道,8位或浮点的二维数组)或二维数组(1N或N1)
    第二个参数,bool类型的 binaryImage,有默认值 false。若此参数取true则所有非零像素为1。此参数仅对于图像使用。
    需要注意的是,此参数的返回值返回运行后的结果。

    -----------------------------------------------------------------------

    void HuMoments(const Moments& moments, double hu[7])

    第一个参数,const Moments引用类型的moments是图像的矩,由上面的moments0函数求得。

    第二个参数,输出的是double类型的数组hu[7],即图像的7个不变矩。


    代码实现:

    #include "stdafx.h"
    #include <opencv2/opencv.hpp>  
    #include <iostream>  
    #include <math.h> 
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
    	system("color 02");
    
    	//读取、显示图像
    	Mat src_image = imread("D:\\4.jpg");
    	if (!src_image.data)
    	{
    		cout << "src image load failed!" << endl;
    		return -1;
    	}
    	namedWindow("原图", WINDOW_NORMAL);
    	imshow("原图", src_image);
    
    	/*此处高斯去燥有助于后面二值化处理的效果*/
    	Mat blur_image;
    	GaussianBlur(src_image, blur_image, Size(3, 3), 0, 0);
    	imshow("GaussianBlur", blur_image);
    
    	/*灰度变换与二值化*/
    	Mat gray_image, binary_image;
    	cvtColor(blur_image, gray_image, COLOR_BGR2GRAY);
    	threshold(gray_image, binary_image, 20, 255, THRESH_BINARY);
    	imshow("binary", binary_image);
    
    	/*形态学闭操作*/
    	Mat morph_image;
    	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
    	morphologyEx(binary_image, morph_image, MORPH_CLOSE, kernel, Point(-1, -1), 2);
    	imshow("morphology", morph_image);
    
    	/*查找外轮廓并计算周长、面积、圆形度*/
    	vector< vector<Point> > contours;
    	vector<Vec4i> hireachy;
    	findContours(binary_image, contours, hireachy, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE, Point());
    	Mat result_image = Mat::zeros(src_image.size(), CV_8UC3);
    	int l;
    	double len, area;
    	for (size_t t = 0; t < contours.size(); t++)
    	{
    		/*过滤掉小的干扰轮廓*/
    		Rect rect = boundingRect(contours[t]);
    		if (rect.width < src_image.cols / 2)
    			continue;
    		//if (rect.width >(src_image.cols - 20))
    		l = t;
    		drawContours(result_image, contours, static_cast<int>(t), Scalar(255, 255, 255), 1, 8, hireachy);
    	}
    	namedWindow("lunkuo", WINDOW_NORMAL);
    	imshow("lunkuo", result_image);
    	
    	Moments mom;
    	mom = moments(contours[l],false);
    	double hu[7];
    	HuMoments(mom,hu);
    
    	for (int j = 0; j < 7; j++)
    	{
    		cout << hu[j] << "\t";
    	}
    
    	//写入文档
    	/*FILE *fp = fopen("D:\\1.xlsx", "a");
    	for (int k = 0; k < 7; k++)
    	{
    		fprintf(fp, "%.11lf\t", hu[k]);
    	}
    	fprintf(fp, "\n");
    	fclose(fp);*/
    
    	waitKey();
    	return 0;
    }

    注:本代码适用于目标物体已大致分割出来或很容易分割出来,并且一幅图像中只有一个目标物体的情况,否则需要先进行图像分割操作。

    源图像及代码中相关操作的图像:

    计算得到的7个不变矩:

    部分参考: 毛星云 《OpenCV3编程入门》 

    展开全文
  • 学习HU不变

    2017-03-09 15:54:00
    参考博客地址: 1、http://blog.csdn.net/chenhezhuyan/article/details/8093585 ... 一、几何矩由HU在1962年提出,了解以下三个概念 1、普通矩(也叫 p+q 阶不变矩),和p+q 阶中心矩的定...

    参考博客地址:

    1、http://blog.csdn.net/chenhezhuyan/article/details/8093585

     2、http://blog.csdn.net/yangyangyang20092010/article/details/8712742

     

    一、几何矩由HU在1962年提出,了解以下三个概念

    1、普通矩(也叫 p+q 阶不变矩),和p+q 阶中心矩的定义

    对于数字图像,离散化得到:

    PS:直接用普通矩或中心矩进行特征表示,不能使特征同时具有平移、旋转和比例不变性

    2、归一化中心矩定义

     

    PS:如果利用归一化中心矩,则特征不仅具有平移不变性,而且还具有比例不变性

     

    二、HU矩定义

          HU矩利用二阶和三阶归一化中心矩构造了7个不变矩,他们在连续图像条件下可保持平移、缩放和旋转不变,具体定义如下:

              

     

                                                                                                                 

    网上找到两种公式,加减符号不同的地方以右边M1~M7为准。

     3、博采众长

         实际上,在对图片中物体的识别过程中,只有 和 不变性保持的比较好,其他的几个不变矩带来的误差比较大,有学者认为只有基于二阶矩的不变矩对二维物体的描述才是真正的具有旋转、缩放和平移不变性( 和 刚好都是由二阶矩组成的)。

          由Hu矩组成的特征量对图片进行识别,优点就是速度很快,缺点是识别率比较低。

           Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述得比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。

    4、代码实现

     
    1、C语言实现
    1//*****************************************************************// 2 double M[7] = {0}; //HU不变矩 3 bool HuMoment(IplImage* img) 4 { 5 int bmpWidth = img->width; 6 int bmpHeight = img->height; 7 int bmpStep = img->widthStep; 8 int bmpChannels = img->nChannels; 9 uchar*pBmpBuf = (uchar*)img->imageData; 10 11 double m00=0,m11=0,m20=0,m02=0,m30=0,m03=0,m12=0,m21=0; //中心矩 12 double x0=0,y0=0; //计算中心距时所使用的临时变量(x-x') 13 double u20=0,u02=0,u11=0,u30=0,u03=0,u12=0,u21=0;//规范化后的中心矩 14 //double M[7]; //HU不变矩 15 double t1=0,t2=0,t3=0,t4=0,t5=0;//临时变量, 16 //double Center_x=0,Center_y=0;//重心 17 int Center_x=0,Center_y=0;//重心 18 int i,j; //循环变量 19 20 // 获得图像的区域重心(普通矩) 21 double s10=0,s01=0,s00=0; //0阶矩和1阶矩 22 for(j=0;j<bmpHeight;j++)//y 23 { 24 for(i=0;i<bmpWidth;i++)//x 25 { 26 s10+=i*pBmpBuf[j*bmpStep+i]; 27 s01+=j*pBmpBuf[j*bmpStep+i]; 28 s00+=pBmpBuf[j*bmpStep+i]; 29 } 30 } 31 Center_x=(int)(s10/s00+0.5); 32 Center_y=(int)(s01/s00+0.5); 33 34 // 计算二阶、三阶矩(中心矩) 35 m00=s00; 36 for(j=0;j<bmpHeight;j++) 37 { 38 for(i=0;i<bmpWidth;i++)//x 39 { 40 x0=(i-Center_x); 41 y0=(j-Center_y); 42 m11+=x0*y0*pBmpBuf[j*bmpStep+i]; 43 m20+=x0*x0*pBmpBuf[j*bmpStep+i]; 44 m02+=y0*y0*pBmpBuf[j*bmpStep+i]; 45 m03+=y0*y0*y0*pBmpBuf[j*bmpStep+i]; 46 m30+=x0*x0*x0*pBmpBuf[j*bmpStep+i]; 47 m12+=x0*y0*y0*pBmpBuf[j*bmpStep+i]; 48 m21+=x0*x0*y0*pBmpBuf[j*bmpStep+i]; 49 } 50 } 51 52 // 计算规范化后的中心矩: mij/pow(m00,((i+j+2)/2) 53 u20=m20/pow(m00,2); 54 u02=m02/pow(m00,2); 55 u11=m11/pow(m00,2); 56 u30=m30/pow(m00,2.5); 57 u03=m03/pow(m00,2.5); 58 u12=m12/pow(m00,2.5); 59 u21=m21/pow(m00,2.5); 60 61 // 计算中间变量 62 t1=(u20-u02); 63 t2=(u30-3*u12); 64 t3=(3*u21-u03); 65 t4=(u30+u12); 66 t5=(u21+u03); 67 68 // 计算不变矩 69 M[0]=u20+u02; 70 M[1]=t1*t1+4*u11*u11; 71 M[2]=t2*t2+t3*t3; 72 M[3]=t4*t4+t5*t5; 73 M[4]=t2*t4*(t4*t4-3*t5*t5)+t3*t5*(3*t4*t4-t5*t5); 74 M[5]=t1*(t4*t4-t5*t5)+4*u11*t4*t5; 75 M[6]=t3*t4*(t4*t4-3*t5*t5)-t2*t5*(3*t4*t4-t5*t5); 76 77 returntrue; 78 }
    ②调用OpenCV方法
    1 // 利用OpenCV函数求7个Hu矩 2 CvMoments moments; 3 CvHuMoments hu; 4 cvMoments(bkImgEdge,&moments,0); 5 cvGetHuMoments(&moments, &hu); 6 cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl; 7 cvMoments(testImgEdge,&moments,0); 8 cvGetHuMoments(&moments, &hu); 9 cout<<hu.hu1<<"/"<<hu.hu2<<"/"<<hu.hu3<<"/"<<hu.hu4<<"/"<<hu.hu5<<"/"<<hu.hu6<<"/"<<hu.hu7<<"/"<<"/"<<endl; ------------------------------------------------------------------------------------------------------------------------------- 三 相似性准则 ①法一 // 计算相似度1 double dbR =0; //相似度 double dSigmaST =0; double dSigmaS =0; double dSigmaT =0; double temp =0; {for(int i=0;i<8;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);

    PS:没看懂相似性准则   (记笔记于2017-03-09  15:54:24)

     

     

     

    转载于:https://www.cnblogs.com/liulijin/p/6526088.html

    展开全文
  • hu不变矩--python

    千次阅读 2018-06-08 16:12:08
    后续可能会利用Hu矩进行图片分类以及平移、旋转不变性的实验,有时间做的话到时候会放上来结果。 本篇博客内容参考图像的七个不变矩 可用于图像的匹配中的matlab代码,在其基础上进行修改而成。 #-*-coding:utf-...

    由于网上关于Hu矩的定义的内容较多,代码实现部分又多为matlab、C++或者opencv等,因此本文将主要介绍如何用python实现Hu矩的提取。后续可能会利用Hu矩进行图片分类以及平移、旋转不变性的实验,有时间做的话到时候会放上来结果。
    本篇博客内容参考图像的七个不变矩 可用于图像的匹配中的matlab代码,在其基础上进行修改而成。

    #-*-coding:utf-8-*-
    import cv2
    from datetime import datetime
    import numpy as np
    np.set_printoptions(suppress=True)
    
    def humoments(img_gray):
        '''
        由于7个不变矩的变化范围很大,为了便于比较,可利用取对数的方法进行数据压缩;同时考虑到不变矩有可能出现负值的情况,因此,在取对数之前先取绝对值
        经修正后的不变矩特征具有平移 、旋转和比例不变性
        '''
        # 标准矩定义为m_pq = sumsum(x^p * y^q * f(x, y))
        row, col = img_gray.shape
        #计算图像的0阶几何矩
        m00 = img_gray.sum()
        m10 = m01 = 0
        # 计算图像的二阶、三阶几何矩
        m11 = m20 = m02 = m12 = m21 = m30 = m03 = 0
        for i in range(row):
            m10 += (i * img_gray[i]).sum()
            m20 += (i ** 2 * img_gray[i]).sum()
            m30 += (i ** 3 * img_gray[i]).sum()
            for j in range(col):
                m11 += i * j * img_gray[i][j]
                m12 += i * j ** 2 * img_gray[i][j]
                m21 += i ** 2 * j * img_gray[i][j]
        for j in range(col):
            m01 += (j * img_gray[:, j]).sum()
            m02 += (j ** 2 * img_gray[:, j]).sum()
            m30 += (j ** 3 * img_gray[:, j]).sum()
        # 由标准矩我们可以得到图像的"重心"
        u10 = m10 / m00
        u01 = m01 / m00
        # 计算图像的二阶中心矩、三阶中心矩
        y00 = m00
        y10 = y01 = 0
        y11 = m11 - u01 * m10
        y20 = m20 - u10 * m10
        y02 = m02 - u01 * m01
        y30 = m30 - 3 * u10 * m20 + 2 * u10 ** 2 * m10
        y12 = m12 - 2 * u01 * m11 - u10 * m02 + 2 * u01 ** 2 * m10
        y21 = m21 - 2 * u10 * m11 - u01 * m20 + 2 * u10 ** 2 * m01
        y03 = m03 - 3 * u01 * m02 + 2 * u01 ** 2 * m01
        # 计算图像的归格化中心矩
        n20 = y20 / m00 ** 2
        n02 = y02 / m00 ** 2
        n11 = y11 / m00 ** 2
        n30 = y30 / m00 ** 2.5
        n03 = y03 / m00 ** 2.5
        n12 = y12 / m00 ** 2.5
        n21 = y21 / m00 ** 2.5
        # 计算图像的七个不变矩
        h1 = n20 + n02
        h2 = (n20 - n02) ** 2 + 4 * n11 ** 2
        h3 = (n30 - 3 * n12) ** 2 + (3 * n21 - n03) ** 2
        h4 = (n30 + n12) ** 2 + (n21 + n03) ** 2
        h5 = (n30 - 3 * n12) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n21 - n03) * (n21 + n03) \
            * (3 * (n30 + n12) ** 2 - (n21 + n03) ** 2)
        h6 = (n20 - n02) * ((n30 + n12) ** 2 - (n21 + n03) ** 2) + 4 * n11 * (n30 + n12) * (n21 + n03)
        h7 = (3 * n21 - n03) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n12 - n30) * (n21 + n03) \
            * (3 * (n30 + n12) ** 2 - (n21 + n03) ** 2)
        inv_m7 = [h1, h2, h3, h4, h5, h6, h7]
        inv_m7 = np.log(np.abs(inv_m7))
        return inv_m7
    
    if __name__ == '__main__':
        t1 = datetime.now()
        fp = '/home/mamq/images/3.jpg'
        img = cv2.imread(fp)
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        print humoments(img_gray)
        print datetime.now() - t1

    结果:

    [‘0.004757610794121051’, ‘1.0751006208352332e-05’, ‘5.069206342794947e-08’, ‘1.3770952298167658e-07’, ‘1.7004668315871364e-15’, ‘4.163184056113891e-10’, ‘1.1379424976439726e-14’]

    这是之前为取对数时的结果,取对数后七个矩之间差距较小,便于后续计算。
    

    运行耗时:3.79秒,相比zernike矩耗时较长。
    目前看来Hu矩提取出来的值都比较小,最小的甚至到了小数点后14位,看到网上也有人提出这个问题,不确定是否是代码的问题。


    写完这篇博客后,又尝试了下opencv自带的函数,代码与结果如下:

    #-*-coding:utf-8-*-
    import cv2
    from datetime import datetime
    import numpy as np
    
    def test(img):
        moments = cv2.moments(img)
        humoments = cv2.HuMoments(moments)
        # humoments = no.log(np.abs(humoments)) # 同样建议取对数
        print(humoments)
    
    if __name__ == '__main__':
        t1 = datetime.now()    
        fp = '/home/mamq/images/3.jpg'
        img = cv2.imread(fp)
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        test(img_gray)
        print datetime.now() - t1

    结果:

    [[1.58880283e-03]
    [1.30795119e-07]
    [6.01877793e-11]
    [7.45476806e-11]
    [4.34518625e-21]
    [1.69631118e-14]
    [2.46057599e-21]]

    运行耗时:0.13秒.
    对比:

    可以看出,opencv自带函数效率更高,耗时非常短,但两段代码使用的都是同一张图片,但结果相差较大,还是相信opencv吧,毕竟更权威,第一段代码仅供学习参考。但从结果中可以看出来,Hu矩的值都比较小,进行不同图片的对比时如何进行距离的度量是个问题。

    由于最近比较忙,这篇博客写的不够严谨,故仅供参考。


    以上,欢迎交流,禁止转载。

    展开全文
  • Hu不变矩原理及opencv实现

    千次阅读 2017-10-25 20:32:19
    几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移、旋转和尺度不变性。 在连续情况下,图像函数为 ,那么图像的p+q阶几何矩(标准矩)定义为:  
  • 本课题为基于MATLAB HU不变矩的树叶识别系统。通过计算各种树叶的几何特征,判断树叶属于什么类型。本设计可识别灵叶,枫叶,梧桐叶等等几种。带有人机GUI界面,可语音播报结果。...
  • 基于Hu距的匹配方式--OpenCV

    千次阅读 2019-01-09 20:29:00
    什么是图像的Hu不变距 使用OpenCV计算Hu距 计算相似两幅图 1.什么是图像距? 图像矩是图像像素强度的加权平均值。 让我们选择一个简单的例子来理解。 为简单起见,让我们考虑单通道二进制图像I.位置(x,y)处...
  • Hu距

    2014-12-30 09:15:23
    在连续情况下,图像函数为 ,那么图像的p+q...p+q阶中心定义为:   其中 和 代表图像的重心, 对于离散的数字图像,采用求和号代替积分:      和 分别是图像的高度和宽度; 归一化的中心定义为:  ;
  • 图像的局部特征研究--Hu不变

    万次阅读 2016-03-25 00:00:41
    对一幅图片进行判断是否由另一幅图片进行旋转平移等变换得来--Hu不变
  • Hu不变矩之定义及计算方法

    千次阅读 2017-03-19 20:39:11
    原文地址 ... 【图像算法OpenCV】几何不变矩--Hu矩 ... 几何矩是由Hu(Visual pattern recognition by moment invariants)在1962年提出的,具有平移、旋转和尺度不变性。 定义
  • 7个hu不变矩c++程序小试

    千次阅读 2011-01-04 08:59:00
     我使用OpenCV中的函数cvGetHumoments()计算7个hu不变矩时始终有错误,为了得到结果我自己用C++编写了一段计算7个hu不变矩的程序。 说明:图片必须是等边长的,即宽和高相等。****或许图片宽不能大于...
  • 图像-不变距

    2016-04-18 09:27:49
    不变矩的主要思想是使用对变换不敏感的基于区域的几个矩作为形状特征,Hu提出了7个这样的矩,在他工作的基础上出现了很多改进的版本。 图像的几何不变矩   矩特征主要表征了图像区域的几何特征,又称为几何矩, ...
  • 零阶矩一阶矩二阶矩三阶矩及以上二,中心矩三,Hu不变矩四, matlab代码 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器...
  • 图像不变性特征—hu

    万次阅读 2017-04-20 13:56:22
    图像的hu矩是一种具有平移、旋转和尺度不变性的图像特征。 普通矩的计算: f(x,y)的p+q阶原点矩可以表示为: 而数字图像是一个二维的离散信号,对上述公式进行离散化之后: 其中C与R分别表示图像的列与行。各阶...
  • 在连续情况下,图像函数为,那么图像的p+q阶几何矩(标准矩)定义为: ...p+q阶中心定义为: 其中和代表图像的重心, 对于离散的数字图像,采用求和号代替积分: 和分别是图像的高度和宽度; 归一...
  • 二值图像分析—Hu矩实现轮廓匹配

    千次阅读 2019-11-06 22:25:28
    在OpenCV中,可以很方便的得到Hu不变距,Hu矩在图像旋转、缩放、平移等操作后,仍能保持矩的不变性,所以有时候用Hu不变距更能识别图像的特征。 Hu矩由于具有尺度、旋转、平移不变性,可以用来做匹配。 Hu不变矩主要...
  • 转载本文请注明详细地址 本文介绍了矩和图像矩的含义 本文介绍了不变矩的计算、应用 本文介绍了如何计算图像相似度
  • 几何不变Hu

    2017-11-01 14:11:15
    几何不变Hu 矩 【原文部分转载】:http://blog.csdn.net/wrj19860202/archive/2011/04/16/6327094.aspx 在连续情况下,图像函数为 ,那么图像的p+q阶几何矩(标准矩)定义为:   p+q阶中心定义为...
  • 目录 ...2.1 Hu旋转不变性 2.2 实现步骤 2.2.1 分别计算图像二阶、、 2.2.2 利用得到的二阶计算图像偏转角度 2.2.3 利用仿射变换对图像进行旋转矫正 2.4 程序实现 系统环境 Windows 10 64...
  • 验证Hu矩的旋转不变

    千次阅读 2015-01-08 08:42:29
    Hu矩先由中心矩u_{pq}开始计算,因此具有平移不变性   接着将每个中心矩u_{ij}除以{u_{00}}^(1+\frac{i+j}{2}),因此其具有等比例尺度缩放不变性   下面用mathematica验证其旋转不变性,只考虑其中一个点v_i对每...
  • 根据图像的不变矩特征,应用BP神经网络实现了图像的模式识别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 385
精华内容 154
关键字:

hu不变距