数据处理之图像压缩

简介

图像压缩是很多应用场景中非常重要的技术,主要有以下几个原因:

减小文件大小

原始的图像文件通常非常大,尤其是高分辨率或者 RAW 格式的图片。压缩图像可以显著减小文件大小,有利于存储和传输。

节省存储空间

在许多应用中,需要存储大量的图像数据,如相册、电子商务平台等。使用图像压缩可以大幅节省存储空间,降低存储成本。

优化网络传输

在网络传输中,大尺寸的图像会增加带宽占用和延迟。压缩图像可以减小传输数据量,提高网络传输效率,尤其是在移动网络或者弱网环境下。

提升用户体验

快速加载页面和响应是良好用户体验的关键因素之一。通过图像压缩,可以缩短图像加载时间,改善用户体验。

节省带宽资源

在一些有带宽限制的情况下,如移动设备、物联网设备等,图像压缩可以显著减少带宽占用,提高网络资源利用率。

支持多设备兼容

不同设备的屏幕尺寸和分辨率各不相同,使用恰当的图像压缩技术可以根据设备特性自动适配图像大小,提高跨设备兼容性。

图像压缩的常见方案

无损压缩

编码优化

利用图像数据的冗余特性,采用熵编码算法(如 Huffman 编码、算术编码等)对图像数据进行编码压缩,而不会损失图像质量。

预测编码

基于图像的空间相关性,使用预测算法预测像素值,并对预测误差进行编码压缩。

变换编码

将图像转换到频域,利用频域特性对图像数据进行压缩,如离散余弦变换(DCT)、小波变换等。

有损压缩

变换编码

类似无损压缩的变换编码,但会丢弃一些高频信息,如 JPEG 编码。

量化压缩

将连续的像素值量化为离散的值,从而达到压缩的目的,如 JPEG 2000。

区域分割

根据图像内容的特性,对图像进行分区,对不同区域采用不同的压缩策略。

混合压缩

结合无损与有损压缩: 先使用无损压缩技术对图像进行初步压缩,然后再使用有损压缩技术进一步压缩,以平衡压缩比和图像质量。
分层编码: 将图像分成不同的层次,如背景层、前景层等,分别采用不同的压缩算法。

自适应压缩

根据图像内容的特点,动态选择最佳的压缩算法和参数,以达到最优的压缩效果。
利用机器学习等技术,对图像特征进行分析,自动选择合适的压缩方案。

智能压缩

利用深度学习等技术,建立端到端的图像压缩模型,实现更高效的压缩效果。
融合语义信息,根据图像内容的重要性进行差异化压缩,保留关键信息。

常见的图像压缩方法 - 下采样(Downsampling)

这种方法通过减少图像的像素数量来达到压缩的目的。具体来说,有以下几种常见的下采样方法:

平均下采样

将原图像中一个固定大小的区域(如 2x2 像素)的像素值取平均,作为新图像中对应位置的像素值。这种方法可以保留更多细节信息。

最近邻下采样

直接取原图像中对应位置的像素值作为新图像的像素值。这种方法简单快捷,但可能会造成锯齿效果。

双线性下采样

在原图像中进行双线性插值,计算新图像中每个像素的值。这种方法可以较好地保留图像的平滑性。

双三次下采样

使用双三次插值计算新图像中的像素值,可以进一步保持图像的细节和清晰度

图像压缩相关的模块

Pillow (PIL)

Pillow 是 Python Imaging Library (PIL) 的一个分支,提供了丰富的图像处理功能,包括常见的图像压缩格式如 JPEG、PNG、GIF 等。
可以通过 Pillow.Image.save() 方法指定压缩质量参数来实现图像压缩。

from PIL import Image

# 打开图像
image = Image.open("input_image.jpg")

# 设置压缩质量(0-100,值越大质量越好,但文件越大)
quality = 80

# 保存压缩后的图像
image.save("output_image.jpg", optimize=True, quality=quality)

OpenCV

