【问题标题】:Construct single column matrix from the rows of another matrix with multiple columns in Matlab [duplicate]在Matlab中从另一个具有多列的矩阵的行构造单列矩阵[重复]
【发布时间】:2019-04-10 08:08:18
【问题描述】:

我正在学习图像处理,目前正在 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

但是,这并没有给我想要的结果,因为 y 现在与 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)。

【问题讨论】:

  • 不太清楚你在问什么。在您的示例中,rgb 是什么?也许this post 有帮助?
  • @gnovice 希望这个例子有帮助
  • “但是,这并没有给我想要的结果,因为 y 现在与 RGBMatrix 具有相同的尺寸,而它应该是 1 列。” .... 不?如果你有一个颜色转换,输出应该与输入具有相同的形状,最肯定的是。在您的数字示例中,r 是 1x3,bg 也是如此,因此 y 是 1x3。实际情况下rbg都是1080x768,所以一定是y
  • @AnderBiguri 我的 y 是 1080x768x3,这肯定没有任何意义,因为每个像素只有一个亮度值,对吧?
  • 在你的新(和更糟糕的)代码中,定义signalSize =[size(r,1),size(r,2)]; 来解决问题。

标签: matlab image-processing matrix rgb


【解决方案1】:

如果你的矩阵是这样的:

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])

【讨论】:

  • Matlab 是列优先的,因此它在沿行方向移动之前获取每个 的值。否则,这是正确的答案。
  • 欢迎来到 SO!不幸的是,这不是我想要的,希望这个例子能解决问题
【解决方案2】:

如果您有一个 RGB 图像,Imgrgb 的大小为 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 应该是NxM,与rgb 相同。对其他 2 个值及其对应的方程执行相同操作。

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多