RGB转换为标准RGB。矢量化

3

我正在编写一段代码,需要将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(:));时,出现了内存溢出错误(这真的很奇怪,因为我刚刚释放了三个相同大小的向量)。错误在哪里?(已解决
有没有更有效率的方法来完成同样的过程? 编辑: 使用马丁的建议后,我发现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(:,:);

关于你代码的新版本说明:R(::)应该简单等同于 R - 所以你应该能够进一步缩短你的代码,例如 NormalizedRed = R./sqrt(R.^2+G.^2+B.^2); - Martin B
2个回答

5

我相信您需要的是:

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

请注意标志着逐个元素除法的斜杠前面的点。如果没有这个点,您正在解决一个方程组——这很可能不是您想要做的事情。这可能也解释了为什么您看到内存消耗很高。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接