2016-03-03 93 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的技巧是不使用python中的'for循環'。 Numpy默認以迭代的方式遍歷ndarray元素,所以試着想出一種分割和使用布爾模板的方法,你會看到巨大的性能提升。 – willnx

+2

我有一段時間有點類似的問題,但它可以幫助你:http://stackoverflow.com/questions/5414638/using-numpy-and-pil-to-convert-56516bit-color-to-88824bit-color - 它曾經是一個for循環,但你可以看到如何刪除和數組操作被使用 – pyInTheSky

+2

另外,如果你可以安裝它,[scikit image](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。