gpt4 book ai didi

image - 在 Matlab 中将 RGB 图像转换为索引图像而不减少颜色

转载 作者:行者123 更新时间:2023-12-02 09:27:48 24 4
gpt4 key购买 nike

我正在索引图像中进行隐写术。我的问题之一是将 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 维矩阵 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)

最佳答案

如果您确实需要 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

关于image - 在 Matlab 中将 RGB 图像转换为索引图像而不减少颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36172839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com