Линейно конвертировать цветовое пространство изображения RGB в октаве - PullRequest
0 голосов
/ 08 апреля 2019

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

1 Ответ

2 голосов
/ 09 апреля 2019

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

new_p = M * p;

p вектором столбца), тогда вы можете преобразоватьn x m 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);
...