【问题标题】:Matlab: Create RGB matrix depending on values in 2 other matricesMatlab:根据其他 2 个矩阵中的值创建 RGB 矩阵
【发布时间】:2016-09-17 15:06:07
【问题描述】:

抱歉这个愚蠢的问题。我想根据两个矩阵中的值在 matlab 中定义一个 RGB 图像。例如:

  A       B         comparision RGB
|1 0|   |1 0|  -->  |green    red  |
|1 0|   |0 1|  -->  |purple   cyan |

以下代码可以完成这项工作,但非常慢(我知道):

comparision = uint8(zeros([H,W, 3])); 
for i=1:H
  for j=1:W
    if (A(i,j)==1 && B(i,j)==1) %tp
        comparision (i,j,:) = [113 140 0];
    end
    if (A(i,j)==0 && B(i,j)==0) %tn
        comparision (i,j,:) = [200 40 41];
    end
    if (A(i,j)==0 && B(i,j)==1) %fp (false alarm)
        comparision (i,j,:) = [10 130 120];
    end
    if (A(i,j)==1 && B(i,j)==0) %fn 
        comparision (i,j,:) = [120 20 120];
    end
  end
end

我很确定使用 matlab 矩阵功能可以更快地完成它。不幸的是,我总是对 matlab 表示法有点困惑,并且没有成功使用谷歌搜索:-/。

我尝试过这样的事情:

comparision(LabelImage1 == 1 & LabelImage2 == 1) = [255 0 0]

但它没有成功。

谁能帮我更快做到这一点?提前致谢

【问题讨论】:

  • 第三个和第四个条件有什么区别?他们都有A(i,j)==0 && B(i,j)==1
  • 哦,谢谢!那只是一个错字

标签: image matlab matrix rgb


【解决方案1】:

您可以将值 A, B 转换为索引,然后使用 ind2rgb 将这些索引映射到颜色:

indImg = uint8(A.*2 + B);   % generate indices [0..3]
cMap = [1, 0, 0;   % red
        0, 1, 1;   % cyan
        1, 0, 1;   % magenta
        0, 1, 0];  % green
comparison = ind2rgb(indImg, cMap);   % convert indices to cMap RGB values

indexed image 的每个像素值都是color map 的(整数)索引,而不是 RGB 或灰度值。可以直接使用imshow显示这种图片:

imshow(indImg, cMap)

uint8uint16 类型的索引图像是我知道 MATLAB 使用基于 0 的索引的一种情况,这就是为什么上面的索引是 [0..3] 以及为什么 @Divakar 在 cmets 中的替代解决方案有使用indImg+1

函数ind2rgb 只是获取这些索引中的每一个并将它们替换为 3D RGB 值,其中每个值类似于permute(cMap(index), [1 3 2])


为了提高速度,这里有一个有趣的选项:

comparison = cat(3, ~B, B, xor(A,B));

(您可能必须将其转换为 double,我不确定...)

Here 是使用这种方法、我的原始代码和 Divakar 的建议对 ideone 进行的简单比较。由于在线解释器的内存限制,我无法获得超过 2000x2000 的图像大小,但这种方法似乎至少是其他方法的两倍。

【讨论】:

  • 简单的索引可能会更快 - reshape(cMap(indImg+1,:),H,W,[])?
  • @Divakar 是的,但不清楚你在做什么,恕我直言。
  • 好吧,我们只是根据索引从cMap 中选择行,然后重新整形以基本上将每个索引的三个元素推到第三个暗淡中。
  • @Divakar 是的,我明白你在做什么,它们都将索引映射到 RGB 向量,但我认为更直接地理解 ind2rgb 正在这样做而不是 reshape .在可显示的图像尺寸上,任何一个都几乎是瞬时的。
  • 为了完整起见,我会附上一个链接来解释 indexed images 是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
相关资源
最近更新 更多