如何从 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);
我在从图像构造矢量时遇到了问题。我使用了 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);