RGB到规范rgb转换.矢量化

jsa*_*dor 3 memory rgb matlab image image-processing

我正在编写一段代码,必须从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);
Run Code Online (Sandbox Code Playgroud)

主要的问题是当它到达VNormalizedRed = r(:)/(r(:)+g(:)+b(:));它时会显示一个内存不足错误(这真的很奇怪,因为我刚刚释放了三个相同大小的向量).这是错误吗?(已解决)

它可以以更有效的方式完成相同的过程吗?

编辑:

在使用Martin sugestions之后,我发现重塑功能不是必需的,能够用简单的代码做同样的事情:

     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(:,:);
Run Code Online (Sandbox Code Playgroud)

Mar*_*n B 5

我相信你想要的

VNormalizedRed = r(:)./(r(:)+g(:)+b(:));
Run Code Online (Sandbox Code Playgroud)

注意前面的点/,它指定逐个元素的除法.没有点,你就是在解决一个方程组 - 这可能不是你想要做的.这也可能解释了为什么你会看到高内存消耗.