Matlab 如何从RGB矩阵形成向量

Matlab 如何从RGB矩阵形成向量,matlab,image-processing,matrix,vector,Matlab,Image Processing,Matrix,Vector,我在从图像构造向量时遇到了一个问题。我使用了512 x 512彩色图像,并将rgb平面分开。现在我想把这三个平面转换成三个一维向量,如下例所示 考虑一个4x3矩阵。将其转换为RGB平面很容易。现在我需要将这三个平面转换成一维向量,如下所示 V=[r1g1b1....r6] W=[g6b6r7...g11] X=[b11r12...B16] 我写的程序如下。我使用重塑函数将RGB平面转换为一维向量。现在我很难将它们重新组合成不同的向量 A=imread('C:\Users\Des

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

考虑一个4x3矩阵。将其转换为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,[]);

我已经将二维矩阵rg和B转换成一维向量R1、G1和B1。现在我只需要用这三个值创建新的矢量。我不知道如何继续…请提供帮助…提前感谢。

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

B = reshape(permute(A,[3 1 2]),[],3);
所以,如果你需要这些向量作为显式变量

vector1 = B(:,1);
vector2 = B(:,2);
vector3 = B(:,3);
如果所需的索引顺序是颜色、列、行,请使用


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

B = reshape(permute(A,[3 1 2]),[],3);
所以,如果你需要这些向量作为显式变量

vector1 = B(:,1);
vector2 = B(:,2);
vector3 = B(:,3);
如果所需的索引顺序是颜色、列、行,请使用


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

B = permute(A, [3 1 2]);
它的作用是重新排列维度,从而生成另一个矩阵。具体来说,我们将要做的是,我们将在第三维中获取每个值,并使它们出现在第一维中。接下来,我们将把
A
的行展开成列,最后是
A
的列,并使它们穿过每个平面

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

N = numel(A)/3;
V = B(1 : N);
W = B(N + 1 : 2*N);
X = B(2*N + 1 : end);
B = permute(A, [3 2 1]);
线性索引的工作是使用单个索引访问元素,而不是单独索引每个维度。线性索引在这里的工作原理是,如果我们有一个图像是
xxyx3
,经过排列后,该图像将被重塑,从而成为
3xxy
矩阵
N
在我们的例子中是单个平面中的元素总数。由于您试图将图像分割为3个向量,因此上面计算
N
的操作应该能够平均除以3,因为我们要处理三个颜色平面

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

如果您想以行主键顺序访问像素,只需更改
permute
访问维度的方式,如下所示:

N = numel(A)/3;
V = B(1 : N);
W = B(N + 1 : 2*N);
X = B(2*N + 1 : end);
B = permute(A, [3 2 1]);
然后,您可以正常地使用上述代码访问元素。如果不想使用线性索引,可以使用来重塑矩阵,使其成为一个三列矩阵,其中每列都是所需的向量:

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

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

B = permute(A, [3 1 2]);
它的作用是重新排列维度,从而生成另一个矩阵。具体来说,我们将要做的是,我们将在第三维中获取每个值,并使它们出现在第一维中。接下来,我们将把
A
的行展开成列,最后是
A
的列,并使它们穿过每个平面

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

N = numel(A)/3;
V = B(1 : N);
W = B(N + 1 : 2*N);
X = B(2*N + 1 : end);
B = permute(A, [3 2 1]);
线性索引的工作是使用单个索引访问元素,而不是单独索引每个维度。线性索引在这里的工作原理是,如果我们有一个图像是
xxyx3
,经过排列后,该图像将被重塑,从而成为
3xxy
矩阵
N
在我们的例子中是单个平面中的元素总数。由于您试图将图像分割为3个向量,因此上面计算
N
的操作应该能够平均除以3,因为我们要处理三个颜色平面

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

如果您想以行主键顺序访问像素,只需更改方式即可