0

I am having trouble converting an indexed image to RGB and then back from RGB to an indexed image. For some reason, the result is different from the original. I am doing steganography so it can't work if the data is changed.

This is my code and this is the sample image:

enter image description here

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

Variables J and Jind are supposed to be equal. Why are they being detected as being different?

4

1 回答 1

2

首先,我确定这与这个问题有关

问题正在发生,因为如果您实际查看加载图像的颜色图:

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 可能不是玩速记的最佳测试用例。

于 2016-03-06T01:28:06.210 回答