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]
但它没有成功。
任何人都可以帮助我更快吗?提前致谢
答案 0 :(得分:5)
您可以将值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)
uint8
或uint16
类型的索引图像是我所知道的MATLAB使用基于0的索引的情况,这就是为什么上面的索引是[0..3]
以及为什么@Divakar的评论中的备用解决方案必须使用indImg+1
。
函数ind2rgb只需获取每个索引,并用3D RGB值替换它们,每个值都类似于permute(cMap(index), [1 3 2])
。
为了提高速度,这里有一个有趣的选择:
comparison = cat(3, ~B, B, xor(A,B));
(您可能需要将其转换为double
,我不确定...)
Here是使用这种方法,我的原始代码和Divakar的建议对ideone进行的简单比较。由于在线翻译的内存限制,我无法将图像大小设置在2000x2000以上,但这种方法似乎至少是其他方法的两倍。