精华内容
下载资源
问答
  • 距离变换distanceTransform应用——寻找图像的质心OpenCV中distanceTransform方法用于计算图像中每一个非零点距离离自己最近零点距离,distanceTransform第二个Mat矩阵参数dst保存了每一个点与最近零点...

    距离变换distanceTransform应用——寻找图像的质心

    OpenCV中distanceTransform方法用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远。

    可以根据距离变换的这个性质,经过简单的运算,用于细化字符的轮廓和查找物体质心(中心)。

    #include "core/core.hpp"  
    #include "imgproc/imgproc.hpp"  
    #include "highgui/highgui.hpp"  
    using namespace cv;
    int main(int argc, char *argv[])
    {
        float maxValue = 0;  //定义距离变换矩阵中的最大值  
        Point Pt(0, 0);
        Mat image = imread("corner.tif");
        Mat imageGray;
        cvtColor(image, imageGray, CV_RGB2GRAY);
        imageGray = ~imageGray;  //取反  
        GaussianBlur(imageGray, imageGray, Size(5, 5), 2); //滤波  
        threshold(imageGray, imageGray, 20, 200, CV_THRESH_BINARY); //阈值化     
        Mat imageThin(imageGray.size(), CV_32FC1); //定义保存距离变换结果的Mat矩阵  
        distanceTransform(imageGray, imageThin, CV_DIST_L2, 3);  //距离变换  
        Mat distShow;
        distShow = Mat::zeros(imageGray.size(), CV_8UC1); //定义细化后的字符轮廓  
        for (int i = 0; i<imageThin.rows; i++)
        {
            for (int j = 0; j<imageThin.cols; j++)
            {
                distShow.at<uchar>(i, j) = imageThin.at<float>(i, j);
                if (imageThin.at<float>(i, j)>maxValue)
                {
                    maxValue = imageThin.at<float>(i, j);  //获取距离变换的极大值  
                    Pt = Point(j, i);  //坐标  
                }
            }
        }
        normalize(distShow, distShow, 0, 255, CV_MINMAX); //为了显示清晰,做了0~255归一化  
        circle(image, Pt, maxValue, Scalar(0, 0, 255), 3);
        circle(image, Pt, 3, Scalar(0, 255, 0), 3);
        imshow("Source Image", image);
        imshow("Thin Image", distShow);
        waitKey();
        return 0;
    }
    展开全文
  • 当你在计算机视觉中工作时,寻找质心的问题也很重要——除了,你要处理的是像素而不是原子!在这篇文章中,我们将首先讨论如何找到一个任意形状的blob的中心,然后再讨论多个blob的情况。What is a blob?blob是图像...
    代码github.com

    中学时,我们学习了几何中的各种形状。比较容易找到圆形、正方形、三角形、椭圆形等标准形状的圆心。

    但是当要找到任意形状的质心时,方法就不那么简单了。

    当你在计算机视觉中工作时,寻找质心的问题也很重要——除了,你要处理的是像素而不是原子!在这篇文章中,我们将首先讨论如何找到一个任意形状的blob的中心,然后再讨论多个blob的情况。

    What is a blob?

    blob是图像中一组相互连接的像素,它们具有一些共同的属性(例如,灰度值)。在这篇文章中,我们的目标是使用c++中的OpenCV找到binary blob的中心。如果我们感兴趣的形状不是binary的,我们必须先将其binary。

    形状的质心是什么?

    形状的质心是形状中所有点的算术平均值(即平均值)。假设一个形状由n个不同的点组成,x1…x_n,则形心由

    equation?tex=c%3D%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%7Bx_%7Bi%7D%7D

    在图像处理和计算机视觉的背景下,每个形状都是由像素构成的,而形心则是构成形状的所有像素的加权平均值。

    Image Moments

    我们可以在OpenCV中使用矩来找到blob的中心。但首先,我们应该知道图像时刻到底是什么。图像矩是图像像素强度的一种特殊的加权平均值,它可以帮助我们发现图像的一些特定性质,如半径、面积、质心等。为了找到图像的质心,我们通常把它转换成二进制格式,然后找到它的中心。

    质心由公式给出:

    equation?tex=C_%7Bx%7D%3D%5Cfrac%7BM_%7B10%7D%7D%7BM_%7B00%7D%7D
    equation?tex=C_%7Bx%7D%3D%5Cfrac%7BM_%7B01%7D%7D%7BM_%7B00%7D%7D

    equation?tex=C_%7Bx%7D 为x坐标,
    equation?tex=C_%7By%7D 为质心的y坐标,M为力矩。

    在OpenCV中查找Blob形心的步骤

    要找到blob的中心,我们将执行以下步骤:

    1. 转换图像为灰度。
    2. 对图像执行二值化。
    3. 求出图像的中心后,计算的矩。
    // declare Mat variables, thr, gray and src
    Mat thr, gray, src;
    
    // convert image to grayscale
    cvtColor( src, gray, COLOR_BGR2GRAY );
    
    // convert grayscale to binary image
    threshold( gray, thr, 100,255,THRESH_BINARY );
    
    // find moments of the image
    Moments m = moments(thr,true);
    Point p(m.m10/m.m00, m.m01/m.m00);
    
    // coordinates of centroid
    cout<< Mat(p)<< endl;
    
    // show the image with a point mark at the centroid
    circle(src, p, 5, Scalar(128,0,0), -1);
    imshow("Image with center",src);
    waitKey(0);
    

    下图显示了图像中单个blob的中心

    101b52504e38d7f67e2819176cdb511a.png

    Center of multiple blobs in an Image

    只找到一个blob的中心是很容易的,但是如果图像中有多个blob呢?然后,我们必须使用find等值线来找到图像中的等值线的数量并找到它们的中心。让我们看看它是如何工作的!

    Mat canny_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    
    // detect edges using canny
    Canny( gray, canny_output, 50, 150, 3 );
    
    // find contours
    findContours( canny_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );
    
    // get the moments
    vector<Moments> mu(contours.size());
    for( int i = 0; i<contours.size(); i++ )
    { mu[i] = moments( contours[i], false ); }
    
    // get the centroid of figures.
    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 ); }
    
    
    // draw contours
    Mat drawing(canny_output.size(), CV_8UC3, Scalar(255,255,255));
    for( int i = 0; i<contours.size(); i++ )
    {
    Scalar color = Scalar(167,151,0); // B G R values
    drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
    circle( drawing, mc[i], 4, color, -1, 8, 0 );
    }
    
    // show the resultant image
    namedWindow( "Contours", WINDOW_AUTOSIZE );
    imshow( "Contours", drawing );
    waitKey(0);
    

    5b4aa2b1c7a95e30296269f2b4ce879a.png

    8f286bfdd6e898db40c736398917b49f.png

    请注意,在查找多个blobs的中心时,我们使用了函数find等高线,它输出等高线和层次结构,其中等高线是图像中出现的所有等高线的列表。

    参考

    Find Center of a Blob (Centroid) Using OpenCV (C++/Python)

    展开全文
  • 当你在计算机视觉中工作时,寻找质心的问题也很重要——除了,你要处理的是像素而不是原子!在这篇文章中,我们将首先讨论如何找到一个任意形状的blob的中心,然后再讨论多个blob的情况。What is a blob?blob是图像...

    代码​github.com

    中学时,我们学习了几何中的各种形状。比较容易找到圆形、正方形、三角形、椭圆形等标准形状的圆心。

    但是当要找到任意形状的质心时,方法就不那么简单了。

    当你在计算机视觉中工作时,寻找质心的问题也很重要——除了,你要处理的是像素而不是原子!在这篇文章中,我们将首先讨论如何找到一个任意形状的blob的中心,然后再讨论多个blob的情况。

    What is a blob?

    blob是图像中一组相互连接的像素,它们具有一些共同的属性(例如,灰度值)。在这篇文章中,我们的目标是使用c++中的OpenCV找到binary blob的中心。如果我们感兴趣的形状不是binary的,我们必须先将其binary。

    形状的质心是什么?

    形状的质心是形状中所有点的算术平均值(即平均值)。假设一个形状由n个不同的点组成,x1…x_n,则形心由

    在图像处理和计算机视觉的背景下,每个形状都是由像素构成的,而形心则是构成形状的所有像素的加权平均值。

    Image Moments

    我们可以在OpenCV中使用矩来找到blob的中心。但首先,我们应该知道图像时刻到底是什么。图像矩是图像像素强度的一种特殊的加权平均值,它可以帮助我们发现图像的一些特定性质,如半径、面积、质心等。为了找到图像的质心,我们通常把它转换成二进制格式,然后找到它的中心。

    质心由公式给出:

    为x坐标,

    为质心的y坐标,M为力矩。

    在OpenCV中查找Blob形心的步骤

    要找到blob的中心,我们将执行以下步骤:转换图像为灰度。

    对图像执行二值化。

    求出图像的中心后,计算的矩。

    // declare Mat variables, thr, gray and srcMat thr, gray, src;

    // convert image to grayscalecvtColor( src, gray, COLOR_BGR2GRAY );

    // convert grayscale to binary imagethreshold( gray, thr, 100,255,THRESH_BINARY );

    // find moments of the imageMoments m = moments(thr,true);

    Point p(m.m10/m.m00, m.m01/m.m00);

    // coordinates of centroidcout<< Mat(p)<< endl;

    // show the image with a point mark at the centroidcircle(src, p, 5, Scalar(128,0,0), -1);

    imshow("Image with center",src);

    waitKey(0);

    下图显示了图像中单个blob的中心

    Center of multiple blobs in an Image

    只找到一个blob的中心是很容易的,但是如果图像中有多个blob呢?然后,我们必须使用find等值线来找到图像中的等值线的数量并找到它们的中心。让我们看看它是如何工作的!

    Mat canny_output;

    vector > contours;

    vector hierarchy;

    // detect edges using cannyCanny( gray, canny_output, 50, 150, 3 );

    // find contoursfindContours( canny_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );

    // get the momentsvector mu(contours.size());

    for( int i = 0; i

    { mu[i] = moments( contours[i], false ); }

    // get the centroid of figures.vector mc(contours.size());

    for( int i = 0; i

    { mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); }

    // draw contoursMat drawing(canny_output.size(), CV_8UC3, Scalar(255,255,255));

    for( int i = 0; i

    {

    Scalar color = Scalar(167,151,0); // B G R valuesdrawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());

    circle( drawing, mc[i], 4, color, -1, 8, 0 );

    }

    // show the resultant imagenamedWindow( "Contours", WINDOW_AUTOSIZE );

    imshow( "Contours", drawing );

    waitKey(0);

    请注意,在查找多个blobs的中心时,我们使用了函数find等高线,它输出等高线和层次结构,其中等高线是图像中出现的所有等高线的列表。

    参考

    展开全文
  • 当你在计算机视觉中工作时,寻找质心的问题也很重要——除了,你要处理的是像素而不是原子!在这篇文章中,我们将首先讨论如何找到一个任意形状的blob的中心,然后再讨论多个blob的情况。What is a blob?blob是图像...
    代码github.com

    中学时,我们学习了几何中的各种形状。比较容易找到圆形、正方形、三角形、椭圆形等标准形状的圆心。

    但是当要找到任意形状的质心时,方法就不那么简单了。

    当你在计算机视觉中工作时,寻找质心的问题也很重要——除了,你要处理的是像素而不是原子!在这篇文章中,我们将首先讨论如何找到一个任意形状的blob的中心,然后再讨论多个blob的情况。

    What is a blob?

    blob是图像中一组相互连接的像素,它们具有一些共同的属性(例如,灰度值)。在这篇文章中,我们的目标是使用c++中的OpenCV找到binary blob的中心。如果我们感兴趣的形状不是binary的,我们必须先将其binary。

    形状的质心是什么?

    形状的质心是形状中所有点的算术平均值(即平均值)。假设一个形状由n个不同的点组成,x1…x_n,则形心由

    在图像处理和计算机视觉的背景下,每个形状都是由像素构成的,而形心则是构成形状的所有像素的加权平均值。

    Image Moments

    我们可以在OpenCV中使用矩来找到blob的中心。但首先,我们应该知道图像时刻到底是什么。图像矩是图像像素强度的一种特殊的加权平均值,它可以帮助我们发现图像的一些特定性质,如半径、面积、质心等。为了找到图像的质心,我们通常把它转换成二进制格式,然后找到它的中心。

    质心由公式给出:

    为x坐标,
    为质心的y坐标,M为力矩。

    在OpenCV中查找Blob形心的步骤

    要找到blob的中心,我们将执行以下步骤:

    1. 转换图像为灰度。
    2. 对图像执行二值化。
    3. 求出图像的中心后,计算的矩。
    // declare Mat variables, thr, gray and src
    Mat thr, gray, src;
    
    // convert image to grayscale
    cvtColor( src, gray, COLOR_BGR2GRAY );
    
    // convert grayscale to binary image
    threshold( gray, thr, 100,255,THRESH_BINARY );
    
    // find moments of the image
    Moments m = moments(thr,true);
    Point p(m.m10/m.m00, m.m01/m.m00);
    
    // coordinates of centroid
    cout<< Mat(p)<< endl;
    
    // show the image with a point mark at the centroid
    circle(src, p, 5, Scalar(128,0,0), -1);
    imshow("Image with center",src);
    waitKey(0);
    

    下图显示了图像中单个blob的中心

    c0ffe1dd3484edc9a37e8333f1c65d5d.png

    Center of multiple blobs in an Image

    只找到一个blob的中心是很容易的,但是如果图像中有多个blob呢?然后,我们必须使用find等值线来找到图像中的等值线的数量并找到它们的中心。让我们看看它是如何工作的!

    Mat canny_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    
    // detect edges using canny
    Canny( gray, canny_output, 50, 150, 3 );
    
    // find contours
    findContours( canny_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );
    
    // get the moments
    vector<Moments> mu(contours.size());
    for( int i = 0; i<contours.size(); i++ )
    { mu[i] = moments( contours[i], false ); }
    
    // get the centroid of figures.
    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 ); }
    
    
    // draw contours
    Mat drawing(canny_output.size(), CV_8UC3, Scalar(255,255,255));
    for( int i = 0; i<contours.size(); i++ )
    {
    Scalar color = Scalar(167,151,0); // B G R values
    drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
    circle( drawing, mc[i], 4, color, -1, 8, 0 );
    }
    
    // show the resultant image
    namedWindow( "Contours", WINDOW_AUTOSIZE );
    imshow( "Contours", drawing );
    waitKey(0);
    

    2180ed2faaf636d1d0d8721366c51e8b.png

    b9126800638c921fd0dfbb21b3b122a9.png

    请注意,在查找多个blobs的中心时,我们使用了函数find等高线,它输出等高线和层次结构,其中等高线是图像中出现的所有等高线的列表。

    参考

    Find Center of a Blob (Centroid) Using OpenCV (C++/Python)

    展开全文
  • KMeans秘籍之如何选取初始质心

    千次阅读 2018-07-10 22:07:58
    初始质心的选取 常见的方法是随机的选取初始中心,但是这样簇的质量常常很差。 处理选取初始质心问题的一种常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。 ...
  • 本文实例为大家分享了Opencv提取连通区域轮廓具体代码,供...程序中有寻找质心+填充,但效果不好,因此就不放填充后图了。 实验结果: #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/hig
  • 我们详细分析了在质心中心处的LHC前景,即通过压缩的超对称情形,通过独家的光子引发对产生,在带电电弱搜索中,质子中心的s $$ \ sqrt {s} ... 我们还将概述一系列可能的方法,以进一步抑制这些背景以及扩大信号产量。
  • 提出了寻找衰减到两个希格斯玻色子或希格斯玻色子和W或Z玻色子的大规模窄共振的方法。 考虑的衰减通道为HH→bbτ+τ− $$ \ mathrm {H} \ mathrm {H} \至\ mathrm {b} \ overline {\ mathrm {b}} {\ tau} ^ {+} { \ ...
  • 提出了在左对称模型的框架内寻找右旋规矩玻色子WR的方法,其衰减为增强的右旋重中微子NR。 它基于质子-质子碰撞的数据,质子中心在2015年,2016年和2017年期间在大型强子对撞机上由ATLAS探测器收集的质心能量为13 ...
  • 聚类模型是试图检测未标记数据中模式无监督方法。聚类算法主要有两类:聚集聚类将相似数据点连接在一起,而质心聚类则试图在数据中找到中心或分区。Yellowbrick提供yellowbrick.cluster用于可视化和评估群集行为...
  • 提出了寻找衰减到电子和介子的窄共振的方法。 还对e¼质谱研究了量子黑洞(QBHs)产生的非共振贡献。 使用在LHC上使用CMS检测器在质子-质子碰撞中以8 TeV的质心能量收集的积分光度19.7 fb-1对应的数据进行分析。 在...
  • 提出了一种寻找长寿命粒子的方法,这些粒子会衰减到位移的,非及时的射流中,并失去横向动量。 数据样本对应于2016-2018年CERN LHC CMS实验收集的13TeV质心能量下质子-质子碰撞的137fb-1积分光度。 使用CMS电磁热量...
  • 为提高足式移动机器人避障能力...然后,结合经典A*算法,建立机器人局部和世界坐标系、机器人质心轨迹转换模型、碰撞模型和启发式代价函数,在全局环境中寻找最优成本最小路径;最后,通过仿真实验验证该算法有效性.
  • 提出了寻找高质量光子对的共振产生的方法。 搜索的重点是自旋0和自旋2共振,质量在0.5到4.5 TeV之间,相对于质量的宽度在1.4×10×4和5.6×10×2之间。 数据样本对应于2016年用CMS检测器在13 TeV的质心能量处收集到...
  • 提出了在250GeV至6TeV的质量范围内寻找高质量的双电子和Dimuon共振的方法。 数据由ATLAS实验记录,在大型强子对撞机的运行2中,质子与质子的碰撞在质心能量s = 13TeV处发生,并且对应的综合光度为139 fb $ ^ {-1} $...
  • 提出了寻找衰减到希格斯玻色子和矢量玻色子的重共振的方法。 分析是使用2015年通过CMS实验在大型强子对撞机在质子-质子碰撞中以13 TeV的质心能量(对应于2.2-2.5 fb -1的综合光度)进行的CMS实验收集的数据样本进行...
  • 这封信提出了在ATLAS强子量热仪中寻找衰变的长寿命中性粒子(Zd)的产生的方法,以及通过中间标量玻色子产生的标准模型(SM)Z玻色子的关系,其中Z→ℓ+ℓ- (ℓ= e,μ)。 所使用的数据是在2015年和2016年pp碰撞...
  • 提出了在电子和介子对的不变质谱中寻找非共振过量的方法。 该分析基于2016年CMS实验记录的质子-质子碰撞的质心能量为13 TeV的数据,对应的总积分光度为36 fb-1。 没有观察到与标准模型的显着偏差。 对于两类非共振...
  • 提出了在高能,高多重性最终状态中进行搜索以寻找标准模型以外的物理证据的方法,例如黑洞,弦球和弱电闪体。 数据样本对应于2016年在LHC质子-质子碰撞,质心能量为13 TeV的质子碰撞中通过CMS实验收集的35.9 fb-1的...
  • 树分治和LCA

    2017-07-27 10:48:00
    在树中将树分成几个部分,然后依次解决的方法,这就是一种优化的方法。那么要如何去分治一棵树呢,这里需要一个概念,那就是树的质心 那么什么是树的质心呢 指的是让这棵树中的一个点为根,使得这棵树的最大子树的...
  • 提出了寻找衰减到Z玻色子和光子的共振的方法。 该分析基于质子-质子碰撞的数据,其质心能量为13 TeV,对应于35.9 fb-1的综合光度,并于2016年在大型强子对撞机中由CMS检测器收集。 对Z玻色子进行了研究。 在轻子通道...
  • 提出了寻找单产的第三代标量鳞状夸克的方法,该第三代标量鳞状夸克会衰减到τ轻子和底夸克。 考虑到相关的产生上钩夸克和τ轻子,导致最终状态为底夸克和两个τ轻子。 该搜索使用质子质子碰撞数据,质子质子碰撞数据...
  • K-Means聚类原理

    千次阅读 2019-03-11 16:00:36
    文章目录K-Means算法介绍K-Means算法计算过程K-Means算法损失函数肘部法则寻找最优K值轮廓系数法寻找最优K值K-Means++算法:初始化质心的优化方法 K-Means算法介绍 K-Means算法是一种无监督的聚类算法,其中K表示...
  • 提出了在夸克衰变过程中寻找改变风味的中性电流过程的方法。 使用ATLAS探测器从大型强子对撞机质子-质子碰撞中收集的数据,质心能量为s = 13 $$ \ sqrt {s} = 13 $$ TeV,对应于36.1 fb−的积分光度 1,进行分析。 ...
  • 然后, 对于根据每个数据的特征向量, 从 K 个聚类中心寻找聚类新分配的类簇, 通过取分配给每个先前质心的所有样本的平均值来创建新的质心. 重新对 K 个聚类中心做计算 接着, 在所有的数据都被标记过聚类中心之后, ...
  • k均值聚类算法

    2018-05-17 10:09:24
    聚类可以使用多种不同的方法来计算相似度。 一种广泛使用的聚类算法是K-均值算法,其中k是用户指定的要创建的簇的数目。 K-均值聚类算法以k个随机质心开始。算法会计算每个点到质心的距离。每个点会被...
  • 聚类——MeanShift算法以及Python实现

    千次阅读 2018-05-05 21:36:08
    寻找核密度极值点并作为簇的质心,然后根据最近邻原则将样本点赋予质心 算法简介 核密度估计 根据样本分布估计在样本空间每一点密度。估计某点密度时,核密度估计方法会考虑该点邻近区域...
  • 希格斯玻色子与胶子对有效耦合是测试标准模型并寻找新物理最重要参数之一。 在本文中,我们基于射流能量剖面提出了几种新可观测值,以提取有效耦合。 基于新观测值提取有效耦合统计不确定性,是基于未来...
  • 聚类算法

    2019-11-24 23:36:42
    分类是分析已有数据,寻找其共同属性,并根据分类模型将这些数据划分成不 同类别 聚类预先不知道欲划分类情况下,根 据信息相似度原则进行信息聚类一种方法 K-means聚类 1、随机取 k 个点作为 k 个初始...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

寻找质心的方法