2015-01-11 100 views
0

我在构建图像矢量时遇到了问题。我曾经使用过512 x 512彩色图像并分隔了rgb平面。现在我想将这三个平面转换为三个一维向量,应该如下例所示。如何从RGB矩阵形成矢量

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

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

编写的程序如下。我使用重塑功能将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,[]); 

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

回答

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),直到我们取得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); 
+1

非常感谢你,先生... –

+0

@AbiramiAnbalagan - 我的荣幸!我希望你能接受我们的答案。我自己和路易斯门多大约在同一时间发布。 – rayryeng

+0

@rayryeng但是你像往常一样,更好地解释它:-) –

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); 
+0

嗯,你没上来与答案第一:)顺便说一句,忘了给你+1。刚刚做到了! – rayryeng

+0

非常感谢你,先生... –