Python- 有没有函数或公式可以找到rgb代码的补色?
Python- Is there a function or formula to find the complementary colour of a rgb code?
我试图在 Python 3 中找到一个很好的公式来计算 rgb 代码的补色,例如。 a = b 的互补。有什么办法吗?
我认为没有现成的解决方案,但标准库中有一个 colorsys 模块,它可以提供帮助。
我认为您首先需要将 RGB 转换为 HSV or HSL,然后是 "rotate" 色调,如果需要,再转换回 RGB。例如(我不确定是否正确旋转):
from colorsys import rgb_to_hsv, hsv_to_rgb
def complementary(r, g, b):
"""returns RGB components of complementary color"""
hsv = rgb_to_hsv(r, g, b)
return hsv_to_rgb((hsv[0] + 0.5) % 1, hsv[1], hsv[2])
下面介绍如何直接计算 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 / Pillow。
#!/usr/bin/env python3
''' Complement the colours in a RGB image
Written by PM 2Ring 2016.10.08
'''
import sys
from PIL import Image
# 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))
def complement_image(iname, oname):
print('Loading', iname)
img = Image.open(iname)
#img.show()
size = img.size
mode = img.mode
in_data = img.getdata()
print('Complementing...')
out_img = Image.new(mode, size)
out_img.putdata([complement(*rgb) for rgb in in_data])
out_img.show()
out_img.save(oname)
print('Saved to', oname)
def main():
if len(sys.argv) == 3:
complement_image(*sys.argv[1:])
else:
fmt = 'Complement colours.\nUsage: {} input_image output_image'
print(fmt.format(sys.argv[0]))
if __name__ == '__main__':
main()
输入图片
输出图像
这是 complement_image
的 Numpy 版本。在我的机器上,它处理 "Glasses" 图像的速度比以前的版本快 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)
r,g,b = [25,25,25]
def get_complementary(color):
color = color[1:]
color = int(color, 16)
comp_color = 0xFFFFFF ^ color
comp_color = "#%06X" % comp_color
return comp_color
hex_val = "#%02x%02x%02x" % (r,g,b)
h = get_complementary(hex_val)
print("Complementary color",h)
h = h.lstrip('#')
print('RGB =', tuple(int(h[i:i+2], 16) for i in (0, 2, 4)))
output:
Complementary color #E6E6E6
RGB = (230, 230, 230)
我试图在 Python 3 中找到一个很好的公式来计算 rgb 代码的补色,例如。 a = b 的互补。有什么办法吗?
我认为没有现成的解决方案,但标准库中有一个 colorsys 模块,它可以提供帮助。
我认为您首先需要将 RGB 转换为 HSV or HSL,然后是 "rotate" 色调,如果需要,再转换回 RGB。例如(我不确定是否正确旋转):
from colorsys import rgb_to_hsv, hsv_to_rgb
def complementary(r, g, b):
"""returns RGB components of complementary color"""
hsv = rgb_to_hsv(r, g, b)
return hsv_to_rgb((hsv[0] + 0.5) % 1, hsv[1], hsv[2])
下面介绍如何直接计算 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 / Pillow。
#!/usr/bin/env python3
''' Complement the colours in a RGB image
Written by PM 2Ring 2016.10.08
'''
import sys
from PIL import Image
# 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))
def complement_image(iname, oname):
print('Loading', iname)
img = Image.open(iname)
#img.show()
size = img.size
mode = img.mode
in_data = img.getdata()
print('Complementing...')
out_img = Image.new(mode, size)
out_img.putdata([complement(*rgb) for rgb in in_data])
out_img.show()
out_img.save(oname)
print('Saved to', oname)
def main():
if len(sys.argv) == 3:
complement_image(*sys.argv[1:])
else:
fmt = 'Complement colours.\nUsage: {} input_image output_image'
print(fmt.format(sys.argv[0]))
if __name__ == '__main__':
main()
输入图片
输出图像
这是 complement_image
的 Numpy 版本。在我的机器上,它处理 "Glasses" 图像的速度比以前的版本快 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)
r,g,b = [25,25,25]
def get_complementary(color):
color = color[1:]
color = int(color, 16)
comp_color = 0xFFFFFF ^ color
comp_color = "#%06X" % comp_color
return comp_color
hex_val = "#%02x%02x%02x" % (r,g,b)
h = get_complementary(hex_val)
print("Complementary color",h)
h = h.lstrip('#')
print('RGB =', tuple(int(h[i:i+2], 16) for i in (0, 2, 4)))
output:
Complementary color #E6E6E6
RGB = (230, 230, 230)