【问题标题】:Convert rgb image to an indexed image without decreasing the colors in Matlab将 rgb 图像转换为索引图像而不减少 Matlab 中的颜色
【发布时间】:2016-07-10 10:18:07
【问题描述】:

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

【问题讨论】:

    标签: image matlab colors rgb indexed-image


    【解决方案1】:

    如果您真的需要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

    【讨论】:

    • 一旦你得到map,你不能把它传递给rgb2ind(M, map)吗? (假设numel(map) <= 65536
    • @Dan 非常感谢 Dan,是的,这就是我需要的。你能帮我用 4-D 数组转换成索引图像吗?我在我的问题中更新了矩阵。
    • @Fitri 这是一个不同的问题,我建议您将其作为一个单独的问题提出。但我首先想知道为什么你不能只使用一个简单的for 循环?
    • @Dan 好的,我为此创建了新问题。我已经从我的第一个问题中得到了答案。谢谢:)
    【解决方案2】:

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


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

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

    你可能不会有那么多颜色。

    注意您的 M 是代码中的双精度值,因此 rgb2ind 并不能真正理解高于 1 值的颜色。将其投射到uint8,您将获得一张地图。

    【讨论】:

    • 在我的情况下没有区别。我需要变量M和Mrgb中的数据转换后完全一样。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2016-01-25
    • 2018-08-26
    • 1970-01-01
    • 2012-02-26
    • 2020-03-04
    相关资源
    最近更新 更多