我正在编写一段代码,它必须从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(:));时,它会显示内存不足的错误(wich非常奇怪,因为我刚刚释放了三个相同大小的向量)。是错误吗?(解决了)
是否有可能以更有效的方式进行同样的工作?
编辑:
在使用Martin sugestions之后,我发现没有必要使用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(:,:);发布于 2011-10-23 11:38:06
我相信你想
VNormalizedRed = r(:)./(r(:)+g(:)+b(:));注意/前面的点,它指定一个元素的除法.如果没有这个点,你就是在解一个方程组--这很可能不是你想要做的。这可能也解释了为什么你会看到高内存消耗。
发布于 2011-10-23 23:58:19
可以用一条矢量化行重写整个第一段代码:
im_normalized = bsxfun(@rdivide, im, sum(im,3,'native'));您的第二个稍微修改的版本如下:
im_normalized = bsxfun(@rdivide, im, sqrt(sum(im.^2,3,'native')));顺便说一句,您应该知道用于图像的数据类型,否则可能会得到意想不到的结果(例如,由于整数除法)。因此,在执行规范化计算之前,我会将图像转换为double:
im = im2double(im);https://stackoverflow.com/questions/7865866
复制相似问题