图片压缩简介#
图像压缩是计算机视觉中的关键技术,它使我们能够在保持视觉质量的同时更高效地存储和传输图像。理想情况下,希望拥有文件小且质量最佳的图像。然而,必须做出权衡并决定哪个更重要。
什么是图像压缩?#
图像压缩是指在保持可接受的视觉质量水平的同时,减小图像文件的大小。压缩主要有两种类型:
无损压缩:保留所有原始数据,允许精确地重建图像。
有损压缩:为了实现更小的文件大小而丢弃部分数据,可能会降低图像质量。
为什么要压缩图像?#
如果经常听到“磁盘空间很便宜”,那么为什么还要压缩图像呢?在小规模情况下,图像压缩并不重要,但在大规模情况下,它至关重要。
例如,如果你硬盘上有几张图片,你可以压缩它们并节省几兆字节的数据。当硬盘容量以 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
函数,它接受两个参数:
图像路径(图像所在的位置)
质量(期望的图像质量)
这个示例展示了如何使用 OpenCV 中的 JPEG 压缩来压缩图像。质量参数控制文件大小和图像质量之间的权衡。