如何从RGB矩阵形成矢量

时间:2015-01-11 16:32:03

标签: matlab image-processing matrix vector

我在从图像构造矢量时遇到问题。我使用了512 x 512彩色图像并分离了rgb平面。现在我想将这三个平面转换为三个1D向量,这应该在下面的例子中给出。

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

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

我写的程序如下。我使用reshape函数将RGB平面转换为1D向量。现在我无法将它们重新组合成不同的向量。

 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,[]);

我已将2D矩阵R G和B转换为1D向量R1,G1和B1。现在我只需要创建具有所有三个值的新vectores。我不知道如何继续...请帮助...提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

如果所需的索引顺序是颜色,那么,然后是,请使用

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

答案 1 :(得分:2)

好的,根据你的例子,你想要做的是给你一个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

如果您想以 row-major 顺序访问像素,只需更改permute访问尺寸的方式,如下所示:

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

然后您可以正常访问具有上述代码的元素。如果您不想使用线性索引,可以使用reshape重新整形矩阵,使其成为三列矩阵,其中每列都是所需的向量:

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