У меня есть очень простой метод, который преобразует изображение 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))
Трюк с numpy заключается в том, чтобы не использовать «цикл for» в python. По умолчанию Numpy выполняет итерацию по элементу ndarray, поэтому попробуйте придумать способ среза и использовать логические маски, и вы увидите огромное увеличение производительности. – willnx
У меня был несколько схожий вопрос, возможно, он может вам помочь: http://stackoverflow.com/questions/5414638/using-numpy-and-pil-to-convert-56516bit-color-to-88824bit-color - он использовался для цикла, но вы можете видеть, как это было удалено, и использовались операции с массивами. – pyInTheSky
Кроме того, если вы можете установить его, [изображение scikit] (http://scikit-image.org/docs/ dev/api/skimage.color.html # rgb2hsv) уже решил эту проблему через Numpy. – willnx