在Octave中线性转换RGB图像的颜色space

Linearly convert color space of RGB image in Octave

我有一个 3x3 矩阵用于线性变换 RGB 颜色。如何使用该矩阵转换 RGB 图像的颜色 space?我应该遍历所有像素并逐个转换它们还是存在更快的方法?

假设您的 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);