如何使图像的不连续轮廓一致?

wan*_*ger 7 opencv image image-processing

在任务中,我得到了一个不连续的边缘图像,怎么能让它关闭?换句话说,使曲线连续.形状可以是任何一种,导致这个coutour阴影.

在此输入图像描述

Mar*_*ell 5

以下是一些可以帮助您入门的想法。我不喜欢在 OpenCV 中编写和调试大量 C++ - 通常人们会问问题然后再也不登录,或者你花了几个小时做某事然后他们告诉你他们提供的单个示例图像根本没有代表性他们的实际图像和花了 25 分钟解释的方法是完全不合适的。


一种想法是形态学扩张 - 您可以在命令行中使用 ImageMagick 执行此操作:

convert gappy.jpg -threshold 50% -morphology dilate disk:5 result.png
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


另一个想法可能是使用命中和未命中形态定位所有“线端”像素。这在 OpenCV 中可用,但我正在使用 ImageMagick 来保存编码/调试。结构元素是这样的:

在此处输入图片说明

希望您能看到第一个(最左边的)结构元素代表东西线的西端,第二个代表南北线的北端,依此类推。如果你还没明白,最后一个是North-East to South-West line的西南端。

基本上,我找到线的末端,然后用蓝色像素扩大它们并将其覆盖到原始像素上:

convert gappy.jpg -threshold 50%  \
   \( +clone -morphology hmt lineends -morphology dilate disk:1 -fill blue -opaque white -transparent black \) \
   -flatten result.png
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是之前和之后的特写:

在此处输入图片说明

您还可以使用“峰值”结构元素找到没有邻居的单例像素,如下所示:

在此处输入图片说明

然后你可以找到所有的峰值,并用红色像素扩大它们,如下所示:

convert gappy.jpg -threshold 50% \
    \( +clone -morphology hmt Peaks:1.9 -fill red -morphology dilate disk:2  -opaque white -transparent black \) \
    -flatten result.png
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是之前和之后的特写:

在此处输入图片说明

根据您的原始图像的外观,您可以迭代地应用上述想法,直到您的轮廓完整为止 - 也许您可以通过洪水填充来检测到这一点,并查看您的轮廓是否“保持水”而没有洪水填充“泄漏”无处不在.

很明显,你会用红色的山峰和蓝色的线结束你的轮廓来完成你的轮廓——我只是用颜色来说明我的技术。