繁体   English   中英

如何将某个 RGB 值分配给 Python 中一些其他 RGB 值的“最近”值

[英]how to assign a certain RGB Value to the 'nearest' of some other RGB-Values in Python

我编写了一个代码,它将传入的图片像素化为选定的像素大小。 我有一些 RGB_color 代码(元组)的列表,我想检查每个像素,像素颜色最接近哪种颜色。

我定义的“最近”颜色是其 R G 和 B 值的距离最低的颜色。 例如,如果我只有黑色广告白色,颜色 (128,0,0) 将转换为黑色,因为 0-128 + 0-0 + 0-0 = 到黑色的距离和 255-128 + 255-0 + 255 -0 = 到白色的距离。

它适用于黑色、白色和灰色。 但是当我包括例如红色时,大多数没有任何红色的像素都会输出为红色。 你知道有什么更好的方法来声明最接近的颜色吗?

您当前的距离度量是r1-r2 + g1-g2 + b1-b2可以重新排列为r1+g1+b1 - (r2+g2+b2) ,或者如果brightness=r+g+b ,那么距离是brightness1 - brightness2 因此,您当前的解决方案总是说颜色最接近 colors 中具有最低brightness的那个。

一个简单的解决方案是使用欧几里得距离: sqrt((r1-r2)**2 + (g1-g2)**2 + (b1-b2)**2) (请注意,如果您只需要比较距离,则可以省略平方根。)

但是,RGB 颜色空间在感知上并不均匀,因此使用欧几里得距离可能会产生一些看起来很奇怪的结果。 已经进行了多次尝试来解决这个问题,例如 CAM02-UCS 颜色空间 - 以下是使用colorspacious模块(使用pip安装)进行颜色转换和 numpy 进行欧几里德距离计算的示例。

from colorspacious import cspace_convert
from numpy.linalg import norm as distance


a = cspace_convert([64, 128, 255], "sRGB255", "CAM02-UCS")
b = cspace_convert([64, 138, 255], "sRGB255", "CAM02-UCS")
c = cspace_convert([64, 148, 255], "sRGB255", "CAM02-UCS")
print('distance between a and b', distance(a-b))
print('distance between a and c', distance(a-c))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM