图像的主要“颜色”

6
我有以下图片:
我想要做的是基于每个条带的主导颜色对其进行“id”。最好的方法是什么?
我所做的是使用图像的值(HSV)并对该值的出现进行分布。问题是,对于strip0的值[27=32191, 28=5433, others=8] strip1的值[26=7107, 27=23111, others=22]。我无法得出明确的区别。
该项目的主要目标是将实际的黄色纸张与这些条带进行比较,并确定哪个条带最相似。

你是想单独分离这些条带,还是有其他的需求? - mmgp
我不想分离这些条带。这张图片只是作为参考。假设我有这张图片http://i.imgur.com/qn2AAJp.jpg?1。哪个条带最相似?我之前应该提到这一点,抱歉。 - user2034438
1
我想知道您是否真的需要主导颜色?也许高精度平均值更合适。 - Joel
@Joel,什么是高精度平均值?我想这是与低精度平均值相比的。 - thang
4个回答

5
首先,由于您知道参考图像中每个条带的边界,因此可能出现的唯一问题是您的参考图像噪声较大。处理这种情况的相对过度方法是在每个条带中聚类颜色,并将聚类质心作为条带的代表颜色。为了在此步骤中获得更有意义的响应,请考虑使用CIELAB色彩空间。这样做,并将结果转换回RGB,对于第一个条带,我得到了rgb三元组(0.949375,0.879872,0.147898),对于第二个条带,我得到了(0.945324,0.857322,0.129756)(每个通道范围为[0,1])。
当您获得新图像时,执行相同的操作。但是这里有很多问题。例如,在此输入图像中如何处理白平衡?假设您没有这样的问题,那么现在只需要通过相同的过程找到最接近刚刚找到的颜色即可。要找到最接近的颜色,您必须对此使用有意义的颜色空间,再次推荐使用CIELAB,因为已经定义了Delta-E函数。请参见http://en.wikipedia.org/wiki/Color_difference获取一些这样的指标,其中最简单的是CIELAB中的欧几里德距离。

3

校准您的设备。如果您不校准设备,测试样品和参考之间将存在任意误差。照明是您设备的一部分。

使用边缘检测和参考条形图的几何知识(条纹宽度相等)来确定采样区域。对于每个采样区域,提取一个内部补丁。

对于测试条带,计算一张图像,其中每个像素都是采样窗口(例如5x5)内的最大差异。这将让您识别出一个相对均匀的区域,该区域与外部区域(即纸张)不同。提取一个补丁。

使用下采样找到每个补丁的集成颜色,按svnpenn的建议进行。您可以稍后查看其他计算方法,但这应该非常有效。

对于权重wh、ws、wv,计算测试颜色与每个参考颜色之间的相似性= whabs(h0-h1) + wsabs(s0-s1) + wv*abs(v0-v1)。您可以稍后查看其他距离度量,但这应该非常有效。从等重开始。这种方法的一个好处是,它无论参考条带在哪个维度或组合下变化,都表现良好。

对结果进行排序,找到最相似和第二个最相似的匹配项。请注意,相似性被设置为零是精确匹配,而大数字则是较差的匹配。使用这两个结果的比率来估计最相似匹配的质量-如果前两个匹配非常接近,则可能不是任何一个匹配的好匹配。


2
您可以扫描所有颜色,并使用哈希表来跟踪每种颜色的像素数量。将这些数字记住对应的颜色,按降序排序。
查看排序后的数字列表,并找到每个连续数字对之间的差异。跟踪产生每个差异的两个数字在列表中的索引。对此差异列表进行排序。
查看差异列表中的最大数字。现在您拥有了两组像素之间最大的下降量。去查找哪一个更大。具有此像素数及以上的一切都是主导颜色。低于此像素数的所有内容均为次要颜色。现在您知道有多少主导颜色以及它们是什么。
从那里开始做任何您想做的事情应该很容易。
唯一不起作用的情况是如果某些噪声与条纹的颜色相同,以至于它破坏了您的数据。
在这种情况下,您将使用不同的方法,您也可以在第一种情况下使用 - 查看运行。浏览像素,并在每次找到新颜色时查看随后的像素中有多少是相同颜色。
使用先前描述的方法将颜色聚类为主导和非主导,以获得相同的结果。
在两种情况下,如果您知道图片是垂直条纹,则可以限制您查看的颜色水平线数,以加快处理速度。

这真的是我想要实现的。"我不想分离条带。这张图片只是作为参考。假设我有这张图片i.imgur.com/qn2AAJp.jpg?1。哪个条带最相似?我应该早点提到这一点。抱歉" - user2034438
好的,对所有RGB或HSV值的图像进行扫描。找到每个三个值的平均值,并将其映射到一个带有R、G、B或H、S、V轴的三维网格中。计算每个可供选择的主要颜色与其之间的欧几里得距离,并选择最接近的颜色。 - Andrew Latham
那会不会太贵了?用欧几里得距离算法?在确定算法之后,我们仍然需要将其加载到 DSP 中。基本上是在嵌入式系统中。我们仍然不确定我们的硬件有多快。 - user2034438
如果有k种颜色,经过条带预处理后,每个图像的欧几里得距离将为O(k)。然而,如果你想变得更加复杂,可以制作一个kd树。这里的主要优化点在于找到正在检查的图像的主要颜色。 - Andrew Latham

1
您可以将图像分为多个部分,然后将每个部分调整大小为一个像素。这是使用整个图像的示例。
$ convert Y82IirS.jpg -resize 1x1 txt:
# ImageMagick pixel enumeration: 1,1,255,srgb
0,0: (220,176, 44)  #DCB02C  srgb(220,176,44)

图像的平均颜色


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接