OpenCV 是一个广泛使用的计算机视觉和机器学习库,同样支持多种图像格式的读写和压缩。
可以使用 cv2.imwrite() 函数保存图像时指定压缩参数,如 JPEG 的质量因子。

import cv2

# 读取图像
image = cv2.imread("input_image.jpg")

# 设置 JPEG 压缩质量(0-100,值越大质量越好,但文件越大)
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 80]

# 保存压缩后的图像
cv2.imwrite("output_image.jpg", image, encode_param)

ImageIO

ImageIO 是一个功能强大的图像 I/O 库,支持大量的图像格式,包括常见的压缩格式。
可以使用 imageio.imwrite() 函数保存图像时设置压缩级别。

import imageio

# 读取图像
image = imageio.imread("input_image.jpg")

# 设置 JPEG 压缩质量(0-100,值越大质量越好,但文件越大)
imageio.imwrite("output_image.jpg", image, quality=80)

TensorFlow/PyTorch

深度学习框架 TensorFlow 和 PyTorch 也提供了图像压缩相关的功能。
可以使用 tf.image.encode_jpeg() 或 torchvision.transforms.ToPILImage() 配合 save() 方法实现图像压缩。

tensorflow
import tensorflow as tf

# 读取图像
image = tf.io.read_file("input_image.jpg")
image = tf.image.decode_jpeg(image, channels=3)

# 设置 JPEG 压缩质量(0-100,值越大质量越好,但文件越大)
compressed_image = tf.image.encode_jpeg(image, quality=80, optimize_size=True)

# 保存压缩后的图像
tf.io.write_file("output_image.jpg", compressed_image)

pytorch
import torch
from torchvision.transforms import ToPILImage

# 读取图像
image = torch.rand(3, 224, 224)  # 创建一个随机的 PyTorch 张量

# 转换为 PIL 图像
pil_image = ToPILImage()(image)

# 设置 JPEG 压缩质量(0-100,值越大质量越好,但文件越大)
pil_image.save("output_image.jpg", quality=80)

GUETZLI

GUETZLI 是 Google 开发的一个高质量 JPEG 压缩算法,可以与 Pillow 等库集成使用。
通过 pip install Guetzli 安装后,可以使用 from Guetzli import compress 进行 JPEG 压缩。

from Guetzli import compress

# 读取图像
with open("input_image.jpg", "rb") as f:
    image_data = f.read()

# 使用 GUETZLI 压缩
compressed_image = compress(image_data, quality=95)

# 保存压缩后的图像
with open("output_image.jpg", "wb") as f:
    f.write(compressed_image)

WebP

WebP 是 Google 开发的一种新型图像格式,具有更高的压缩率。
在 Python 中可以使用 pillow-webp 等第三方库来处理 WebP 图像。

from PIL import Image
from pillow_webp import register_webp

# 注册 WebP 编码器和解码器
register_webp()

# 打开图像
image = Image.open("input_image.jpg")

# 设置 WebP 压缩质量(0-100,值越大质量越好,但文件越大)
quality = 80

# 保存压缩后的 WebP 图像
image.save("output_image.webp", optimize=True, quality=quality)

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-10 04:32:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-10 04:32:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-10 04:32:03       82 阅读
  4. Python语言-面向对象

    2024-06-10 04:32:03       91 阅读

热门阅读

  1. DEJA_VU3D - Cesium功能集 之 121-底图机制

    2024-06-10 04:32:03       31 阅读
  2. shaderlab 关键点记录

    2024-06-10 04:32:03       29 阅读
  3. 深入剖析时序Prophet模型

    2024-06-10 04:32:03       31 阅读
  4. Jira的原理及应用详解(六)

    2024-06-10 04:32:03       27 阅读
  5. python 获取网页链接图片

    2024-06-10 04:32:03       30 阅读
  6. 《一心体系至善算法》“人文+AI”成果

    2024-06-10 04:32:03       34 阅读
  7. 七天进阶elasticsearch[Three]

    2024-06-10 04:32:03       28 阅读