2016-03-03 4 views
0

У меня есть очень простой метод, который преобразует изображение RGB в HSL и настраивает оттенок. Это работает относительно быстро с небольшими файлами изображений, но для больших файлов изображений требуются минуты для обработки. Я преобразовываю imgdata в массив numpy, но это, кажется, не ускоряет его вообще. Должен ли я использовать функции 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

Трюк с numpy заключается в том, чтобы не использовать «цикл for» в python. По умолчанию Numpy выполняет итерацию по элементу ndarray, поэтому попробуйте придумать способ среза и использовать логические маски, и вы увидите огромное увеличение производительности. – willnx

+2

У меня был несколько схожий вопрос, возможно, он может вам помочь: http://stackoverflow.com/questions/5414638/using-numpy-and-pil-to-convert-56516bit-color-to-88824bit-color - он использовался для цикла, но вы можете видеть, как это было удалено, и использовались операции с массивами. – pyInTheSky

+2

Кроме того, если вы можете установить его, [изображение scikit] (http://scikit-image.org/docs/ dev/api/skimage.color.html # rgb2hsv) уже решил эту проблему через Numpy. – willnx

ответ

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 вилки), вероятно, требуется. Это быстро, потому что он использует буферный протокол для преобразования между форматом PIL и массивом Numpy и наоборот. Но точность модификации оттенка не идеальна, потому что есть промежуточный результат с 24 бит на пиксель.

Обратите внимание, что подушка не имеет режима HSL, поэтому я использовал HSV.

Смежные вопросы