下面是如何直接计算RGB颜色的补色。它给出的结果与使用colorsys的算法相同,如Iva Klass的答案所示,但在我的测试中,它大约快了50%。请注意,它适用于任何RGB方案,不管RGB组件是整数还是浮点(只要每个组件使用相同的范围!)。在
函数hilo实现了一个简单的sorting network来对RGB组件进行排序。在# Sum of the min & max of (a, b, c)
def hilo(a, b, c):
if c < b: b, c = c, b
if b < a: a, b = b, a
if c < b: b, c = c, b
return a + c
def complement(r, g, b):
k = hilo(r, g, b)
return tuple(k - u for u in (r, g, b))
下面是一个简短的演示,使用PIL/枕头。在
^{pr2}$
输入图像
输出图像
这是一个Numpy版本complement_image。在我的机器上,它处理“眼镜”图像的速度比前一个版本快3.7倍。在import numpy as np
def complement_image(iname, oname):
print('Loading', iname)
img = Image.open(iname)
#img.show()
in_data = np.asarray(img)
#print(in_data.shape)
print('Complementing...')
lo = np.amin(in_data, axis=2, keepdims=True)
hi = np.amax(in_data, axis=2, keepdims=True)
out_data = (lo + hi) - in_data
out_img = Image.fromarray(out_data)
#out_img.show()
out_img.save(oname)
print('Saved to', oname)