Ускорение применения картирования к изображению - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь преобразовать RGB в серое изображение того же размера (со значениями от 0 до 1). Сопоставление выполняется с помощью словаря с именем MASK_LUT_IDX, который принимает кортеж (RGB) и возвращает соответствующее значение. Текущий код в 2 раза быстрее, чем раньше, но все равно занимает 1,5 с (согласно timeit), что является проблемой.

import numpy as np

def quickConv(numpy_triple):
    return MASK_LUT_IDX[tuple(numpy_triple)]

def ImageSegmenter(masked_img):
    rgb_tuples = np.array(masked_img.getdata(), dtype=tuple)
    class_idxs = np.apply_along_axis(quickConv, 1,rgb_tuples)
    return np.array(class_idxs).reshape(masked_img.size[1],masked_img.size[0])


class_img = ImageSegmenter(masked_img)

Есть ли лучший способ конвертировать это? Я изучил функциональные возможности палитры, но она не совсем соответствует моим потребностям.

1 Ответ

1 голос
/ 11 марта 2020

Благодаря помощи Криса Луена go, здесь приведена ускоренная версия функции.

def ImageSegmenter(masked_img):
    masked_img = np.array(masked_img)
    class_idxs = FASTER_MASK_LUT_IDX[masked_img[:,:,0],masked_img[:,:,1],masked_img[:,:,2]]
    return class_idxs

Где FASTER_MASK_LUT_IDX - это набор трехмерных тензоров, заданный

FASTER_MASK_LUT_IDX = np.zeros((256,256,256))
for idx,label in zip(CLASS_IDX,CLASS_LABELS):
    red_idx = RGB_CLASS_MAPPING[label]['R']
    green_idx = RGB_CLASS_MAPPING[label]['G']
    blue_idx = RGB_CLASS_MAPPING[label]['B']
    FASTER_MASK_LUT_IDX[red_idx,green_idx,blue_idx] = idx/NUM_CLASSES

RGB_CLASS_MAPPING отображает значение RGB в класс, который был развернут с использованием enumerate для создания CLASS_IDX и CLASS_LABELS с использованием понимания списка.

CLASS_IDX,CLASS_LABELS = zip(*[(idx,label for idx,label in enumerate(RGB_CLASS_MAPPING)])
...