我正在编写一段代码,必须从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 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(:,:);
答案 0 :(得分:5)
我相信你想要
VNormalizedRed = r(:)./(r(:)+g(:)+b(:));
注意/
前面的点,它指定了逐个元素的除法。没有点,你就是在解决一个方程组 - 这可能不是你想要做的。这也可能解释了为什么你会看到高内存消耗。
答案 1 :(得分:1)
您的整个第一个代码可以在一个矢量化的行中重写:
im_normalized = bsxfun(@rdivide, im, sum(im,3,'native'));
您的第二个略微修改的版本:
im_normalized = bsxfun(@rdivide, im, sqrt(sum(im.^2,3,'native')));
顺便说一下,你应该知道用于图像的数据类型,否则会得到意想不到的结果(例如由于整数除法)。因此,在执行规范化计算之前,我会将图像转换为double
:
im = im2double(im);