【发布时间】:2019-09-11 00:03:52
【问题描述】:
假设您有一个 200 像素的图像。它将是一个 10 x 20 x 3 的阵列,其中页面是颜色层(红色、绿色和蓝色)。如何将其转换为 3(行)x N(列,例如 2000),以便每一行代表颜色(第 1 行是红色,第 2 行是绿色等),列代表像素
我尝试过整形,但我得到了一个 3 x N 矩阵,它向下填充行而不是水平填充(所以每一行都是颜色的混合,而不是特定的颜色)。
【问题讨论】:
标签: matlab
假设您有一个 200 像素的图像。它将是一个 10 x 20 x 3 的阵列,其中页面是颜色层(红色、绿色和蓝色)。如何将其转换为 3(行)x N(列,例如 2000),以便每一行代表颜色(第 1 行是红色,第 2 行是绿色等),列代表像素
我尝试过整形,但我得到了一个 3 x N 矩阵,它向下填充行而不是水平填充(所以每一行都是颜色的混合,而不是特定的颜色)。
【问题讨论】:
标签: matlab
您使用reshape 的想法是正确的,但正如您自己发现的那样,数组维度的顺序很重要。幸运的是,您可以使用permute 进行操作。因此,在您的情况下,应将“颜色信息”(即第三维)设置为第一维,以便 reshape 按预期工作。
让我们看看这段代码sn-p:
% Set up dimensions
rows = 10;
cols = 20;
% Generate artificial image
img = uint8(255 * rand(rows, cols, 3));
% Get color independently for each channel
r = reshape(img(:, :, 1), 1, rows * cols);
g = reshape(img(:, :, 2), 1, rows * cols);
b = reshape(img(:, :, 3), 1, rows * cols);
% Reshape image with previous dimension permuting
img2 = reshape(permute(img, [3 1 2]), 3, rows * cols);
% Compare results
rOK = (sum(r == img2(1, :)) == rows * cols)
gOK = (sum(g == img2(2, :)) == rows * cols)
bOK = (sum(b == img2(3, :)) == rows * cols)
为了进行简单的比较,我单独获取了“颜色信息”,参见。向量r、g 和b。然后我按照上面的描述对原始的img 进行置换,根据需要将其重新整形为3 x N 矩阵,并将每一行与r、g 和b 进行比较。
希望有帮助!
【讨论】: