У меня есть изображение, которое я прочитал из файла с формой (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
), поэтому я решил обратиться к другим за помощью.