如何得到干净的边缘没有断线



我正在处理二进制图像以获得其边缘。我使用了opencv中的cannyedge函数,但结果不太理想。

点击查看图片

    int edgeThresh = 1;
    int lowThreshold = 100;
    int const max_lowThreshold = 100;
    int ratio = 3;
    int kernel_size = 3;
    blur(binaryImage, detected_edges, Size(3, 3));
    Canny(binaryImage, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
    dst = Scalar::all(0);
    src.copyTo(dst, detected_edges);
    imwrite(defaultPath + "edge_" + filename, dst);

我做了一个肮脏的解决方案,它可以工作,但再次增加了处理时间:

    Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
    blur(detected_edges, detected_edges, Size(3, 3));
    Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);

我是新的opencv和图像处理,所以很可能我错过了一些东西。

请开导我。谢谢!

first:对于像这样的图像,它只是白色和黑色像素,使用findContours函数,它会更快,更精确。如果你需要绘制你刚刚发现的轮廓(绘制你的结果),使用drawContours函数(绘制在新的垫子上,与你发现的轮廓相同的大小)。

关于这个的文档在这里。

其次:这可能是一个问题,您的内核大小或阈值不正确。建议将第二个阈值设置为第一个阈值的3倍。我认为问题可能是你的内核大小(最后一个参数在Canny函数)。尽量不要使用这个函数重载,使用没有这个参数的函数,或者降低内核大小。

相关内容

  • 没有找到相关文章

最新更新