在不丢失数据的情况下将图像转换并索引为 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)
变量 J
和 Jind
应该是相等的。为什么它们被检测为不同?
首先,我确定这与有关。
出现此问题是因为如果您实际查看加载图像的颜色图:
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 可能不是玩速记的最佳测试用例。
我无法将索引图像转换为 RGB,然后再从 RGB 转换回索引图像。由于某种原因,结果与原始结果不同。我正在做隐写术,所以如果数据被更改,它就无法工作。
这是我的代码,这是示例图片:
[J map]=imread('expert.gif');
Jrgb=ind2rgb(J,map);
Jind=rgb2ind(Jrgb,map);
isequal(J,Jind)
变量 J
和 Jind
应该是相等的。为什么它们被检测为不同?
首先,我确定这与
出现此问题是因为如果您实际查看加载图像的颜色图:
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 可能不是玩速记的最佳测试用例。