数据处理之图像压缩

简介

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

减小文件大小

原始的图像文件通常非常大,尤其是高分辨率或者 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.mzph.cn/news/850458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯医疗大模型,不止大模型

“千呼万唤始出来,腾讯健康终于祭出医疗大模型。但或许这只是新故事的开始。下一步通过应用场景的打磨,全面嵌入生态合作伙伴,才能让医疗行业加速全面拥抱「数智化」工具。 在今年几乎所有企业都卷入AI大模型这场豪赌时,腾讯健康…

苹果智能:iOS 18 AI增强功能

苹果计划在 2024 年 WWDC 上推出一项名为“Apple Intelligence”的重大 AI 举措,将 AI 功能深度整合到其操作系统和核心应用程序中,同时优先考虑用户的隐私和安全。 该计划的名称是“Apple Intelligence”,这个名字很有市场价值。名字很简单…

Pod之间的通信详解

在Kubernetes集群中,Pod之间的通信是非常核心的功能。Pod是Kubernetes中的最小部署单元,它们之间经常需要进行通信以完成各种任务。本文将深入探讨Pod之间的通信方式,并通过示例代码来进一步解释。 目录 第一章. Pod间通信的实现原理 第二章…

C++做题

我们可以将0——9看成一个一维数组&#xff1a;a[11] #include<cstdio> int a[11],n; int x,p; int main(){scanf("%d",&n);for(int i1;i<n;i){pi;while(p!0){xp%10;a[x];//让下标x每次出现时增加1(描述不清楚)p/10;}}for(int i0;i<9;i){printf(&qu…

Flink学习-时间语义

含义 事件时间&#xff1a;数据产生的时间 处理时间&#xff1a;数据的处理时刻 水位线 用来衡量事件时间进展的标记&#xff0c;就被称作『水位线』&#xff0c;水位线可以看作是一条特殊的数据记录&#xff0c;是插入到数据流中的一个标记点&#xff0c;主要内容是个时间戳…

IO多路复用详解

1. 概念 IO多路复用也称IO多路转接&#xff0c;它是一种网络通信的手段&#xff08;机制&#xff09;&#xff0c;通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的&#xff0c;一旦检测到有文件描述符就绪&#xff08; 可以读数据或者可以写数据&#xff09;程序的…

Oracle基本操作

操作 DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,像:表、视图等等,DDL 对这些对象和属性的管理和定义具体表现在 create、drop 和 alter 上。 create 可以创建数据库和数据库的一些对象 drop …

TypeScript看这篇就够了

TypeScript 技术文档 目录 TypeScript 技术文档1. 简介2. 安装与配置3. 基本类型3.1 布尔值3.2 数字3.3 字符串3.4 数组3.5 元组3.6 枚举3.7 Any3.8 Void3.9 Null 和 Undefined3.10 Never3.11 Object 4. 接口4.1 简单示例4.2 可选属性4.3 只读属性4.4 函数类型4.5 可索引类型 5…

轻NAS玩客云使用Docker部署小雅并挂载到AList详细流程分享

文章目录 前言1. 本地部署AList2. AList挂载网盘3. 部署小雅alist3.1 Token获取3.2 部署小雅3.3 挂载小雅alist到AList中 4. Cpolar内网穿透安装5. 创建公网地址6. 配置固定公网地址 前言 本文主要介绍如何在安装了CasaOS的玩客云主机中部署小雅AList&#xff0c;并在AList中挂…

C语言基础学习之位运算

