我正在使用机器人截取屏幕截图,然后在这些屏幕截图中搜索较小的图像。由于伽马校正,这适用于Windows但不适用于OS X.我能想出的最佳解决方案是简单地匹配相似的颜色而不是精确的颜色匹配。
我担心匹配相似的颜色意味着超越getRGB因此会减慢我的程序速度(因为它会拍摄多个屏幕截图并将它们与较小的图像进行比较,以便非常快速地搜索匹配)。
我的问题是,假设我有BufferedImage屏幕截图和BufferedImage smallImage,我将如何判断Screenshot.getRGB(1,1)和smallImage.getRGB(1,1)是否类似颜色?
答案 0 :(得分: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)}
另请注意,有一些类似的问题可以解决同一问题:
finding similar colors programatically
"Distance" between colours in PHP
最后,在Java中,有任何简单的方法可以将RGB值转换为其他颜色空间:
答案 1 :(得分:1)
对于颜色相似性,请设DR=R1-R2
,DG=G1-G2
,DB=B1-B2
,然后计算DR×DR+DG×DG+DB×DB
并取其平方根,并将其与某个阈值进行比较。当然,这可以通过简单地跳过平方根部分并平衡阈值来优化。
但如果你设法让OSX在屏幕上呈现包含你的图像的PNG,那么你可能会更好,然后阅读屏幕的那一部分,然后寻找与之完全匹配。
答案 2 :(得分:0)
您使用的是this 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;
当然你需要复制粘贴这个绿色和蓝色。 希望这可以帮助, 克里斯托弗