我有一个非常简单的方法,可以将RGB图像转换为HSL并调整Hue。这对于小图像文件来说相对较快,但是大图像文件需要几分钟才能处理。我正在将imgdata
转换为numpy数组,但这似乎并没有加速它。我是否必须在循环内部使用numpy函数来加快速度?我无法确切地找到瓶颈在循环中的位置,因为它只是相当简单的数学计算。
from colorsys import rgb_to_hls, hls_to_rgb
from numpy import array
def reload_img():
global img, sizew, sizeh, maxsize, imgdata
img = Image.open(IMAGE_SRC)
sizew, sizeh = img.size
maxsize = ((sizew/2)**2 + (sizeh/2)**2)**0.5
imgdata = list(img.getdata())
# Convert to numpy array
imgdata = array(imgdata)
IMAGE_SRC = "test.jpg"
reload_img()
# Adjust Hue
for i in range(0,len(imgdata)):
r,g,b = imgdata[i]
r /= 255.0
g /= 255.0
b /= 255.0
(h, l, s) = rgb_to_hls(r,g,b)
h = .50
imgdata[i] = hls2rgb((h,l,s))
答案 0 :(得分:1)
这是一种快速但不是超精确的方法:
import numpy as np
from PIL import Image
def set_hue(img, hue):
"""
img - a PIL (pillow) image
hue - an integer in the range [0, 255]
Returns a new PIL (pillow) image in HSV mode
"""
hsv = img.convert('HSV')
hsv_ar = np.array(hsv)
hsv_ar[...,0] = hue
out = Image.fromarray(hsv_ar, mode='HSV')
return out
为了使这个工作,可能需要一个稍微版本的Pillow(PIL fork)。它很快,因为它使用缓冲协议在PIL格式和Numpy阵列之间进行转换,反之亦然。但色调修改的精度并不完美,因为中间结果只有每像素24位。
请注意,Pillow没有HSL模式,因此我使用了HSV。