【发布时间】:2016-08-03 16:06:56
【问题描述】:
我正在编写一段代码,它必须从 RGB 图像转换为 rgb 标准化空间。我已经让它使用 for 格式,但运行速度太慢,我需要评估很多图像。我正在尝试对整个功能进行矢量化以加快速度。我目前拥有的如下:
R = im(:,:,1);
G = im(:,:,2);
B = im(:,:,3);
r=reshape(R,[],1);
g=reshape(G,[],1);
b=reshape(B,[],1);
clear R G B;
VNormalizedRed = r(:)/(r(:)+g(:)+b(:));
VNormalizedGreen = g(:)/(r(:)+g(:)+b(:));
VNormalizedBlue = b(:)/(r(:)+g(:)+b(:));
NormalizedRed = reshape(VNormalizedRed,height,width);
NormalizedGreen = reshape(VNormalizedGreen,height,width);
NormalizedBlue = reshape(VNormalizedBlue,height,width);
主要问题是当它到达VNormalizedRed = r(:)/(r(:)+g(:)+b(:)); 时会显示内存不足错误(这真的很奇怪,因为我刚刚释放了三个相同大小的向量)。是错误吗? (已解决)
是否有可能以更有效的方式执行相同的过程?
编辑:
在使用 Martin 的建议后,我发现 reshape 功能不是必需的,可以用简单的代码来做同样的事情:
R = im(:,:,1);
G = im(:,:,2);
B = im(:,:,3);
NormalizedRed = R(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2);
NormalizedGreen = G(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2);
NormalizedBlue = B(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2);
norm(:,:,1) = NormalizedRed(:,:);
norm(:,:,2) = NormalizedGreen(:,:);
norm(:,:,3) = NormalizedBlue(:,:);
【问题讨论】:
-
关于新版本代码的注释:
R(:,:)应该等同于R——因此您应该能够进一步缩短代码,例如NormalizedRed = R./sqrt(R.^2+G.^2+B.^2);
标签: image matlab memory image-processing rgb