转换并将图像转换为RGB并返回而不会丢失数据

时间:2016-03-06 00:59:39

标签: matlab image-processing rgb steganography indexed-image

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

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

enter image description here

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

变量JJind应该是相等的。为什么他们被发现是不同的?

1 个答案:

答案 0 :(得分:2)

首先,我确定这与this question有关。

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

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的色彩图是相同的色彩图。

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

enter image description here

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

您可能会更改输入色彩映射,以使第一行和最后一行不是相同(将最后一行设置为1),然后您应该获得可比较的内容。

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

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