Python中的相似颜色检测

Python中的相似颜色检测,python,colors,rgb,scikit-image,cielab,Python,Colors,Rgb,Scikit Image,Cielab,给定RGB或十六进制的颜色,如何找到与之相似的颜色?通过相似性,我的意思是,它们应该通过较小的值来区分。RGB颜色空间依赖于设备,在感知上并不一致。例如,如果要测量颜色相似性,应首先将RGB值转换为与设备无关且感知更均匀的颜色空间。然后,您可以通过适当的相似性度量来测量颜色差异,如 演示 考虑: 让我们假设您的参考颜色是绿色和洋红色,其RGB值例如为[0,160,0]和[120,0,140]。下面的代码段标识了其相对于参考颜色的增量E低于特定阈值的图像像素(15和20) 将numpy导入为np

给定RGB或十六进制的颜色,如何找到与之相似的颜色?通过相似性,我的意思是,它们应该通过较小的值来区分。

RGB颜色空间依赖于设备,在感知上并不一致。例如,如果要测量颜色相似性,应首先将RGB值转换为与设备无关且感知更均匀的颜色空间。然后,您可以通过适当的相似性度量来测量颜色差异,如

演示 考虑:

让我们假设您的参考颜色是绿色和洋红色,其RGB值例如为
[0,160,0]
[120,0,140]
。下面的代码段标识了其相对于参考颜色的增量E低于特定阈值的图像像素(
15
20

将numpy导入为np
从撇渣进口io
从skimage.color导入rgb2lab,deltaE_cie76
rgb=io.imread('https://i.stack.imgur.com/npnrv.png')
实验室=rgb2lab(rgb)
绿色=[0,160,0]
洋红=[120,0,140]
阈值_绿色=15
阈值(品红=20)
绿色=np.uint8(np.asarray([[绿色]]))
洋红3d=np.uint8(np.asarray([[洋红]]))
dE_green=deltaE_cie76(rgb2lab(绿色_3d),实验室)
dE_洋红=deltaE_cie76(rgb2lab(洋红3d),实验室)
rgb[dE_green<阈值_green]=绿色\u 3d
rgb[dE_洋红<阈值\u洋红]=洋红\u 3d
io.imshow(rgb)

为什么不简单地计算rgb代码之间的欧几里德距离?类似于NoPy.QRT((R1-R0)** 2 +(G1-G0)** 2(B1-B0)** 2)@ USER 2660966,但是人类对颜色的感知是不同的,与欧几里德距离不匹配。你可以考虑把你的颜色转换成HSV颜色空间。@ USE12828,然后我该怎么处理?@ JPrdDDy这可能会有帮助:
import numpy as np
from skimage import io
from skimage.color import rgb2lab, deltaE_cie76

rgb = io.imread('https://i.stack.imgur.com/npnrv.png')
lab = rgb2lab(rgb)

green = [0, 160, 0]
magenta = [120, 0, 140]

threshold_green = 15    
threshold_magenta = 20    

green_3d = np.uint8(np.asarray([[green]]))
magenta_3d = np.uint8(np.asarray([[magenta]]))

dE_green = deltaE_cie76(rgb2lab(green_3d), lab)
dE_magenta = deltaE_cie76(rgb2lab(magenta_3d), lab)

rgb[dE_green < threshold_green] = green_3d
rgb[dE_magenta < threshold_magenta] = magenta_3d
io.imshow(rgb)