不连续时导出边缘

时间:2014-01-29 00:25:37

标签: computer-vision emgucv edge-detection

我是计算机视觉的新手。 我正在做一个项目,我需要从图片中获取二进制手。 我上传了一个例子。从图片1 我想获得图片2

Example

我将canny边缘检测器应用于图片1 ,但我在示例中获得了图片3 。 我正在使用EmguCV。

Image<Gray, Byte> imgaux = new Image<Gray, Byte>("example.bmp");
imgaux = imgaux.Canny(100, 300);

我的问题是我没有连续的边缘,所以我无法填补手来获得图片2 。 可以用什么方法找到解决方案?

4 个答案:

答案 0 :(得分:1)

您可以做的是在图片2上应用Gaussian Blur,以便图片流畅,然后应用canny edge detection方法。

所以代码可能看起来像这样。

Image<Gray, Byte> imgaux = new Image<Gray, Byte>("example.bmp");
imgaux = imgaux .SmoothGaussian(3,3,34.3,45.3);
imgaux =imgaux.Canny(100, 300);

您可以使用SmoothGaussian函数参数中的值来满足您的需求。

答案 1 :(得分:1)

如果你看一下this paper的第3章,你可以看到他们做的一些后处理与你要求的完全相似。即使他们的目标是进行感知分组,我认为所描述的程序应该符合您的需求。您可能希望将此方法与@ Shiva相结合,以获得更好的结果。但请注意,您仍然无法保证获得可以填充的连续轮廓。

Bresenham Line Drawing甚至可以在OpenCV Drawing Function包中的line()函数中实现。

答案 2 :(得分:1)

canny边缘检测的替代方案是采用基于局部二进制模式的技术。 您可以使用this来验证您的需求并实施该想法。

答案 3 :(得分:1)

我会在图像(2)上应用median filter,其内核足够大,可以使手的轮廓平滑。手的大小可能会改变一点,但由于每张图片都包含某种噪音,这不会影响您的最终结果,以防您以后再进行处理。