数据处理之图像压缩

2024-06-09 09:52
文章标签 数据处理 图像压缩

本文主要是介绍数据处理之图像压缩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

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

减小文件大小

原始的图像文件通常非常大,尤其是高分辨率或者 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)

这篇关于数据处理之图像压缩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044852

相关文章

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

【程序分享1】第一性原理计算 + 数据处理程序

【1】第一性原理计算 + 数据处理程序 SMATool 程序:VASP + QE + 零温 + 有限温度 + 拉伸、剪切、双轴、维氏硬度的计算 ElasTool v3.0 程序:材料弹性和机械性能的高效计算和可视化工具包 VELAS 程序:用于弹性各向异性可视化和分析 Phasego 程序:用于自动计算和绘制相图 可视化软件 GDIS 软件:第一原理计算/VASP + 结构预测/USP

数据处理与数据填充在Pandas中的应用

在数据分析和机器学习项目中,数据处理是至关重要的一步。Pandas作为Python中用于数据分析和操作的一个强大库,提供了丰富的功能来处理和清洗数据。本文将深入探讨Pandas在数据处理,特别是数据填充方面的应用。 在实际的数据集中,缺失值(Missing Values)或异常值(Outliers)是常见的问题。这些不完整或错误的数据如果不加以处理,会严重影响数据分析的准确性和机器学习模型的性能

【控制算法 数据处理】一阶滤波算法

简单介绍: 一阶滤波算法是比较常用的滤波算法,它的滤波结果=a*本次采样值+(1-a)*上次滤波结果,其中,a为0~1之间的数。一阶滤波相当于是将新的采样值与上次的滤波结果计算一个加权平均值。a的取值决定了算法的灵敏度,a越大,新采集的值占的权重越大,算法越灵敏,但平顺性差;相反,a越小,新采集的值占的权重越小,灵敏度差,但平顺性好。优点是对周期干扰有良好的抑制作用,适用于波动频率比较高的场合,它

Flink事件时间、水印和迟到数据处理

事件时间与水印 所谓事件时间,就是Flink DataStream中的数据元素自身带有的、在其实际发生时记录的时间戳,具有业务含义,并与系统时间独立。很显然,由于外部系统产生的数据往往不能及时、按序到达Flink系统,所以事件时间比处理时间有更强的不可预测性。为了能够准确地表达事件时间的处理进度,就必须用到水印。 Flink水印的本质是DataStream中的一种特殊元素,每个水印都携带有一个

Apache Beam 大数据处理一站式分析

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 一. 介绍 大数据处理其实经常被很多人低估,缺乏正确的处理体系,其实,如果没有高质量的数据处理流程,人工智能将只有人工而没有智能。现在的趋势是数据体量不断上涨,团队却低估了规模所带来的复杂度。大数据领域泰斗级人物Jesse Anderson曾做过研究,一个组织架构比较合理的人工智能团队,

数据处理!

#1.计算字符串中字母有多少个? //试题const str = "asdfgghjklasdf";//方式1const setnum = (val) => {const obj = str.split("").reduce((accumulator, cur, index) => {accumulator[cur] ? accumulator[cur]++ : (accumulator[c

pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二)

pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二) pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二)DatasetInputs to modelCaption LengthsData pipelineEncoderAttentionDecoder代码数据集初始化 create_input_files.py训练 tr

数据库中的逐行数据处理

在数据库开发中,标准的SQL操作通常是面向集合的,意味着我们一次可以处理多条记录。然而,如果你需要逐条处理数据,就需要用到一种特别的工具——游标。游标允许我们在处理多行数据时,一次处理一行,从而解决了SQL语句与应用程序之间的数据处理差异。本文将带你深入了解如何在MySQL中使用游标,轻松掌握声明、打开、提取数据以及关闭游标的基本操作。 什么是游标?为什么需要游标? 在标准SQL操作中,一

空气质量题数据处理与分析

Python在数学建模中的应用 缺失值检查异常值检查描述性统计(绘制热力图、折线图、季节性图)计算描述性统计(count mean std min 25% 50% 75% max) import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 读取CSV文件,尝试不同的