Image RGB到范数RGB转换。矢量化

Image RGB到范数RGB转换。矢量化,image,matlab,memory,image-processing,rgb,Image,Matlab,Memory,Image Processing,Rgb,我正在写一段代码,它必须从RGB图像转换到RGB规范化空间。我已经让它与一个为格式,但它运行太慢,我需要评估大量的图像。我正在尝试对整个函数进行矢量化,以加快它的速度。我目前的情况如下: 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;

我正在写一段代码,它必须从RGB图像转换到RGB规范化空间。我已经让它与一个为格式,但它运行太慢,我需要评估大量的图像。我正在尝试对整个函数进行矢量化,以加快它的速度。我目前的情况如下:

     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 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(:,:);
我相信你想要

VNormalizedRed = r(:)./(r(:)+g(:)+b(:));

注意
/
前面的点,它指定了一个元素对一个元素的划分。没有圆点,你就是在解一个方程组——这可能不是你想要做的。这可能也解释了为什么会出现高内存消耗。

您的第一个完整代码可以在一个矢量化行中重写:

im_normalized = bsxfun(@rdivide, im, sum(im,3,'native'));
您的第二个稍微修改的版本为:

im_normalized = bsxfun(@rdivide, im, sqrt(sum(im.^2,3,'native')));
顺便说一句,您应该知道用于图像的数据类型,否则可能会得到意外的结果(例如由于整数除法)。因此,在执行标准化计算之前,我会将图像转换为
double

im = im2double(im);

关于新版本代码的注释:
R(:,:)
应该与
R
等效——因此您应该能够进一步缩短代码,例如
normalized=R./sqrt(R.^2+g.^2+B.^2)