图片压缩简介#

参考:image-compression

图像压缩是计算机视觉中的关键技术,它使我们能够在保持视觉质量的同时更高效地存储和传输图像。理想情况下,希望拥有文件小且质量最佳的图像。然而,必须做出权衡并决定哪个更重要。

什么是图像压缩?#

图像压缩是指在保持可接受的视觉质量水平的同时,减小图像文件的大小。压缩主要有两种类型:

  • 无损压缩:保留所有原始数据,允许精确地重建图像。

  • 有损压缩:为了实现更小的文件大小而丢弃部分数据,可能会降低图像质量。

为什么要压缩图像?#

如果经常听到“磁盘空间很便宜”,那么为什么还要压缩图像呢?在小规模情况下,图像压缩并不重要,但在大规模情况下,它至关重要。

例如,如果你硬盘上有几张图片,你可以压缩它们并节省几兆字节的数据。当硬盘容量以 TB 为单位时,这种节省的影响并不大。但如果你硬盘上有 10 万张图片呢?一些基本的压缩可以节省实际的时间和金钱。从性能角度来看,情况也是如此。如果你有包含大量图片的网站,每天有 1 万人访问你的网站,压缩就显得非常重要。

这样做的原因如下:

  • 减少存储需求:在相同的空间中存储更多的图像

  • 加快传输速度:非常适合网络应用和带宽受限的场景

  • 提高处理速度:较小的图像加载和处理速度更快

图像压缩背后的理论#

图像压缩技术利用了两种冗余:

  • 空间冗余:相邻像素之间的相关性

  • 颜色冗余:相邻区域中颜色值的相似性

空间冗余 利用了大多数自然图像中相邻像素往往具有相似值的事实。这创造了平滑的过渡。许多照片“看起来真实”是因为从一个区域到另一个区域有自然的流动。当相邻像素的值差异很大时,你会得到“噪声”图像。通过将像素分组为单一颜色,使这些过渡不那么“平滑”,从而使图像变小。

另一方面,颜色冗余 关注的是图像中相邻区域通常共享相似颜色的情况。想象一下蓝天或绿草地——图像的大部分区域可能具有非常相似的颜色值。它们也可以被分组并合并为单一颜色以节省空间。

备注

特性

空间冗余

颜色冗余

定义

相邻像素之间的相关性

不同区域的颜色相似性

关注对象

像素的空间关系

颜色的分布和相似性

压缩方法

预测编码、变换编码

颜色空间转换、颜色量化

应用场景

减少相邻像素的重复信息

减少颜色信息的重复

举例

蓝天中相邻像素的值几乎相同

蓝天中所有像素的颜色值非常接近

OpenCV提供了强大的工具来处理这些概念。例如,利用空间冗余,OpenCV的 cv2.inpaint() 函数可以使用附近像素的信息来填充图片中缺失或损坏的区域。OpenCV 还允许开发者使用 cv2.cvtColor() 函数在多个颜色空间之间转换图像,以处理颜色冗余。这在许多压缩技术的预处理步骤中可能会有所帮助,因为某些颜色空间在编码特定类型的图像时比其他颜色空间更有效。

import cv2
import numpy as np

def compress_image(image_path, quality=90):
    # Read the image
    img = cv2.imread(image_path)
        
        # Encode the image with JPEG compression
    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
    _, encoded_img = cv2.imencode('.jpg', img, encode_param)
        
        # Decode the compressed image
    decoded_img = cv2.imdecode(encoded_img, cv2.IMREAD_COLOR)
    
    return decoded_img

compressed_img = compress_image('original_image.jpg', quality=50)

这个示例包含 compress_image 函数,它接受两个参数:

  1. 图像路径(图像所在的位置)

  2. 质量(期望的图像质量)

这个示例展示了如何使用 OpenCV 中的 JPEG 压缩来压缩图像。质量参数控制文件大小和图像质量之间的权衡。