Computer vision 非连续时导出边

Computer vision 非连续时导出边,computer-vision,emgucv,edge-detection,Computer Vision,Emgucv,Edge Detection,我是计算机视觉新手。 我正在做一个项目,我需要从图片中获得一个二进制手。 我上传了一个例子。从图1我想得到图2 我将canny边缘检测器应用于图片1,但在示例中获得了图片3。 我用的是EmguCV Image<Gray, Byte> imgaux = new Image<Gray, Byte>("example.bmp"); imgaux = imgaux.Canny(100, 300); 我的问题是,我没有连续的边,所以我无法填充手来获得图片2。 可以使用什么方法来找

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

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

Image<Gray, Byte> imgaux = new Image<Gray, Byte>("example.bmp");
imgaux = imgaux.Canny(100, 300);
我的问题是,我没有连续的边,所以我无法填充手来获得图片2。 可以使用什么方法来找到解决方案?

您可以对图像2应用高斯模糊,使图像平滑,然后应用canny边缘检测方法

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

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函数参数中的值。

您可以对图像2应用高斯模糊,使图像平滑,然后应用canny边缘检测方法

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

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函数参数中的值来满足您的需要。

如果您阅读了的第3章,您可以看到它们所做的后处理与您所要求的非常类似。尽管他们的目的是进行知觉分组,但我认为所描述的过程应该适合您的需要。您可能希望将此方法与@Shiva结合起来,以获得更好的结果。但是要注意,你仍然不能保证得到一个你可以直接填充的连续轮廓


Bresenham线条绘制甚至在OpenCV绘图功能包中的线条函数中实现

如果您阅读了的第3章,您会发现他们所做的后处理与您所要求的非常相似。尽管他们的目的是进行知觉分组,但我认为所描述的过程应该适合您的需要。您可能希望将此方法与@Shiva结合起来,以获得更好的结果。但是要注意,你仍然不能保证得到一个你可以直接填充的连续轮廓


Bresenham线条绘制甚至在OpenCV绘图功能包中的线条函数中实现

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

canny边缘检测的替代方法是使用基于本地二进制模式的技术。
您可以使用来验证您的需要并实现该想法。

我将在图像2上应用中值滤波器,该滤波器具有足够大的内核,可以使手的轮廓平滑。手的大小可能会有一点变化,但由于每个图像都包含某种噪声,这不应影响最终结果,以防以后要对其进行处理。

我将在图像2上应用一个中值滤波器,该滤波器具有足够大的内核,可以使手的轮廓平滑。手的大小可能会有一点变化,但由于每个图像都包含某种噪声,这不应影响最终结果,以防以后处理。

可能我不清楚。图2是我的目标。我没有。我有图片1,我可以用边缘检测器得到图片3。也许我不清楚。图2是我的目标。我没有。我有图片1,我可以用边缘检测器获得图片3。