image - 如何使图像的不连续轮廓保持一致?

标签 image opencv image-processing

在任务中,我得到了一个不连续的边缘图像,如何让它闭合?换句话说,使曲线连续。 形状可以是任何一种,因为这是 coutour 阴影。

enter image description here

最佳答案

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


一个想法是形态学膨胀——您可以在命令行中使用 ImageMagick 这样做:

convert gappy.jpg -threshold 50% -morphology dilate disk:5 result.png

enter image description here


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

enter image description here

希望您能看到第一个(最左边的)结构元素代表东西线的西端,第二个代表南北线的北端,依此类推。如果你还没有得到它,最后一个是东北到西南线的西南端​​。

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

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

enter image description here

这是前后的特写:

enter image description here

您还可以使用像这样的“峰”结构元素找到没有邻居的单例像素:

enter image description here

然后你可以找到所有的峰并像这样用红色像素扩大它们:

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

enter image description here

这是前后的特写:

enter image description here

根据您的原始图像的外观,您可以反复应用上述想法,直到您的轮廓是完整的 - 也许您可以通过洪水填充来检测并查看您的轮廓是否“保持水” 没有洪水到处都是“漏水”

很明显,你会用白色来完成红色峰和蓝色线的末端来完成你的轮廓——我只是用彩色来说明我的技术。

关于image - 如何使图像的不连续轮廓保持一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43293915/

相关文章:

c++ - 在 OpenCV 中结合两个仿射变换矩阵

c++ - opencv C++ 中的 findHomography(par1, par2, par3) 返回什么

ios - 将源图像与一组已知图像进行比较

c++ - 如何在直方图上训练 OpenCV 中的神经网络

java - 如何在 Android 中打开具有 Uri 的文件?

c# - WinRT XAML 上的 Image.OpacityMask

image - 如何在 TYPO3 中处理图像宽度/高度?

c++ - 尝试将我的项目与外部 opencv 一起使用

c++ - OpenCV 通过子矩阵改变矩阵

html - 如何对齐用户个人资料图片和姓名+其他信息