图像压缩

Image compression

我有一个调色板,有 4 种颜色。这些颜色是白色、绿色、黄色和橙色。这些颜色的 RBG 值分别为 (255, 255, 255) (0, 255, 0) (255, 120, 0) (255, 255, 0)。图像是 8 x 8 像素的 RGB 图像。我想计算存储此压缩图像需要多少位。

我不确定,因为如果需要 2 位或 3 位来存储代码,我们有四种颜色。我最初认为它是 2,因为 2^2=4 但现在因为橙色和黄色不是确定的 RGB 颜色,我们需要 3 位?

从此我知道如何进行压缩计算我只想解释一下需要多少位来存储代码

有 4 种可能的颜色,因此每个像素需要 2 位。

你原来的想法是对的,2^2=4,2位可以代表4个不同的值: 二进制:00、01、10、11(十进制:0、1、2、3)。

每个值代表色图中的一个索引
颜色图用于映射 0 到 (255, 255, 255), 1 tp (0, 255, 0) 2 到 (255, 120, 0) 和 3 到 (255, 255, 0).

图像为 8x8 像素,因此需要的总位数为 8*8*2 = 128 位(16 字节)。

当你需要解压图片时,有两种可能:

  • 第一个选项:解码器预先知道 4 种颜色 - 无需将颜色图与压缩图像一起存储。
  • 第二个选项:您需要将彩色图与压缩图像一起存储,因此需要额外的位来存储彩色图。

根据您提出的问题,我相信第一个选项是正确的(您不需要为彩色地图存储额外的 "bits")。


为了让思考更有趣,我编写了以下 MATLAB 示例:

RGB = imread('peppers.png');   %Read input RGB image.
RGB = imresize(RGB, [64, 64]); %Reduce size to 64x64 (jsut for the example).

%Convert image to indexed image with 4 color.
[X, cmap] = rgb2ind(RGB, 4);
J = ind2rgb(X, cmap);

%Replace indices of color map:
cmap(1, 1:3) = [255, 255, 255]/255; %Fist color is white (255, 255, 255)
cmap(2, 1:3) = [0, 255, 0]/255; %Second color is green (0, 255, 0)
cmap(3, 1:3) = [255, 255, 0]/255; %Second color is yellow (255, 255, 0)
cmap(4, 1:3) = [255, 120, 0]/255; %Second color is orange (255, 120, 0)

K = ind2rgb(X, cmap);

figure;imshow(RGB);
figure;imshow(J);
figure;imshow(K);

RGB 输入图像(真彩色):

只有 4 种颜色的索引图像("compressed" 图像):

将颜色替换为白色、绿色、黄色和橙色(任意顺序)后的图像:

具有 4 种颜色的 8x8 图像的插图,作为 8x8 矩阵:

3,3,3,3,3,3,3,3
3,3,3,3,3,0,3,3
3,0,0,0,0,0,0,0
3,0,0,2,2,2,1,1
1,2,1,2,2,1,1,1
1,1,2,1,0,1,1,2
1,0,0,3,3,3,3,2
3,3,3,3,3,3,3,3

彩图说明:

0 -->    (255   255   255)
1 -->    (  0   255     0)
2 -->    (255   255     0)
3 -->    (255   120     0)

为了存储颜色图,您需要 4*3*8 = 96 位(假设像 255 这样的值需要 8 位)。