我正在编写一段代码,需要将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(:));
时,出现了内存溢出错误(这真的很奇怪,因为我刚刚释放了三个相同大小的向量)。错误在哪里?(已解决)有没有更有效率的方法来完成同样的过程? 编辑: 使用马丁的建议后,我发现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);
- Martin B