在Matlab中从具有多个列的另一个矩阵的行构造单列矩阵

时间:2018-11-06 21:25:58

标签: matlab image-processing matrix rgb

我正在学习图像处理,目前正在RGB和YCbCr之间转换。

基本上,我有一个nxmx3矩阵,它代表每种颜色(RGB)的亮度,将其更改为Y,Cb和Cr的操作将是这样的:

for each row, index, in RGBMatrix:
    y[index] = row[0] + row[1] + row[2]

因此y的每一行都有一个值,并且该值基于RGBMatrix中相同的值。

我已经在MATLAB中尝试了以下方法:

function [y,Cb, Cr] = rgbToYCbCr(r,g,b)

signalSize = size(r);
y = zeros(signalSize);
for i = 1:signalSize(1)
  for j = 1:signalSize(2)
      y(i,j,1) = (0.299 * r(i,j,1)) + (0.587 * g(i,j,2)) + (0.114 * b(i,j,3));
  end
end
end

但是,这并没有给我我想要的结果,因为它现在具有与RGBMatrix相同的尺寸,而应该是1列。

如何在MATLAB中有效地做到这一点?

我知道从RGB到YCbCr都有一个内置函数,但是为了学习,我想自己实现它。

示例:

RGB矩阵:

  R G B
[[0.5,0.5,0.5],
 [0.2,0.1,0.6],
 [0.1,0.4,0.7]]

Y矩阵:

[[0.5+0.5+0.5],
 [-0.2-0.1+0.6],
 [0.1+0.4-0.7]]

[[1.5],
 [0.3],
 [-0.2]]

忽略值不现实的事实,我更关心的是像Matlab中描述的那样对每行执行一个操作,而没有使用(通常)较慢的迭代方式(带有for循环)。

实际上,我有一个1080x768x3的阵列。 1080x768尺寸中的每个元素都有每种颜色(R,G,B)的值,我最终希望将其转换为(Y,Cb,Cr)。

2 个答案:

答案 0 :(得分:2)

如果您有RGB图像,大小为Imgrgb的{​​{1}},请执行以下操作:

NxMx3

Imgrgb= imread('peppers.png'); % A sample RGB image % make sure you have a double image range [0-1], you may not need this. Imgrgb=im2double(Imgrgb); r=Imgrgb(:,:,1); g=Imgrgb(:,:,2); b=Imgrgb(:,:,3); y = (0.299 * r) + (0.587 * g) + (0.114 * b); Cb= Cr= % concatenate result: ImgYCbCr=cat(3,y,Cb,Cr); 应该是y,与NxMrg相同。对其他两个值及其相应的方程式进行相同的操作。

答案 1 :(得分:0)

如果您的矩阵类似于:

A =
     1     3     5
     2     4     6

然后您可以将其“展平”为矢量,例如:

>>Av = A(:)
Av =
    1
    2
    3
    4
    5
    6

即它以行顺序从矩阵中获取值,然后转换为向量。 要将其转换回矩阵,您可以使用reshape函数

>> reshape(Av,[2 3])
ans =
     1     3     5
     2     4     6

A(:)方法等效于reshape(A,[numel(A) 1])