我写了一个算法,用一个对象检测图像的主要颜色,假设背景是平的。以下是我目前正在运行的基本步骤:
虽然它可能不是最聪明的算法,但我对结果非常满意,除非对象的大部分颜色与背景颜色相同。例如,当对象在白色背景上主要是白色时,该算法自然倾向于将对象的白点与背景分类。
我如何才能获得适用于所有情况的通用方法(我对白色物体没有先验知识)?假设物体在水平和垂直方向都居中,这是可以的。然而,没有任何关于物体的形状或其中的颜色数量的假设(有时它是普通的,有时它有许多不同的颜色)。谢谢!
(我相信我已经阅读了所有相关的帖子!)
编辑: 我得到的典型结果:
这就是第一个k-means如何对点进行分类(左:k = 10,右:k = 3):
答案 0 :(得分:1)
一些想法:
1)如果背景颜色是常量(例如,所有像素都是相同的颜色),您可以通过找到空间连接的最大组件并包含全部相同的像素(或在某个阈值内相同)来找到背景颜色。您可以删除背景,然后在剩余图像上运行K-Means。
2)如果图像中的组件属于与背景相同的群集,但未在图像中连接,则可以通过运行连接的组件算法将其拆分。或者,如果您在运行K-Means时不包含空间信息(例如,像素坐标),则可以这样做。
3)您也可以尝试增加K直到对象从背景中分离(对于大多数/所有图像)。
答案 1 :(得分:0)
你不清楚目前的问题是什么。你能发布截图吗?
也许您的意思是对象边缘附近的区域(对象和背景之间)被错误地归类为背景颜色,即您的算法剪裁太多。在这种情况下,您可以使用边缘检测算法来检测对象和背景之间的边界。一旦你知道边缘,就会知道内部,因此你应该能够切除除内部之外的所有内容,然后重新运行算法。
如果您的意思是将对象的内部分类为背景,那么您可以执行填充算法。如果您填充每个区域,它正在尝试进行分类,请拒绝任何无法一直填充到像素的区域(0,0)。这应该会给你一个不与对象重叠的区域列表。