Image RGB到范数RGB转换。矢量化
我正在写一段代码,它必须从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;
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)代码>