将rgb图像转换为索引图像而不减少Matlab中的颜色

时间:2016-03-23 08:13:49

标签: image matlab colors rgb indexed-image

我正在索引图像中进行隐写术。我的一个问题是将rgb图像转换为索引图像而不减少颜色。我发现matlab中的rgb2ind函数使用最小方差量化和抖动将rgb转换为索引。我想要的是使这个索引图像的颜色与rgb颜色完全一样。我怎么能这样做?

对于这个例子,在这个代码中我有这个矩阵M并用rgb2ind函数转换它。我期待结果变量Mrgb与矩阵M相等。

library(data.table)

x = data.table(table(strsplit(a, '')[[1]]))
y = data.table(table(strsplit(b, '')[[1]]))

dt = y[x, on='V1'][,N:=ifelse(is.na(N),0,N)][N!=i.N,res:=i.N-N][res>0]

rep(dt$V1, dt$res)
#[1] "E" "R" "X"

更新

我用4-D更新矩阵M.我尝试了Dan的答案中的代码并用% Matrix M M(:,:,1) = [225 230 250 243 20 3 244 247 255 255 242 252 239 0 239 224 27 252 255 255 224 239 28 243 236 231 240 11 255 255 243 252 15 224 15 12 251 0 255 255 224 11 252 227 0 11 232 251 0 255 243 4 255 228 19 4 243 224 0 255 0 255 236 251 228 251 224 243 255 0 19 236 255 224 27 12 251 236 255 0 0 255 255 255 255 255 255 255 255 0 255 0 0 0 0 0 0 0 0 255]; M(:,:,2) =[255 255 255 255 0 0 255 255 255 255 255 255 255 0 255 255 0 255 255 255 255 255 0 255 255 255 255 0 255 255 255 255 0 255 0 0 255 0 255 255 255 0 255 255 0 0 255 255 0 255 255 0 255 255 0 0 255 255 0 255 0 255 255 255 255 255 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 255 255 255 255 255 0 255 0 0 0 0 0 0 0 0 255]; M(:,:,3) = [255 255 255 255 0 0 255 255 255 255 255 255 255 0 0 0 0 255 255 255 255 255 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255]; [Mind map] = rgb2ind(M,255); Mrgb = ind2rgb(Mind, map); Mrgb=im2uint8(Mrgb); isequal(M, Mrgb) 显示图像,但是当它应该是黄色时,图像会变成紫色。我该如何解决?

imshow

2 个答案:

答案 0 :(得分:3)

如果您确实需要256^3的颜色分辨率,那么您可以相当轻松地手动完成,但是,您必须将图像转换回RGB才能查看它,所以我不确定它实际上是否有任何颜色效用

[map, ~, Mind] = unique(reshape(M,[],3), 'rows');
Mind = reshape(Mind, size(M(:,:,1)));

您可以使用sub2ind或像这样重建彩色图像:

z = size(map,1);
Mrgb = cat(3, map(Mind), map(Mind + z), map(Mind + 2*z))

我不确定这是否有任何意义,但也许这就是你想要的。

isequal(M, Mrgb)

返回1

答案 1 :(得分:2)

编辑似乎仍然是rgb2ind将颜色离散化为较低的数字。估值师非常接近(最多4),但仍然不一样。需要另一种方法(例如@ Dan's)。

rgb2ind的第二个参数是颜色的数量,可能的最大值为65,536。只需将代码更改为

即可
[Mind map] = rgb2ind(uint8(M),65536,'nodither');

你可能没有那么多颜色。

注意您的M是代码的两倍,因此rgb2ind并不真正理解值1之上的颜色。将其投放到uint8,您就会得到一张地图。