【问题标题】:How to identify optimal parameters for cvCanny for polygon approximation如何确定用于多边形逼近的 cvCanny 的最佳参数
【发布时间】:2012-07-17 01:58:28
【问题描述】:

这是我的源图(忽略点,它们是后来手动添加的):

我的目标是获得两只手的粗略多边形近似。像这样的:

我对如何做到这一点有一个大致的想法;我想用cvCanny 找边缘,cvFindContours 找轮廓,然后cvApproxPoly

我面临的问题是我不知道如何正确使用cvCanny,特别是最后3个参数(threshold1&2,apertureSize)我应该使用什么?我试着做:

cvCanny(source, cannyProcessedImage, 20, 40, 3);

但结果并不理想。左手看起来还不错,但右手检测的很少:

总的来说,它不像我希望的那样可靠。有没有办法猜测 Canny 的“最佳”参数,或者至少对他们所做的事情进行详细解释(初学者可以理解),以便我可以做出有根据的猜测?或者也许有更好的方法来完全做到这一点?

【问题讨论】:

    标签: c opencv computer-vision feature-detection edge-detection


    【解决方案1】:

    看来你必须降低你的门槛。

    Canny 算法在滞后阈值上工作:如果至少有一个像素与最大阈值一样亮,它会选择一个轮廓,如果它们高于下限阈值,它会获取所有连接的轮廓像素。

    论文建议以 2:1 或 3:1 的比例采用这两个阈值(例如 10 和 30,或 20 和 60 等)。对于某些应用程序,手动确定和硬编码的阈值就足够了。它也可能是你的情况。我怀疑如果你降低阈值,你会得到很好的结果,因为图像没有那么复杂。

    已经提出了许多自动确定最佳 Canny 阈值的方法。他们中的大多数依靠梯度幅度来估计最佳阈值。

    步骤:

    • 提取渐变(Sobel 是一个不错的选择)
    • 您可以将其转换为 uchar。梯度理论上可以有比 255 更大的数值,但这没关系。 opencv 的 sobel 返回 uchars。
    • 制作结果图像的直方图。
    • 在直方图的第 95 个百分位处取最大阈值,将较低的阈值设为 high/3。
    • 您可能应该根据您的应用调整百分位值,但结果会比硬编码的高值和低值更可靠

    注意:一个优秀的阈值检测算法是在 Matlab 中实现的。它基于上面的想法,但更复杂一些。

    注意 2:如果图像区域之间的轮廓和光照变化不大,则此方法将起作用。如果图像的某个部分的轮廓更清晰,那么您需要局部自适应阈值,这是另一回事。但是看你的照片,应该不是这样的。

    【讨论】:

    • 谢谢你的解释,我现在明白了。 +1。我选择了另一个答案作为接受的答案,因为在我的情况下它更简单。
    【解决方案2】:

    也许最简单的解决方案之一是对灰度图像进行 Otsu 阈值化,在二值图像上找到轮廓,然后对其进行近似。代码如下:

    Mat img = imread("test.png"), gray;
    vector<Vec4i> hierarchy;
    vector<vector<Point2i> > contours;
    
    cvtColor(img, gray, CV_BGR2GRAY);
    threshold(gray, gray, 0, 255, THRESH_OTSU);
    findContours(gray, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    
    for(size_t i=0; i<contours.size(); i++)
    {
        approxPolyDP(contours[i], contours[i], 5, false);
        drawContours(img, contours, i, Scalar(0,0,255));
    }
    
    imshow("result", img);
    waitKey();
    

    这是结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-06
      • 2021-10-19
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2013-10-03
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多