Изменение цветовых пространств с помощью numpy.tensordot - PullRequest
0 голосов
/ 29 мая 2018

У меня есть изображение, которое я прочитал из файла с формой (m,n,3) (т.е. у него есть 3 канала).У меня также есть матрица для преобразования цветового пространства с размерами (3,3).Я уже нашел несколько разных способов применения этой матрицы к каждому вектору на изображении;например,

np.einsum('ij,...j',transform,image)

, похоже, дает те же результаты, что и следующая (гораздо более медленная) реализация.

def convert(im: np.array, transform: np.array) -> np.array:
    """ Convert an image array to another colorspace """
    dimensions = len(im.shape)
    axes = im.shape[:dimensions-1]

    # Create a new array (respecting mutability)
    new_ = np.empty(im.shape)

    for coordinate in np.ndindex(axes):
        pixel            = im[coordinate]
        pixel_prime      = transform @ pixel
        new_[coordinate] = pixel_prime

    return new_

Однако я обнаружил, что при тестировании следующее еще более эффективнона примере изображения с line_profiler .

np.moveaxis(np.tensordot(transform, X, axes=((-1),(-1))), 0, 2)

Проблема, с которой я здесь сталкиваюсь, заключается в использовании просто a np.tensordot, то есть устранение необходимости в np.moveaxis.Я потратил несколько часов, пытаясь найти решение (полагаю, оно зависит от выбора правильного axes), поэтому я решил обратиться к другим за помощью.

1 Ответ

0 голосов
/ 29 мая 2018

Вы можете сделать это кратко с tensordot, если введете image первый аргумент:

np.tensordot(image, transform, axes=(-1, 1))

Вы можете получить лучшую производительность от einsum, используя аргумент optimize=True (требуется numpy1.12 или позже):

np.einsum('ij,...j', transform, image, optimize=True)

Или (как указал Пол Панцер в комментарии), вы можете просто использовать матричное умножение:

image @ transform.T

Все они занимают примерно одинаковое времямой компьютер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...