在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(。

如果您有一个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个值及其相应的方程式执行相同操作。

如果您的矩阵类似于:

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

相关内容

  • 没有找到相关文章

最新更新