如何在没有折线的情况下获得清洁边缘?

时间:2016-08-13 16:52:53

标签: c++ opencv image-processing

我正在研究二进制图像以获得优势。我使用了opencv的cannyedge函数,但结果不太理想。

Click for the Images

    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和图像处理的新手,所以我很可能错过了一些东西。

请赐教。谢谢!

1 个答案:

答案 0 :(得分:0)

首先:对于像这样的图像,只有白色和黑色像素,使用findContours功能,它会更快,更精确。如果您需要绘制刚刚找到的轮廓(绘制结果),请使用drawContours函数(在新Mat上绘制,与您在轮廓上找到的轮廓相同)。

有关此HERE的文档。

第二次:您的内核大小或阈值值不正确可能是个问题。第二个阈值被推荐为第一个阈值的3倍。我认为问题可能在于你的内核大小(Canny函数中的最后一个参数)。尽量不要使用此函数重载,使用不带此参数的那个或降低内核大小。