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