在不丢失数据的情况下将图像转换并索引为 RGB 并返回

Convert and indexed image to RGB and back without losing data

我无法将索引图像转换为 RGB,然后再从 RGB 转换回索引图像。由于某种原因,结果与原始结果不同。我正在做隐写术,所以如果数据被更改,它就无法工作。

这是我的代码,这是示例图片:

[J map]=imread('expert.gif');
Jrgb=ind2rgb(J,map);
Jind=rgb2ind(Jrgb,map);
isequal(J,Jind)

变量 JJind 应该是相等的。为什么它们被检测为不同?

首先,我确定这与有关。

出现此问题是因为如果您实际查看加载图像的颜色图:

map = 
       0         0         0
  0.6275    0.3216    0.1765
  0.4902    0.4902    0.4902
  0.8039    0.5216    0.2471
  0.7451    0.7451    0.7451
  0.8627    0.8627    0.8627
  0.9020    0.9020    0.9804
       0         0         0

您会看到黑色 (0,0,0) 实际上存在两次,因此 index = 0 和 index = 7 将在 RGB 图像中解析为黑色。

当您转换回索引图像时,MATLAB 将对这两个图像使用相同的索引(因为它们显然是相同的颜色),即使您传递给 rgb2ind 的颜色图也是如此是相同的颜色图。

这就解释了为什么您看到的差异是透明像素所在的位置(外围)。

就处理这个问题而言,我认为这有点棘手。不幸的是 imread 的透明度(第三输出)输出是一个空数组。

您可能会更改输入颜色图,使第一行和最后一行 相同(将最后一行设置为 1)然后您应该得到类似的东西.

map(end,:) = 1;
rgb = ind2rgb(J, map);
ind = rgb2ind(rgb, map);
isequal(J, ind);

一般来说,由于 MATLAB 的限制,具有透明度的 GIF 可能不是玩速记的最佳测试用例。