在Octave中线性转换RGB图像的颜色space
Linearly convert color space of RGB image in Octave
我有一个 3x3 矩阵用于线性变换 RGB 颜色。如何使用该矩阵转换 RGB 图像的颜色 space?我应该遍历所有像素并逐个转换它们还是存在更快的方法?
假设您的 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);
我有一个 3x3 矩阵用于线性变换 RGB 颜色。如何使用该矩阵转换 RGB 图像的颜色 space?我应该遍历所有像素并逐个转换它们还是存在更快的方法?
假设您的 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);