如何计算RGBA色彩空间中两种颜色之间的相似度?(当然背景颜色未知)
我需要通过为图像中的每个像素找到最佳调色板条目,将RGBA图像重新映射到RGBA颜色的调色板.
在RGB颜色空间中,可以假设最相似的颜色是具有最小欧氏距离的颜色.然而,这种方法不RGBA,例如工作,从欧氏距离rgba(0,0,0,0),以rgba(0,0,0,50%)比较小rgba(100%,100%,100%,1%),但后者看起来要好得多.
我正在使用预乘的RGBA色彩空间:
r = r×a
g = g×a
b = b×a
Run Code Online (Sandbox Code Playgroud)
我尝试过这个公式(编辑: 请参阅下面的答案以获得更好的公式):
?r² + ?g² + ?b² + 3 × ?a²
Run Code Online (Sandbox Code Playgroud)
但它看起来不是最佳的 - 在具有半透明渐变的图像中,它会找到错误的颜色,导致不连续/锐边.不透明颜色和alpha之间的线性比例看似腥.
什么是最佳配方?
*)为了简化这个问题,我忽略了误差扩散,伽玛和心理视觉色彩空间.
略有关联:如果你想在这个非Euclidean RGBA空间中找到最接近的颜色,vp-tree是最好的.
我在java中有一个缓冲的图像,我想根据颜色值记录每个像素与另一个像素的相似程度.所以具有"相似"颜色的像素将具有更高的相似度值.例如,红色和粉红色的相似度值为1000,但红色和蓝色的相似值为300或更小.
我怎样才能做到这一点.当我从缓冲的Image像素中获取RGB时,它返回一个负整数,我不知道如何用它来实现它.
我正在使用机器人截取屏幕截图,然后在这些屏幕截图中搜索较小的图像.由于伽马校正,这适用于Windows但不适用于OS X. 我能想出的最佳解决方案是简单地匹配相似的颜色而不是精确的颜色匹配.
我担心匹配相似的颜色将意味着超越getRGB因此会减慢我的程序(因为它采用多个屏幕截图并将它们与较小的图像进行比较以非常快速地搜索匹配).
我的问题是,假设我有BufferedImage截图和BufferedImage smallImage,我将如何判断Screenshot.getRGB(1,1)和smallImage.getRGB(1,1)是否是相似的颜色?
colors ×2
java ×2
argb ×1
awtrobot ×1
color-space ×1
image ×1
remap ×1
rgba ×1
screenshot ×1
similarity ×1