用numpy加速图像处理计算

时间:2016-03-03 04:47:28

标签: python numpy

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

1 个答案:

答案 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。