枚举类型 enum 枚举名 { 枚举常量 //名字 }; 注意: 1.c语言中 对于枚举类型 实际上是 当作整型处理的 2.提高代码可读性&#xff0c; 写成枚举&#xff0c;可以做语法检查 3.枚举常量&#xff0c;之间用逗号隔开 4.枚举常量&#xff0c;可以给初值&#xff0c;给了初值之后&…

新电脑必装的7款软件,缺一不可

如果你买了新电脑或者是重装了新系统&#xff0c;那么这7款软件你一定要安装。 1、SpaceSniffer 如果你的C盘经常爆红&#xff0c;但是不知道是什么原因&#xff0c;那么你应该需要SpaceSniffer这款软件&#xff0c;它可以把你C盘中文件的空间占用情况&#xff0c;以大小方框…

当我拿到百度文心智能体大赛top1后,我又开发了...

目录 一、写在前面 二、代码助手 三、关于智能体 四、写在后面 一、写在前面 在不久前结束的文心智能体大赛&#xff08;第一期&#xff09;中&#xff0c;我有幸凭借一款名为恋爱助手的智能体斩获了大赛的桂冠。这个成绩&#xff0c;既是对我努力的认可&#xff0c;也是对…

Qt中图表图形绘制类介绍

接上篇介绍QChart 相关的类&#xff0c;本片主要在QChart 载体上进行图表图形绘制使用各种形状的图类。 一.QXYSeries类 QXYSeries类是QLineSeries折线图&#xff0c;QSplineSeries样条曲线图&#xff0c;QScatterSeries散点图的基类&#xff1b; QXYSeries类的使用都可以参考…

人工智能_机器学习096_PCA主成分分析降维算法_PCA降维原理_介绍和使用_模式识别_EVD特征值分解_SVD奇异值分解---人工智能工作笔记0221

首先我来看PCA降维,可以看到在图像处理中经常用到PCA,经过对数据进行降维可以去除数据噪声,发现数据中的模式,也就是 发现数据的规律. 这里的模式识别就是 机器学习中的一个分支 就是在数据中找规律的意思 我们使用代码看一下 from sklearn.docomposition import PCA from skl…

ecursionError: maximum recursion depth exceeded while calling a Python object

在 Python 中&#xff0c;RecursionError: maximum recursion depth exceeded 错误通常发生在一个函数递归调用自身太多次&#xff0c;超出了 Python 默认的递归深度限制时。Python 默认的递归深度限制是比较低的&#xff0c;以避免无限递归导致的栈溢出。 在你的代码中&#…

考虑风光场景生成的电动汽车并网优化调度【遗传算法】【IEEE33】

目录 主要内容 部分代码 部分结果 下载链接 主要内容 程序主要内容是考虑风光场景生成的电动汽车并网优化调度&#xff0c;采用的方法如下所述&#xff1a; ①采用蒙特卡洛方法&#xff0c;结合copula函数以及fuzzy-kmeans&#xff0c;获取6个典型风光出力场景&…

Linux C语言:输入输出(printf scanf)

一、数据输出 1、C语言I/O操作由函数实现 #include <stdio.h> 2、字符输出函数 格式: int putchar( int c ) 参数: c为字符常量、变量或表达式 功能&#xff1a;把字符c输出到显示器上 返值&#xff1a;putchar函数的返回值是参数的ASCLL码值&#xff1b; #inclu…

深入理解交叉熵损失CrossEntropyLoss - 乘积符号在似然函数中的应用

深入理解交叉熵损失CrossEntropyLoss - 乘积符号在似然函数中的应用 flyfish 乘积符号prod&#xff0c;通常写作 ∏ \prod ∏&#xff0c;它类似于求和符号 ∑ \sum ∑&#xff0c;但它表示的是连续乘积。我们来看一下这个符号的具体用法和例子。 乘积符号 ∏ \prod ∏ …

1.奖牌的数量

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/447 题目描述 小爱获得了 𝑎a 枚金牌,…

领导者在沟通中最容易犯的错误

本文讨论了领导者在沟通过程中如何避免成为传声筒&#xff0c;通过筛选、处理和总结信息&#xff0c;在向上、向下沟通时保持相关性和真实性&#xff0c;提高沟通效率和效果。原文: The Dumbest Mistake Leaders Make in Communication 中层管理者作为高层领导、下属团队和其他…