Линейно преобразовать цветовое пространство изображения RGB в октаву

У меня есть матрица 3x3, используемая для линейного преобразования цветов RGB. Как я могу преобразовать цветовое пространство изображения RGB, используя эту матрицу? Должен ли я перебирать все пиксели и преобразовывать их один за другим, или существует более быстрый способ?


person PrinceOfBorgo    schedule 08.04.2019    source источник
comment
Отметьте тегом либо Octave, или MATLAB, если ваша проблема не касается конкретно обоих языков. Могут быть решения, допустимые на одном языке, которые недопустимы на другом. См. выдержки из тегов как octave, так и matlab пожалуйста.   -  person Adriaan    schedule 08.04.2019


Ответы (1)


Предполагая, что ваша матрица 3x3 M должна быть умножена на значение вашего пикселя p следующим образом:

new_p = M * p;

p вектором-столбцом), вы можете преобразовать матрицу изображения nxmx3 следующим образом:

m = 1920;
n = 1080; 
img = rand(n, m, 3);
tmp = reshape(img, [], 3); % no copy made
tmp = tmp * M.';
new_img = reshape(tmp, n, m, 3);

Обратите внимание, что здесь мы преобразовали M * p в p.' * M.', так что нам не нужно транспонировать изображение, что потребовало бы копирования всех его данных в новый массив. Транспонирование M намного дешевле, чем транспонирование tmp.

Вы можете сделать это в одной строке, избегая необходимости в массиве tmp:

new_img = reshape(reshape(img, [], 3) * M.', n, m, 3);
person Cris Luengo    schedule 08.04.2019
comment
Захватил эту ветку комментариев только для того, чтобы сказать, что мне понравилось просматривать ваш блог, Крис. Может быть, я должен, наконец, начать свой ... - person Tasos Papastylianou; 09.04.2019
comment
@Tasos: Спасибо! И да, вам следует завести блог. Уверен, вам есть чем поделиться. - person Cris Luengo; 09.04.2019