0

我写了一个算法,假设背景是纯色的,它用 1 个对象检测图像的主要颜色。以下是我目前正在运行的基本步骤:

  • 在整个图像上运行 k-means 算法 (k = 10)
  • 删除与像素 (0,0) 具有相同类别的点
  • 使用剩余点 (k = 3) = > 3 种主要颜色运行新的 k-means 算法

尽管它可能不是最聪明的算法,但我对结果非常满意,除非对象的大部分与背景颜色相同。例如,当对象主要是白色背景上的白色时,算法自然倾向于将对象的白点与背景分类。

我将如何获得一种适用于所有情况的通用方法(我对白色物体没有先验知识)?可以假设对象水平和垂直居中。然而,对于物体的形状或其中的颜色数量(有时它是素色的,有时它有许多不同的颜色),我们无法假设。谢谢 !

(我相信我已经阅读了所有可能的相关帖子!)

编辑:我得到的典型结果: 问题案例

这就是第一个 k-means 对点进行分类的方式(左:k = 10,右:k= 3): k 均值结果

4

2 回答 2

1

一些想法:

1)如果背景颜色是恒定的(例如,所有像素都是相同的颜色),您可以通过找到在空间上连接并包含所有相同(或在某个阈值内相同)颜色的像素的最大分量来找到背景。您可以删除背景,然后在剩余图像上运行 K-Means。

2)如果图像中的组件与背景属于同一个集群,但在图像中没有连接,您可以通过运行连接组件算法将它们拆分。或者,如果您在运行 K-Means 时不包括空间信息(例如,像素坐标),您可以这样做。

3)您也可以尝试增加 K 直到对象从背景中分离出来(对于大多数/所有图像)。

于 2013-11-20T17:35:25.867 回答
0

你不是很清楚当前的问题是什么。能发个截图吗?

也许您的意思是对象边缘附近的区域(对象和背景之间)被错误地分类为背景颜色,即您的算法剪裁太多。在这种情况下,您可以使用边缘检测算法来检测对象和背景之间的边界。一旦你知道了边缘,你就知道了内部,因此你应该能够切掉除了内部之外的所有东西,然后重新运行你的算法。

如果您的意思是对象的内部被分类为背景,那么您可以执行填充算法。如果您对它尝试分类的每个区域进行泛洪填充,请拒绝任何无法一直泛洪填充到像素 (0,0) 的区域。这应该会给您留下一个不与对象重叠的区域列表。

于 2013-11-11T17:53:30.070 回答