首页 > 编程知识 正文

opencv 边缘检测,样本二阶中心距公式

时间:2023-05-06 02:00:03 阅读:27882 作者:2584

特征矩知识在概率论和数理统计中有介绍,空间矩方法在图像应用中比较广泛,0阶矩求面积,1阶矩决定重心,2阶矩决定主方向,2阶矩和3阶矩为7个不变矩hh

对象物体的灰度函数的特征力矩的公式定义如下。

在二值图像情况下,f(x,y )为

在OpenCV中,可以很容易地计算多边形区域的3次特征矩。 OpenCV中的力矩主要有空间力矩、中心力矩和中心归一化力矩。

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; }空间力矩的公式如下。

在01二值化的图像中,可以看到m00是轮廓的面积。 中心力矩的公式如下

其中:

归一化中心力矩的公式如下

链路的二次中心距离也称为方差,表示随机变量在其平均值附近变动的大小,方差越大则变动性越大。 方差也相当于机械运动中以重心为旋转轴的转动惯量。 (The moment of inertia.)

三阶中心距指示随机密度函数向左或向右倾斜的程度。

当平均值不为零时,原始点间距离只有纯数学意义。

A1,一次矩为E(X ),即样本平均。 具体而言,A1=(西格玛Xi )/n ----(1) )1) ) ) ) )。

A2,二次矩是e(x^2)即样品均方,具体而言是A2=(西格玛Xi^2)/n----) )

Ak,k阶矩是e(x^k )即样本的k次幂的平均值,具体为Ak=(西格玛Xi^k )/n,---- ) )

不变矩的物理含义:

如果图像被认为是质量密度不均匀的薄板,则图像的灰度分布函数f(x,y )是薄板的密度分布函数,其阶矩具有不同的含义,例如零阶矩表示其总质量; 一阶矩表示重心,二阶矩又称为转动惯量,表示图像的大小和方向。 实际上,如果仅考虑阶数为2的力矩集,则原始图像与椭圆的大小、方向和离心率相同,这些椭圆围绕图像的重心并具有恒定的发射率。 由3次矩以下的力矩构成的7个力矩不变量包括平移、旋转、尺度不变性等。 密度分布函数改变后,图像本质不变,可以视为薄板,只是密度分布改变。 此时,各阶矩的值可能发生变化,但根据各阶矩计算的不变矩具有平移、旋转、尺度不变性。 该思想允许对图像进行简化处理,留下最能反映目标特性的信息,并允许使用简化的图像来计算不变矩的特征,从而减少计算量。

研究表明,只有基于二阶矩的不变矩二维物体描述与旋转、平移、尺度真正无关。 由于高阶矩对成像过程中的误差、微小变形等因素非常敏感,相应的不变矩基本上不能用于有效的物体识别。 即使是基于二次力矩的不变力矩,也只能用于识别外形特别不同的物理。 否则,他们的不变矩很相似,所以无法识别。

在OpenCV中,也容易得到Hu不变距离,Hu不变矩在图像旋转、缩放、平移等操作后也保持力矩的不变性,因此有时使用Hu不变距离可以识别图像的特征。

1、在数学领域力矩非常常见

2 .计算机视觉中,使用二维离散形式的力矩计算方法

3、力矩可以用来计算物体的面积、物体的重心等。

4、中心力矩的计算方法是:将某力矩除以0次力矩

5、高阶矩有旋转不变性、尺度不变性、变换不变性等。

我们熟悉概率论中的一阶矩、二阶矩、高阶矩,但很多人可能和我一样,不知道图像中的矩带来了什么。

在计算机视觉书中,我们提到了力矩,这是一个普遍而笼统的故事。 当然谷歌百度这个东西也靠不住。 读了相关论文之后,我终于对力矩在图像中的应用有了大致的了解。 其实力矩不仅出现在概率论中,而且在几何学上也学过。 例如,零阶矩是物体的质量,一阶矩和零阶矩可以计算物体的中心,二阶矩用于计算物体的方向。 就图像而言,图像可以看作平板物体,其一阶矩和零阶矩可以计算某形状的重心,二阶矩可以计算形状的方向。 只是说不练习公式,他们的计算公式如下所示。

其中M00为零阶力矩

M20和M02是二次矩,然后计算物体形状的方向

OpenCV代码如下:

# include opencv2/opencv.hppusingnamespacecv; 用户命名空间STD; 马特SRc; Mat src_gray; int thresh=30; int max_thresh=255; RNGRNG(12345; int main () src=imread('opencv-logo.png ',CV_LOAD_IMAGE_COLOR

);cvtColor( src, src_gray, CV_BGR2GRAY );//灰度化GaussianBlur( src, src, Size(3,3), 0.1, 0, BORDER_DEFAULT );blur( src_gray, src_gray, Size(3,3) ); //滤波namedWindow( "image", CV_WINDOW_AUTOSIZE );imshow( "image", src );moveWindow("image",20,20);//定义Canny边缘检测图像Mat canny_output;vector<vector<Point> > contours;vector<Vec4i> hierarchy;//利用canny算法检测边缘Canny( src_gray, canny_output, thresh, thresh*3, 3 );namedWindow( "canny", CV_WINDOW_AUTOSIZE );imshow( "canny", canny_output );moveWindow("canny",550,20);//查找轮廓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] = Point2d( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); }//画轮廓及其质心并显示Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );printf("tt 几何特性n");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 );rectangle(drawing, boundingRect(contours.at(i)), cvScalar(0,255,0));printf("目标%d - 面积:%.2f - 周长: %.2f ", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) );RotatedRect r = fitEllipse(contours.at(i));double majorAxis = r.size.height > r.size.width ? r.size.height : r.size.width;//长轴大小double minorAxis = r.size.height > r.size.width ? r.size.width : r.size.height;//短轴大小double area = mu[i].m00;//面积int perimeter = arcLength(contours.at(i), true);double orientation = r.angle;double orientation_rads = orientation*3.1416/180;printf("- 偏移角度: %.1fnn", orientation);double diameter = sqrt((4*area)/3.1416);//直径double eccentricity = sqrt(1-pow(minorAxis/majorAxis,2));//离心率double roundness = pow(perimeter, 2)/(2*3.1416*area);//圆滑度line(drawing, Point(mc[i].x, mc[i].y), Point(mc[i].x+30*cos(orientation_rads), mc[i].y+30*sin(orientation_rads)), cvScalar(0,0,200), 3);char tam[100];sprintf(tam, "%.2f", orientation);putText(drawing, tam, Point(mc[i].x, mc[i].y), FONT_HERSHEY_SIMPLEX, 0.5, cvScalar(0,220,120),1.5);}namedWindow( "Contours", CV_WINDOW_AUTOSIZE );imshow( "Contours", drawing );moveWindow("Contours",1100,20);waitKey(0);src.release();src_gray.release();return 0;}结果如下:

计算得到的第二个目标物面积和周长明显不正确,具体原因有待查找



版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。