如何从 RGB 矩阵形成向量

How to form a vector from RGB matrices

我在从图像构造矢量时遇到了问题。我使用了 512 x 512 彩色图像并分离了 rgb 平面。现在我想将这三个平面转换为三个一维向量,如下例所示。

考虑一个 4x4x3 矩阵。将其转换为 RGB 平面很容易。现在我需要将这三个平面转换为一维向量,如下所示

  V=[r1g1b1....r6]
  W=[g6b6r7...g11] 
  X=[b11r12...B16]

我写的程序如下。我使用重塑函数将 RGB 平面转换为一维向量。现在我很难将它们重新组合成不同的向量。

 A=imread('C:\Users\Desktop\lena.jpg');
 % Extract the individual red, green, and blue color channels.
 R = A(:, :, 1);
 G = A(:, :, 2);
 B = A(:, :, 3);

 R1 = reshape(R.',1,[]);
 G1 = reshape(G.',1,[]);
 B1 = reshape(B.',1,[]);

我已将二维矩阵 R G 和 B 转换为一维向量 R1、G1 和 B1。现在我只需要用所有三个创建新的矢量 values.I 不知道如何继续...请帮忙...提前致谢。

从您的 4x4x3 示例中可以清楚地看出您希望首先使用 颜色索引 进行索引。我假设您随后想要 row,然后是 column。在那种情况下,如果 A 是你的图像(3D 数组),你想要的三个向量是

的列
B = reshape(permute(A,[3 1 2]),[],3);

因此,如果您需要这些向量作为显式变量,

vector1 = B(:,1);
vector2 = B(:,2);
vector3 = B(:,3);

如果需要的索引顺序是color,那么column,那么row,使用

B = reshape(permute(A,[3 2 1]),[],3);

好的,在你的例子中,你想要做的是给定一个 RGB 图像,你想将图像分成 3 个向量,使 RGB 分量交错。这可以很容易地通过首先排列维度来实现。具体可以做的是:

B = permute(A, [3 1 2]);

permute 的作用是重新排列维度,以便生成另一个矩阵。具体来说,我们要做的是我们将在三维中获取每个值,并使它们出现在第一维中。接下来我们将采用 A 的行并将它们展开到列中,最后是 A 的列并使它们遍历每个平面。

结果是每个 将是描述您的图像的唯一 RGB 像素。展开的工作方式是它将按 列主顺序 进行。然后我们可以使用线性索引将它们拆分成数组,如下所示:

N = numel(A)/3;
V = B(1 : N);
W = B(N + 1 : 2*N);
X = B(2*N + 1 : end);

线性索引的作用是使用单个索引访问元素,而不是分别为每个维度建立索引。线性索引在这里的工作方式是,如果我们有一个 X x Y x 3 的图像,在排列之后,图像将被重新整形,使其成为 3 x X x Y 矩阵。 N 在我们的例子中是 单个平面 中的元素总数。因为您试图将图像分成 3 个向量,所以上面计算 N 的操作应该能够除以 3,因为我们要处理三个颜色平面。

通过执行 B(1 : N),我们将以 column-major 格式访问第一个切片、第二个切片中的所有元素,直到我们检索 N 元素。这些被放入 V。然后我们从这一点继续,抓取 N 个元素并将它们放入 W,最后剩下的放入 X.

如果你想访问行优先顺序的像素,你只需要改变permute访问维度的方式,如下所示:

B = permute(A, [3 2 1]);

然后你就可以通过上面的代码正常访问元素了。如果不想使用线性索引,可以使用 reshape 重塑矩阵,使其成为三列矩阵,其中每一列都是所需的向量:

C = reshape(B, [], 3);
V = C(:,1);
W = C(:,2);
X = C(:,3);