我无法将索引图像转换为RGB,然后从RGB转换回索引图像。由于某种原因,结果与原始结果不同。我正在做隐写术,所以如果数据发生变化它就无法工作。
这是我的代码,这是示例图片:
[J map]=imread('expert.gif');
Jrgb=ind2rgb(J,map);
Jind=rgb2ind(Jrgb,map);
isequal(J,Jind)
变量J
和Jind
应该是相等的。为什么他们被发现是不同的?
答案 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
的色彩图是相同的色彩图。
这就解释了为什么你所看到的差异是透明像素的位置(围绕外围)。
就处理这个问题而言,我认为这有点棘手。不幸的是imread
的透明度(第三输出)输出是一个空数组。
您可能会更改输入色彩映射,以使第一行和最后一行不是相同(将最后一行设置为1),然后您应该获得可比较的内容。
map(end,:) = 1;
rgb = ind2rgb(J, map);
ind = rgb2ind(rgb, map);
isequal(J, ind);
一般情况下,由于MATLAB的限制,具有透明度的GIF可能不是玩速记的最佳测试案例。