6

我有以下图像:

在此处输入图像描述

我想做的是根据它们的主色“识别”各个条带。做到这一点的最佳方法是什么?

我所做的是使用图像的值(HSV)并对该值的出现进行分布。问题是,对于 strip0 值[27=32191, 28=5433, others=8]strip1 值[26=7107, 27=23111, others=22]。我无法得到明确的区别。

该项目的主要目标是将实际的黄色纸与条带进行比较,并确定哪个条带最相似。

4

4 回答 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 中的欧几里德距离。

于 2013-02-02T04:22:08.637 回答
3

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

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

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

根据svnpenn的建议,使用下采样为每个补丁找到一个集成的颜色。您可以稍后查看其他计算方法,但这应该可以很好地工作。

对于权重 wh、ws、wv,计算测试颜色和每个参考颜色之间的相似度 = wh abs(h0-h1) + ws abs(s0-s1) + wv*abs(v0-v1)。您可以稍后查看其他距离度量,但这应该会很好。从相等的权重开始。这种方法的一个好处是,无论参考条变化的尺寸或尺寸组合如何,它都表现良好。

对结果进行排序以找到最相似和第二最相似的匹配。请注意,设置相似性,因此零是完全匹配,大数字是差匹配。使用这两个结果的比率来估计最相似匹配的质量 - 如果前两个匹配非常接近,则可能两者都不是很好的匹配。

于 2013-02-02T04:42:30.273 回答
2

您可以扫描所有颜色并使用哈希表来跟踪每种颜色的像素数。

取这些数字,记住它们对应的颜色,按降序对它们进行排序。

查看排序后的数字列表,找出每对连续数字之间的差异。跟踪导致每个差异的两个数字列表中的索引。对这个差异列表进行排序。

查看差异列表中的最大数量。现在,两组像素之间的下降幅度最大。去看看哪个更大。具有此像素数及以上的所有内容都是主色。下面的一切都是次主导色。现在你知道你有多少主色,它们是什么。

从那里开始应该很容易做任何你想做的事情。

唯一不起作用的是,如果某些噪声与条带颜色相同,以至于它损坏了您的数据。

在这种情况下,您将使用不同的方法,您也可以在第一种情况下使用该方法 - 查看运行。遍历像素,每次找到新颜色时,看看下面有多少像素是相同颜色的。

使用前面描述的方法将颜色聚类为主要和非主要颜色,以获得相同的结果。

在这两种情况下,如果您知道图片是垂直条带,则可以限制您查看的颜色水平线的数量,以加快速度。

于 2013-02-02T04:00:17.627 回答
1

您可以将图像分成多个部分,然后将每个部分调整为一个像素。这是使用整个图像的示例

$ convert Y82IirS.jpg -resize 1x1 txt:
# ImageMagick pixel enumeration: 1,1,255,srgb
0,0: (220,176, 44)  #DCB02C  srgb(220,176,44)

图像的平均颜色

于 2013-02-02T03:43:40.937 回答