6

我正在使用机器人截取屏幕截图,然后在这些截图中搜索较小的图像。由于伽马校正,这适用于 Windows 但不适用于 OS X。我能想出的最佳解决方案是简单地匹配相似的颜色而不是精确的颜色匹配。

我担心匹配相似的颜色将意味着超出 getRGB 因此会减慢我的程序(因为它会拍摄多个屏幕截图并将它们与较小的图像进行比较以非常快速地搜索匹配)。

我的问题是,假设我有 BufferedImage Screenshot 和 BufferedImage smallImage,我将如何确定 Screenshot.getRGB(1,1) 和 smallImage.getRGB(1,1) 是否是相似的颜色?

4

3 回答 3

4

关于这个问题有一篇有趣的论文:

M. Sarifuddin 和 Rokia Missaoui的基于内容的图像和视频检索的具有相关颜色相似性度量的新感知均匀色彩空间

您可以使用 Google 或特别是Google Scholar轻松找到此内容。

总而言之,一些颜色空间(例如 RGB、HSV、Lab)和距离度量(例如几何平均值和欧几里得距离)比其他颜色空间更能代表人类对颜色相似性的感知。该论文讨论了一种新的色彩空间,它比其他的更好,但它也提供了对常见的现有色彩空间和距离度量的很好的比较。定性*,使用常用颜色空间测量感知距离的最佳方法似乎是:HSV 颜色空间和圆柱距离测量。

*至少,根据参考论文中的图 15。

圆柱距离测量是(在 Latex 表示法中):

D_{cyl} = \sqrt{\Delta V^{2}+S_1^{2}+S_2^{2}-2S_1S_2cos(\Delta H)}

另请注意,有一些类似的问题可以解决相同的问题:

以编程方式查找相似的颜色

PHP中颜色之间的“距离”

最后,在 Java 中,有任何简单的方法可以将 RGB 值转换为其他颜色空间:

颜色空间.fromRGB

于 2011-12-31T16:25:23.617 回答
1

对于颜色相似性,让DR=R1-R2, DG=G1-G2, DB=B1-B2, 然后计算DR×DR+DG×DG+DB×DB并取其平方根,并将其与某个阈值进行比较。当然,这可以通过简单地跳过平方根部分并仅对阈值进行平方来优化。

但是,如果您设法让 OSX 在屏幕上呈现包含您的图像的 PNG,然后读取屏幕的该部分,然后寻找与之完全匹配的内容,您可能会更好。

于 2011-12-31T14:55:48.503 回答
0

你在使用这个getRGB 方法吗?如果是,我将通过减去它们并检查其绝对值是否低于给定阈值(例如 10)来比较数组元素 1 到 3(RGB)。所以它会像

if(Math.abs(firstPixel[1]-secondPixel[1])<10) 
   redIsSimilar = true; 
else 
   redIsSimilar=false;

没有 if 语句:

redIsSimilar = Math.abs(firstPixel[1]-secondPixel[1]) < 10;

当然,您还需要将其复制粘贴为绿色和蓝色。希望这会有所帮助,克里斯托夫

于 2011-12-31T14:58:48.913 回答