我是计算机视觉的新手。 我正在做一个项目,我需要从图片中获取二进制手。 我上传了一个例子。从图片1 我想获得图片2 。
我将canny边缘检测器应用于图片1 ,但我在示例中获得了图片3 。 我正在使用EmguCV。
Image<Gray, Byte> imgaux = new Image<Gray, Byte>("example.bmp");
imgaux = imgaux.Canny(100, 300);
我的问题是我没有连续的边缘,所以我无法填补手来获得图片2 。 可以用什么方法找到解决方案?
答案 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
,其内核足够大,可以使手的轮廓平滑。手的大小可能会改变一点,但由于每张图片都包含某种噪音,这不会影响您的最终结果,以防您以后再进行处理。