Algorithm 如何获取目标连接组件的边界椭圆

Algorithm 如何获取目标连接组件的边界椭圆,algorithm,opencv,computer-vision,matlab,Algorithm,Opencv,Computer Vision,Matlab,假设图像中有一个连接的组件,如下图所示: 我的问题是如何计算连接组件的边界椭圆(图像中的红色椭圆)。我已经检查了MATLAB函数,并且理解MATLAB是如何做到这一点的。我还注意到Opencv具有类似的功能。然而,尽管我理解他们是如何通过阅读代码获得结果的,但我仍然不清楚代码背后的基本理论。因此,我想知道是否有一些标准算法来完成这项工作。谢谢 编辑: 根据这些意见,我重新组织了我的问题:在计算公式中,最长轴角为 但是,在MATLAB函数中,代码如下所示: % Calculate ori

假设图像中有一个连接的组件,如下图所示:

我的问题是如何计算连接组件的边界椭圆(图像中的红色椭圆)。我已经检查了MATLAB函数,并且理解MATLAB是如何做到这一点的。我还注意到Opencv具有类似的功能。然而,尽管我理解他们是如何通过阅读代码获得结果的,但我仍然不清楚代码背后的基本理论。因此,我想知道是否有一些标准算法来完成这项工作。谢谢

编辑:

根据这些意见,我重新组织了我的问题:在计算公式中,最长轴角为

但是,在MATLAB函数中,代码如下所示:

    % Calculate orientation.
    if (uyy > uxx)
        num = uyy - uxx + sqrt((uyy - uxx)^2 + 4*uxy^2);
        den = 2*uxy;
    else
        num = 2*uxy;
        den = uxx - uyy + sqrt((uxx - uyy)^2 + 4*uxy^2);
    end

此实现与Wikipedia中的公式不一致。我想知道哪一个是正确的

我不确定matlab或opencv如何计算椭球体。但是如果你对它背后的数学感兴趣,有一种非常好的优化方法叫做。你可以在斯坦福课程中找到更多关于这种方法的信息。我希望它有帮助……

我不确定matlab或opencv如何计算椭球体。但是如果你对它背后的数学感兴趣,有一种非常好的优化方法叫做。你可以在斯坦福课程中找到更多关于这种方法的信息。我希望它能帮助…

