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

Image 在Matlab中将rgb图像转换为索引图像而不减少颜色,image,matlab,colors,rgb,indexed-image,Image,Matlab,Colors,Rgb,Indexed Image,我正在索引图像中进行隐写术。我的问题之一是在不减少颜色的情况下将rgb图像转换为索引图像。我发现matlab中的rgb2ind函数使用最小方差量化和抖动将rgb转换为索引。我想要的是使这个索引图像的颜色完全像rgb颜色。我该怎么做 例如,在这段代码中,我有这个矩阵M,并用rgb2ind函数转换它。我希望结果变量Mrgb等于矩阵m % Matrix M M(:,:,1) = [225 230 250 243 20 3 244 247 255 255 242 252

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

例如,在这段代码中,我有这个矩阵M,并用rgb2ind函数转换它。我希望结果变量Mrgb等于矩阵m

% 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)
更新

我更新了4-D中的矩阵M。我尝试了Dan答案中的代码,并使用
imshow
显示图像,但当图像本应为黄色时,图像变为紫色。我怎样才能修好它

M(:,:,1,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,1) = [  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,1) = [ 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];


M(:,:,1,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  255  255  255    0  255  255
  255    0  255  255  255  255  255  255    0  255
  255    0  255  255  255  255  255  255    0  255
    0  255  255  255  255  255  255  255  255    0
    0  255  255  255  255  255  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(:,:,2,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  255  255  255    0  255  255
  255    0  255  255  255  255  255  255    0  255
  255    0  255  255  255  255  255  255    0  255
    0  255  255  255  255  255  255  255  255    0
    0  255  255  255  255  255  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,2) = [  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];



[map, ~, Mind] = unique(reshape(M,[],3), 'rows');
[row, col, ~, frame]=size(M);
Mind = reshape(Mind, [row, col, frame]);

%%convert to rgb 
Mrgb=zeros(row, col, 3, frame);
z = size(map,1);
Mrgb = cat(3, map(Mind), map(Mind + z), map(Mind + 2*z));
Mrgb = reshape(Mrgb, [row, col,3, frame]);

map=uint8(map);
map=im2double(map);

imshow(Mind(:,:,1), map)

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


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

[Mind map] = rgb2ind(uint8(M),65536,'nodither');
你可能不会有那么多颜色


注意您的
M
在代码中是一个双精度字符,因此
rgb2ind
无法真正理解值
1
上方的颜色。将其投射到
uint8
,您将获得一张地图。

如果您确实需要
256^3
的颜色分辨率,那么您可以相当轻松地手动执行此操作,但是,您必须将图像转换回RGB才能查看它,因此我不确定此操作是否有任何实用性:

[map, ~, Mind] = unique(reshape(M,[],3), 'rows');
Mind = reshape(Mind, size(M(:,:,1)));
您可以使用以下方法重建彩色图像:

z = size(map,1);
Mrgb = cat(3, map(Mind), map(Mind + z), map(Mind + 2*z))
我不确定这是否有意义,但也许这正是你想要的

isequal(M, Mrgb)

返回
1

在我的情况下,这没有什么区别。转换后,我需要变量M和Mrgb中的数据完全相同。一旦你得到
map
,你不能将其传递到
rgb2ind(M,map)
?(假设
numel(地图)@Dan非常感谢Dan,是的,这就是我需要的。你能帮我转换成带有4-D数组的索引图像吗?我在我的设置中更新了矩阵。@Fitri这是一个不同的问题,我建议你作为一个单独的问题来问。但我首先想知道为什么你不能对
循环使用一个简单的
为此,我已经从我的第一个问题中得到了答案。谢谢:)