由于图片的Lab色彩空间的值没法直接得到,需要手动计算转换;网上也有很多方法,但是准确度都不统一,我之前做色彩还原时,在这上面花了不少时间,本文提供一种计算方法,经过测试与标准值几乎一致。
代码如下:
import colorsys
from PIL import Image
def get_dominant_color(image):
#颜色模式转换,以便输出rgb颜色值
image = image.convert('RGBA')
#生成缩略图,减少计算量,减小cpu压力
image.thumbnail((200, 200))
max_score = 0
dominant_color = 0
for count, (r, g, b, a) in image.getcolors(image.size[0] * image.size[1]):
# 跳过纯黑色
if a == 0:
continue
saturation = colorsys.rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)[1]
y = min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235)
y = (y - 16.0) / (235 - 16)
# 忽略高亮色
if y > 0.9:
continue
score = (saturation + 0.1) * count
if score > max_score:
max_score = score
dominant_color = (r, g, b)
if ((r>200)&(g>200)&(b>200)):
continue
return dominant_color
cc=get_dominant_color(Image.open('img/b.jpg'))
print(cc)
R=cc[0]
G=cc[1]
B=cc[2]
L=0.2126*R+0.7152*G+0.0722*B
a=1.4749*(0.2213*R-0.3390*G+0.1177*B)+128
b=0.6245*(0.1949*R+0.6057*G-0.8006*B)+128
print('RGB转换后的Lab值为:('"%.3f"%L+','+"%.3f"%a+','"%.3f"%b+')')
结果如下: