opencv - 使用 openCV 检测图像中的白色像素簇

标签 opencv contour polygons regions

输入图像: enter image description here

预期输出: enter image description here

我打算用三个(或一些数量的)多边形(在本例中为矩形)来表示此图像中的“大”白色 Blob 。输出图像中绘制的矩形是根据我对白色区域的感知。我不希望该算法提出这些相同的边界区域。我想要的是在白色像素簇周围放置一些紧密的多边形。

我的初始解决方案包括为该图像寻找轮廓,并通过寻找每个轮廓中点的凸包在每个轮廓周围拟合一个封闭的凸多边形。

但是,由于白色区域高度分散,黑色区域在边缘内部和边缘周围呈脊状,因此 cv2.findContours 返回的轮廓数量非常多(大约 500 个左右)。因此,拟合凸包不会改善白色区域的形状。白色区域大多保留其原始的抽象形状。我的目标是将一个白色区域的许多小轮廓合并为一个包含轮廓的整体,然后我可以在该轮廓上拟合一个凸包。

我该如何解决这个问题?我是否应该首先在轮廓点上使用聚类算法来找到彼此接近的轮廓?

最佳答案

您首先需要对此图像执行形态闭合(先膨胀后腐 eclipse )。这会关闭图像中所有的小“孔”,同时保留各个组件的形状和大小。与此相反,当腐 eclipse 之后是膨胀时,它会去除图像中的噪声点。我正在处理类似的图像,我不得不执行多达 10 次的膨胀 + 腐 eclipse 以平衡我的组件。完成后,使用连接的组件或查找轮廓。这肯定会使轮廓计数从 400 减少到 20-30。

其次,您提到您需要 3 个集群。虽然两个小簇(被红线覆盖)可以合并为一个。我从中得出的结论是,您希望每个集群都尽可能紧密地适合其边界矩形。所以,我建议你设置一个阈值效率(比如 80%),并使用层次聚类将每个连接的组件合并到一个集群中。当您的白色像素所占空间小于其(簇的)边界矩形的 80% 时,您将停止聚类并获取簇。

关于opencv - 使用 openCV 检测图像中的白色像素簇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17157296/

相关文章:

macos - OSX 上的 OpenCV - 如何使用辅助摄像头而不是默认摄像头

python - 使用python创建动态图像幻灯片

matlab - MATLAB 中隐式函数 f(x,y,z)=0 的轮廓

python - 带空白区域的 Matplotlib 等高线

Java 多边形调整大小

javascript - 谷歌地图 : Transparent Polygons

qt - 将 OpenCV IplImage 渲染到 QGLWidget

c++ - 如何在 Qt 中将 opencv 灰度和彩色图像发送到 ftp 服务器?

JavaCV cvInRangeS 错误

java - 如何判断两点之间是否没有任何障碍物