矩、中心矩、质心、patch方向 您所在的位置:网站首页 如何求质心的位置 矩、中心矩、质心、patch方向

矩、中心矩、质心、patch方向

2024-06-02 18:54| 来源: 网络整理| 查看: 265

M20=∑x∑yx2·I(x,y)

M02=∑x∑yy2·I(x,y)

M11=∑x∑yx·y·I(x,y)

M20 和 M02 分别表示图像围绕通过重心的垂直和水平轴线的惯性矩。 M30 和 M03 可以度量图像对于垂直和水平轴线的对称性等。

物体形状的方向:

θ=arctan(b,(a−c))2=arctan(b/(a−c))2,θ∈[−90。,90。] 其中:

根据一阶矩的质心 C=(M10M00,M01M00) 有

a=M20M00−C20

b=2(M11M00−C0C1)

c=M02M00−C21

2、质心原理

在图像处理中,一阶矩与形状有关,二阶矩显示曲线围绕直线平均值到扩展程度,三阶矩是关于平均值到对称性到测量.由二阶矩和三阶矩可以导出一组共7个不变矩.而不变矩是图像到统计特性,满足平移,伸缩,旋转均不变到不变性.

moments of a patch(矩):

mpq=∑x=−r,y=−rrxpyqI(x,y)(1)

角点为中心:

m00=∑x=−r,y=−rrx0y0I(x,y)=∑x=−r,y=−rrI(x,y)(1-1)

一阶矩 m01 :

m01=∑x=−r,y=−rrx0y1I(x,y)=∑x=−r,y=−rry∗I(x,y)(1-2)

一阶矩 m10 :

m10=∑x=−r,y=−rrx1y0I(x,y)=∑x=−r,y=−rrx∗I(x,y)(1-3)

centroid(质心,亦可称为重心):

C=(m10m00,m01m00)(2) 计算质心的优势:对噪声不敏感。当有外部噪声干扰时,计算出的质心不会偏离太大。从数学的角度来看,这种方法是计算一个连通域的质心(或一个团块儿blob的质心)。

构造一个向量 OC−→− ,从角点中心 O 到质心C。

orientation of patch(方向):

θ=atan2(m01,m10)(3) 建立以角点为圆心的坐标系,如图这里写图片描述 在图中, P 为角点,园内为取点区域,每个方格代表一个像素。 则质心Q可根据式(2)求得。

3、中心距函数moments() moments()

Calculates all of the moments up to the third order of a polygon or rasterized shape.

C++: Moments moments(InputArray array, bool binaryImage=false )

Python: cv2.moments(array[, binaryImage]) → retval

C: void cvMoments(const CvArr* arr, CvMoments* moments, int binary=0 )

Python: cv.Moments(arr, binary=0) → moments

Parameters: array – Raster image (single-channel, 8-bit or floating-point 2D array) or an array ( 1 \times N or N \times 1 ) of 2D points (Point or Point2f ). binaryImage – If it is true, all non-zero image pixels are treated as 1’s. The parameter is used for images only. moments – Output moments.

The function computes moments, up to the 3rd order, of a vector shape or a rasterized shape. The results are returned in the structure Moments defined as: class Moments { public: Moments(); Moments(double m00, double m10, double m01, double m20, double m11, double m02, double m30, double m21, double m12, double m03 ); Moments( const CvMoments& moments ); operator CvMoments() const; // spatial moments double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; // central moments double mu20, mu11, mu02, mu30, mu21, mu12, mu03; // central normalized moments double nu20, nu11, nu02, nu30, nu21, nu12, nu03; } 4、中心矩示例代码 opencv2.4.13 4.1 C++版代码 #include #include // Qt Creator 4.2.0(Based on Qt 5.7.1) // OpenCV 2.4.13 using namespace cv; using namespace std; #define name1 "原图" #define name2 "效果图" cv::Mat img, gray; int nThresh = 100; int nMaxThresh = 255; cv::RNG rng(12345); //产生一个随机数 cv::Mat cannyImg; std::vector contours; std::vector hierarchy; //void on_ThreshChange( int, void* ){ // //canny边缘检测 // cv::Canny( gray, cannyImg, nThresh, nThresh*2, 3 ); // //找轮廓 // cv::findContours( cannyImg, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE, cv::Point( 0, 0 ) ); // //计算矩 // std::vector mu( contours.size() ); // for(unsigned int i = 0; i < contours.size(); i++){ // mu[i] = cv::moments( contours[i], false); // } // //计算中心矩 // std::vector mc( contours.size() ); // for( unsigned int i = 0; i < contours.size(); i++ ){ // mc[i] = cv::Point2f( static_cast(mu[i].m10 / mu[i].m00), static_cast(mu[i].m01 / mu[i].m00)); // } // //画轮廓 // cv::Mat drawing = cv::Mat::zeros( cannyImg.size(), CV_8UC3); // for( unsigned int i = 0; i < contours.size(); i++ ){ // cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) ); // cv::drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, cv::Point() ); // cv::circle( drawing, mc[i], 4, color, -1, 8, 0 ); // } // cv::namedWindow( name2, cv::WINDOW_NORMAL); // cv::imshow( name2, drawing ); // std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有