首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像压缩

图像压缩
EN

Stack Overflow用户
提问于 2019-11-02 19:47:05
回答 1查看 272关注 0票数 1

我有一个调色板,有四种颜色。这些颜色有白色、绿色、黄色和橙色。这些颜色的RBG值分别为(255、255、255) (0、255、0) (255、120、0) (255、255、0)。图像是8x8像素的RGB图像。我想要计算存储这个压缩图像所需的比特数。

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

从那时起,我知道如何进行压缩计算,我只想解释需要多少位来存储代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-02 22:23:16

有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种颜色--不需要用压缩的图像存储颜色地图。
  • 第二个选项:您需要使用压缩图像存储颜色映射,因此需要额外的位来存储颜色映射。

由于您的问题是制定的,我相信,第一个选项是正确的(您不需要存储额外的“位”的颜色地图)。

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

代码语言:javascript
复制
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种颜色的索引图像(“压缩”图像):

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

8x8图像的4种颜色的插图,如8x8矩阵:

代码语言:javascript
复制
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

彩色地图插图:

代码语言:javascript
复制
0 -->    (255   255   255)
1 -->    (  0   255     0)
2 -->    (255   255     0)
3 -->    (255   120     0)

为了存储颜色映射,您需要4*3*8 = 96位(假设值为255需要8位)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58674731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档