【问题标题】:RGB to norm rgb transformation. VectorizingRGB 到标准 rgb 转换。矢量化
【发布时间】:2016-08-03 16:06:56
【问题描述】:

我正在编写一段代码,它必须从 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 的建议后,我发现 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);

标签: image matlab memory image-processing rgb


【解决方案1】:

我相信你想要

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

注意/ 前面的点,它指定了逐个元素的划分。没有点,你正在求解一个方程组——这可能不是你想做的。这可能也解释了为什么您会看到高内存消耗。

【讨论】:

    【解决方案2】:

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

    im_normalized = bsxfun(@rdivide, im, sum(im,3,'native'));
    

    您的第二个稍作修改的版本为:

    im_normalized = bsxfun(@rdivide, im, sqrt(sum(im.^2,3,'native')));
    

    顺便说一句,您应该注意用于图像的数据类型,否则可能会得到意想不到的结果(例如,由于整数除法)。因此,我会在执行归一化计算之前将图像转换为double

    im = im2double(im);
    

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 2020-08-19
      • 2013-07-11
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2021-08-24
      • 2012-11-25
      相关资源
      最近更新 更多