使用 numpy 加快图像处理计算速度



我有一个非常简单的方法,可以将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。

最新更新