如果您正在寻找一个OpenCV实现,那么我可以提供给您。算法如下所示:

  • 将图像转换为1比特(黑白)
  • 找到所有轮廓
  • 创建包含已创建轮廓的所有点的轮廓
  • 计算此轮廓的凸包
  • 找到旋转椭圆(矩形),其中包含上一步计算的轮廓的最小平方
  • 以下是代码:

    Mat src = imread("ellipse.jpg"), tmp;
    vector<Vec4i> hierarchy;
    vector<vector<Point> > contours;
    vector<Point> bigContour, hull;
    RotatedRect ell;
    
    //step 1
    cvtColor(src, tmp, CV_BGR2GRAY);
    threshold(tmp, tmp, 100, 255, THRESH_BINARY);
    
    //step 2
    findContours(tmp, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    
    //step 3
    for (size_t i=0; i<contours.size(); i++)
    {
        for (size_t j=0; j<contours[i].size(); j++)
        {
            bigContour.push_back(contours[i][j]);
        }
    }
    
    //step 4
    convexHull(bigContour, hull);
    
    //step 5
    ell = fitEllipse(hull);
    
    //drawing result
    ellipse(src, ell, Scalar(0,0,255), 2);
    
    imshow("result", src);
    waitKey();
    
    matsrc=imread(“eliple.jpg”),tmp;
    向量层次;
    矢量等值线;
    矢量等高线,船体;
    旋转体;
    //第一步
    CVT颜色(src、tmp、CV_bgr2灰色);
    阈值(tmp,tmp,100255,阈值二进制);
    //步骤2
    findContours(tmp、轮廓、层次结构、CV_RETR_外部、CV_链_近似_简单);
    //步骤3
    
    对于(size_t i=0;i如果您正在寻找OpenCV实现,我可以将其提供给您。算法如下:

  • 将图像转换为1比特(黑白)
  • 找到所有轮廓
  • 创建包含已创建轮廓的所有点的轮廓
  • 计算此轮廓的凸包
  • 找到旋转椭圆(矩形),其中包含上一步计算的轮廓的最小平方
  • 以下是代码:

    Mat src = imread("ellipse.jpg"), tmp;
    vector<Vec4i> hierarchy;
    vector<vector<Point> > contours;
    vector<Point> bigContour, hull;
    RotatedRect ell;
    
    //step 1
    cvtColor(src, tmp, CV_BGR2GRAY);
    threshold(tmp, tmp, 100, 255, THRESH_BINARY);
    
    //step 2
    findContours(tmp, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    
    //step 3
    for (size_t i=0; i<contours.size(); i++)
    {
        for (size_t j=0; j<contours[i].size(); j++)
        {
            bigContour.push_back(contours[i][j]);
        }
    }
    
    //step 4
    convexHull(bigContour, hull);
    
    //step 5
    ell = fitEllipse(hull);
    
    //drawing result
    ellipse(src, ell, Scalar(0,0,255), 2);
    
    imshow("result", src);
    waitKey();
    
    matsrc=imread(“eliple.jpg”),tmp;
    向量层次;
    矢量等值线;
    矢量等高线,船体;
    旋转体;
    //第一步
    CVT颜色(src、tmp、CV_bgr2灰色);
    阈值(tmp,tmp,100255,阈值二进制);
    //步骤2
    findContours(tmp、轮廓、层次结构、CV_RETR_外部、CV_链_近似_简单);
    //步骤3
    
    对于(size_t i=0;i我也试图找出它背后的算法,这样我就可以编写自己的实现了。我在a上找到了它。在其中一条评论中,作者说:

    regionprops计算相关对象的二阶矩,然后返回具有相同二阶矩的椭圆测量值

    后来:

    使用的方程式来自Haralick和Shapiro,《计算机与机器人视觉》第一卷附录A,Addison Wesley 1992。我通过构建一个包含长轴长度=100、短轴长度=50的椭圆的图像进行了健全性检查,regionprops返回了正确的测量值


    我没有那本书,但似乎我需要一本。

    我试图找出它背后的算法,这样我就可以自己编写它的实现。我在一个网站上找到它。在其中一条评论中,作者说:

    regionprops计算相关对象的二阶矩,然后返回具有相同二阶矩的椭圆测量值

    后来:

    使用的方程式来自Haralick和Shapiro,《计算机与机器人视觉》第一卷附录A,Addison Wesley 1992。我通过构建一个包含长轴长度=100、短轴长度=50的椭圆的图像进行了健全性检查,regionprops返回了正确的测量值


    我没有那本书,但似乎我需要一本。

    @高性能标记我了解图像力矩,但我不知道如何使用图像力矩计算椭圆。例如,我如何将图像力矩与椭圆的长轴联系起来?有关于该主题的一些材料吗?@高性能标记我了解图像矩,但我不知道如何使用图像矩来计算椭圆。例如,如何将图像矩与椭圆的长轴连接起来?有关于该主题的一些资料吗?谢谢,但matlab或opencv函数背后的理论比您建议的要简单得多。阅读代码后,我认为它与图像矩。图像矩和边界椭圆之间的联系对我来说很难理解。谢谢,但是matlab或opencv函数背后的理论比你建议的要简单得多。阅读代码后,我认为它与图像矩有关。图像矩和边界椭圆之间的联系对我来说很难理解。谢谢,我同意了解你是如何做到的,以及背后的想法。但是,MATLAB函数使用了不同的算法。如果有人能像你一样详细地解释该函数,那就太好了。@feelfree我一点也不懂MATLAB,所以我不能帮你。但别忘了OpenCV是开源的,所以你可以阅读任何OpenCV函数的实现.谢谢,我理解你是如何做到的,以及背后的想法。但是,MATLAB函数使用了不同的算法。如果有人能像你一样详细地解释这个函数,那就太好了。@feelfree我不知道MA