在Matlab中从另一个具有多列的矩阵的行构造单列矩阵
Construct single column matrix from the rows of another matrix with multiple columns in Matlab
我正在学习图像处理,目前正在 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)。
如果你的矩阵是这样的:
A =
1 3 5
2 4 6
然后您可以 "flatten" 将其转换为如下向量:
>>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])
如果您有 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
,与r
、g
和b
相同。使用相应的方程对其他 2 个值执行相同的操作。
我正在学习图像处理,目前正在 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)。
如果你的矩阵是这样的:
A =
1 3 5
2 4 6
然后您可以 "flatten" 将其转换为如下向量:
>>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])
如果您有 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
,与r
、g
和b
相同。使用相应的方程对其他 2 个值执行相同的操作。