У меня есть матрица 3x3, используемая для линейного преобразования цветов RGB. Как я могу преобразовать цветовое пространство изображения RGB, используя эту матрицу? Должен ли я перебирать все пиксели и преобразовывать их один за другим, или существует более быстрый способ?
Линейно преобразовать цветовое пространство изображения RGB в октаву
comment
Отметьте тегом либо Octave, или MATLAB, если ваша проблема не касается конкретно обоих языков. Могут быть решения, допустимые на одном языке, которые недопустимы на другом. См. выдержки из тегов как octave, так и matlab пожалуйста.
- person Adriaan   schedule 08.04.2019
Ответы (1)
Предполагая, что ваша матрица 3x3 M
должна быть умножена на значение вашего пикселя p
следующим образом:
new_p = M * p;
(с p
вектором-столбцом), вы можете преобразовать матрицу изображения n
xm
x3 следующим образом:
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
Захватил эту ветку комментариев только для того, чтобы сказать, что мне понравилось просматривать ваш блог, Крис. Может быть, я должен, наконец, начать свой ...
- person Tasos Papastylianou; 09.04.2019
@Tasos: Спасибо! И да, вам следует завести блог. Уверен, вам есть чем поделиться.
- person Cris Luengo; 09.04.2019