gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:48:01 26 4
gpt4 key购买 nike

假设图像中有一个连通分量,如下图所示:image http://dl.dropbox.com/u/92688392/ellipse.jpg .

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

编辑:

根据评论,我重新组织了我的问题:在 image moment Wikipedia最长轴角的计算公式为

formula

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

    % 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

这个实现与维基百科中的公式不一致。我想知道哪个是正确的。

最佳答案

如果您正在寻找 OpenCV 实现,我可以为您提供。算法如下:

  1. 将图像转换为 1 位(黑白)
  2. 找到所有轮廓
  3. 创建包含已建立轮廓的所有点的轮廓
  4. 计算这个轮廓的凸包
  5. 找到包含在上一步计算的轮廓的最小正方形的旋转椭圆(矩形)

代码如下:

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();

这是输入:

Input

结果如下:

Result image

关于algorithm - 如何获取目标连接组件的边界椭圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com