最佳答案
以下是一些可以帮助您入门的想法。我不想在 OpenCV 中编码和调试大量 C++ - 通常人们提出问题后再也不会登录,或者你花了几个小时做某事然后他们告诉你他们提供的单个样本图像根本不具有代表性他们的实际图像和花费 25 分钟解释的方法是完全不合适的。
一个想法是形态学膨胀——您可以在命令行中使用 ImageMagick 这样做:
convert gappy.jpg -threshold 50% -morphology dilate disk:5 result.png
另一个想法可能是定位所有具有命中和未命中形态的“线端”像素。这在 OpenCV 中可用,但我正在使用 ImageMagick 来完成它以节省编码/调试。结构元素是这样的:
希望您能看到第一个(最左边的)结构元素代表东西线的西端,第二个代表南北线的北端,依此类推。如果你还没有得到它,最后一个是东北到西南线的西南端。
基本上,我找到线的末端,然后用蓝色像素扩大它们并将其覆盖到原来的上:
convert gappy.jpg -threshold 50% \
\( +clone -morphology hmt lineends -morphology dilate disk:1 -fill blue -opaque white -transparent black \) \
-flatten result.png
这是前后的特写:
您还可以使用像这样的“峰”结构元素找到没有邻居的单例像素:
然后你可以找到所有的峰并像这样用红色像素扩大它们:
convert gappy.jpg -threshold 50% \
\( +clone -morphology hmt Peaks:1.9 -fill red -morphology dilate disk:2 -opaque white -transparent black \) \
-flatten result.png
这是前后的特写:
根据您的原始图像的外观,您可以反复应用上述想法,直到您的轮廓是完整的 - 也许您可以通过洪水填充来检测并查看您的轮廓是否“保持水” 没有洪水到处都是“漏水”。
很明显,你会用白色来完成红色峰和蓝色线的末端来完成你的轮廓——我只是用彩色来说明我的技术。
关于image - 如何使图像的不连续轮廓保持一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43293915/