【问题标题】:Compression of an image压缩图像
【发布时间】:2020-02-29 01:50:37
【问题描述】:

我一直在计算图像的未压缩和压缩文件大小。这对我来说总是导致压缩图像小于我期望的未压缩图像。如果图像包含大量不同的颜色,那么存储调色板会占用大量空间,并且还需要更多的位来存储每个代码。但是我的问题是,压缩方法是否有可能导致文件比未压缩的 RGB 图像更大。最小的正方形 RGB 图像的大小(以像素为单位),总共包含 k 种不同的颜色,这种压缩方法仍然有用吗?所以我们想找到,对于一个给定的k值,找到一个最小的整数n,它的大小为n×n的图像在压缩后比原始RGB图像占用更少的存储空间。

【问题讨论】:

  • 我们要检查大小为 n × n 且具有 k 种不同颜色的压缩图像比未压缩图像占用更少的存储空间,并且大小为 (n − 1) × (n − 1 ) 具有 k 种不同颜色的图像比未压缩的图像占用更多的存储空间。

标签: compression rgb pixel image-compression


【解决方案1】:

让我们先做一个简单的简化——编码输出的大小取决于像素数(宽度与高度的实际比例并不重要)。因此,让我们将问题推广到像素数 N,我们总是可以通过取平方根来计算 n

为了进一步简化问题,我们还将忽略任何图像标题/元数据的开销,例如宽度、高度、调色板的大小等。在实践中,这通常是一个相对较小的常数。


问题陈述

鉴于我们有

  • N 表示图像中的像素数
  • k 表示图像中不同颜色的数量
  • 24 位每像素 RGB 编码
  • LRGB表示RGB图像的长度
  • LP表示调色板图像的长度

我们的目标是解决以下不等式

N而言。


RGB 图像大小

RGB 图像只是 N 个像素的数组,每个像素占用 RGB 编码给定的固定位数。因此,


调色板图像的大小

调色板图像由两部分组成:调色板和像素。

调色板是 k 种颜色的数组,每种颜色占用 RGB 编码给定的固定位数。因此,

在这种情况下,每个像素都包含一个调色板条目的索引,而不是实际的 RGB 颜色。表示 k 个值所需的位数为

但是,除非我们可以对小数位进行编码(我认为这超出了本问题的范围),否则我们需要将其四舍五入。因此,对调色板索引进行编码所需的位数为

由于有 N 个这样的调色板索引,因此像素数据的大小为

调色板图像的总大小为


解决不平等

最后


在 Python 中,我们可以这样表达:

import math

def limit_size(k):
    return (k * 24.) / (24. - math.ceil(math.log(k, 2)))

def size_rgb(N):
    return (N * 24.)

def size_pal(N, k):
    return (N * math.ceil(math.log(k, 2))) + (k * 24.)

【讨论】:

  • @Mathsstudent 让我们从 10 进制开始——1 位数字可以代表 10 (=10^1) 个不同的值。 2 位数字可以表示 100 (=10^2) 个值。 3 位数字可以表示 1000 (=10^3)​​ 个值。看到图案了吗?我们可以将其概括为以 10 为底的 n 位数字可以表示 10^n 个不同的值。基数 2 遵循类似的模式 - 2、4、8、.... -> 2^n。 |为了回答“我需要多少位数”这个问题,我们知道值的数量,并且我们想要找到 n(指数)。求幂的倒数是logarithm,所以这就是我们使用的......
  • 好的,我明白了,谢谢。您给出的公式如何与检查大小为 n × n 且具有 k 种不同颜色的压缩图像比未压缩图像占用更少的存储空间以及大小为 (n - 1) × (n - 1) 且具有 k 的压缩图像占用更少的存储空间有关不同的颜色比未压缩的图像占用更多的存储空间。
  • @Mathsstudent 比如说 k=16。将其代入不等式,您将得到 N > 19.2。由于我们正在寻找方形图像,因此我们对其取平方根:n > 4.38。下一个更大的整数是 5,因此 5x5 RGB 更大(600 对 484 位),而 4x4 压缩更大(384 对 448)。
【解决方案2】:

一般不会,但您的问题并不准确。

如果我们压缩普通文件,它们可能会更大。例如。如果你压缩一个随机生成的字节序列,就没有什么要压缩的了,所以你会得到压缩程序的头部,它告诉你使用了哪种压缩方法,以及一些版本控制。这将放大文件,并且 ev.一些逃避。好的压缩程序会看到压缩不会缩小大小,所以他们不应该压缩,并在标题中告诉它是一个平面文件。这可能是按程序区域完成的。

但您的问题是关于图像的。压缩在文件内部完成,通常不是所有文件,而只是图像位。在这种情况下,程序将看到不需要压缩,因此它们会保持文件未压缩。但是因为图像标题总是存在的,所以这只改变了一个标志,所以不会增加大小。

但这也可能取决于文件格式。你写了关于“调色板”的文章,但现在这用得不多:压缩是在文件中找到类似的模式。但同样:这取决于图像格式。如果您查看 Wikipedia,对于特定的文件格式,您可能会看到一个带有标题参数的表格(例如位深度或颜色数(调色板)、颜色定义和用于压缩的方法)。

然后,对于类似调色板的图像,Dan Mašek (https://stackoverflow.com/a/58683948/2758823) 的答案有一些很好的数学解释,但不要忘记压缩是一种启发式方法和对真实示例的测试:真实图像有模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2013-02-22
    • 2016-05-21
    • 2019-08-22
    相关资源
    最近更新 更多