我有一个非常简单的方法,可以将RGB图像转换为HSL并调整色调。这对于小型图像文件的工作速度相对较快,但大型图像文件需要几分钟的处理时间。我正在将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))
这是一个快速但不是超精确的方法:
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
为此,可能需要更新版本的枕头(PIL fork)。它的速度很快,因为它使用缓冲区协议在 PIL 格式和 Numpy 数组之间进行转换,反之亦然。但是色调修改的精度并不完美,因为有一个中间结果,每像素只有 24 位。
请注意,Pillow没有HSL模式,所以我使用了HSV。