在Python中检测普通背景上对象的主要颜色

时间:2013-11-11 17:42:13

标签: python colors k-means

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

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

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

我如何才能获得适用于所有情况的通用方法(我对白色物体没有先验知识)?假设物体在水平和垂直方向都居中,这是可以的。然而,没有任何关于物体的形状或其中的颜色数量的假设(有时它是普通的,有时它有许多不同的颜色)。谢谢!

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

编辑: 我得到的典型结果: problematic case

这就是第一个k-means如何对点进行分类(左:k = 10,右:k = 3): k-means results

2 个答案:

答案 0 :(得分:1)

一些想法:

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

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

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

答案 1 :(得分:0)

你不清楚目前的问题是什么。你能发布截图吗?

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

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