Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用openCV识别连接组件的最窄部分?_Opencv_Image Processing_Contour - Fatal编程技术网

如何使用openCV识别连接组件的最窄部分?

如何使用openCV识别连接组件的最窄部分?,opencv,image-processing,contour,Opencv,Image Processing,Contour,给定这样一个连接的组件: 我想将图像分为两个图像,其中最窄的部分出现,因此输出如下所示: ,, 注意:我已经添加了几个示例(根据要求):。 (一) (二) 结果如下: , ,一种非常普遍且非常稳健的方法是使用侵蚀和流域改造: 使用大小为k的方形核腐蚀二值图像 检查组件的数量。如果部件数量

给定这样一个连接的组件:

我想将图像分为两个图像,其中最窄的部分出现,因此输出如下所示:

,,

注意:我已经添加了几个示例(根据要求):。

(一)

(二) 结果如下: ,

一种非常普遍且非常稳健的方法是使用侵蚀和流域改造:

  • 使用大小为k的方形核腐蚀二值图像
  • 检查组件的数量。如果部件数量<2,则设置k=k+1,并从步骤1开始重复
  • 这最终将导致两个(或更多)分离的组件。现在:

  • 使用组件作为上一步中收到的标签,计算流域变换的标记
  • 使用标记执行基于标记的流域变换,并获取不同的组件,包括每个组件的边界

  • 对于代码参考,您可能需要查看。它们有一个与您自己的应用程序非常相似的用例。

    一个真正通用且非常健壮的方法是使用侵蚀和流域转换:

  • 使用大小为k的方形核腐蚀二值图像
  • 检查组件的数量。如果部件数量<2,则设置k=k+1,并从步骤1开始重复
  • 这最终将导致两个(或更多)分离的组件。现在:

  • 使用组件作为上一步中收到的标签,计算流域变换的标记
  • 使用标记执行基于标记的流域变换,并获取不同的组件,包括每个组件的边界

  • 对于代码参考,您可能需要查看。它们的用例与您自己的应用程序非常相似。

    垂直投影直方图。对于每列,求和1表示白色像素,求和0表示黑色像素。您会发现“最窄”部分的值大于0,但低于较大的部分parts@Miki这仅适用于所示示例,但如果将图像旋转90度,则会失败。JammingThebBits:你是在寻找一个通用的解决方案,还是仅仅是为给定的图像寻找一个解决方案?@New是的,我知道,这就是问题的所在(现在)。白色的水滴形状总是这样的?如果是这样,您可以简单地将其设置为“水平”(
    minareact
    并旋转),然后使用前面解释的垂直投影。否则,请发布一些涵盖所有可能性的测试用例。请展示一些其他形状,这样我们就知道我们在处理什么。垂直投影直方图。对于每列,求和1表示白色像素,求和0表示黑色像素。您会发现“最窄”部分的值大于0,但低于较大的部分parts@Miki这仅适用于所示示例,但如果将图像旋转90度,则会失败。JammingThebBits:你是在寻找一个通用的解决方案,还是仅仅是为给定的图像寻找一个解决方案?@New是的,我知道,这就是问题的所在(现在)。白色的水滴形状总是这样的?如果是这样,您可以简单地将其设置为“水平”(
    minareact
    并旋转),然后使用前面解释的垂直投影。否则,请发布一些涵盖所有可能的测试用例。请展示一些其他形状,这样我们就知道我们在处理什么。“二次核”听起来有点像抛物线核。我想你是认真的吧?这是一个很好的方法,但为什么呢?什么是灰度图像使用?你是对的,我将它改为“正方形”,以避免进一步的混乱。分水岭自然会找到两个组件之间的边界。我发现将边界没有明确定义的组件分开是很有用的。灰度图像将包括CC算法之前发现的不同成分,以及侵蚀的前景,该前景将设置为“未知”,以便WST可以执行其工作。感谢您的反馈,如果这澄清了方法,我将添加此答案。@T感谢您的详细说明(竖起大拇指),我将在周末尝试:)因此我将很快更新!“二次核”听起来有点像抛物线核。我想你是认真的吧?这是一个很好的方法,但为什么呢?什么是灰度图像使用?你是对的,我将它改为“正方形”,以避免进一步的混乱。分水岭自然会找到两个组件之间的边界。我发现将边界没有明确定义的组件分开是很有用的。灰度图像将包括CC算法之前发现的不同成分,以及侵蚀的前景,该前景将设置为“未知”,以便WST可以执行其工作。感谢您的反馈,如果这澄清了方法,我将添加此答案。@T感谢您的详细说明(竖起大拇指),我将在周末尝试:)因此我将很快更新!