Python(C)图像压缩导图

2024-08-28 20:04
文章标签 python 导图 图像压缩

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

🎯要点

  1. 傅里叶和小波变换
  2. 主成分分析彩色图
  3. 压缩制作不同尺寸图像
  4. K均值和生成式对抗网络压缩
  5. 无损压缩算法
  6. 压缩和解压缩算法
  7. 离散小波变换压缩
  8. 树结构象限算法压缩
  9. 矩阵分解有损压缩算法
  10. 量化模型有损压缩算法
  11. JPEG压缩解压缩算法
    在这里插入图片描述

Python图像压缩

图像压缩可以是有损的,也可以是无损的。无损压缩是档案用途的首选,通常用于医学成像、技术图纸、剪贴画或漫画。有损压缩方法,尤其是在低比特率下使用时,会产生压缩伪影。有损方法特别适用于自然图像,例如照片,在这种应用中,可以接受轻微(有时难以察觉)的保真度损失,以实现比特率的大幅降低。产生可忽略不计的差异的有损压缩可以称为视觉无损。

在给定压缩率(或比特率)下获得最佳图像质量是图像压缩的主要目标,但是,图像压缩方案还有其他重要属性:

可伸缩性通常是指通过操纵比特流或文件(无需解压和重新压缩)实现的质量降低。可伸缩性的其他名称是渐进式编码或嵌入式比特流。尽管其性质相反,但可伸缩性也可以在无损编解码器中找到,通常以从粗到细的像素扫描形式出现。可伸缩性对于在下载图像时预览图像(例如,在 Web 浏览器中)或提供对数据库等的可变质量访问特别有用。可伸缩性有几种类型:

  • 质量渐进或层渐进:比特流连续细化重建图像。
  • 分辨率渐进:首先编码较低的图像分辨率;然后将差异编码为更高分辨率。
  • 分量渐进:首先编码灰度版本;然后添加全色。

感兴趣区域编码:图像的某些部分的编码质量高于其他部分。这可以与可扩展性相结合(首先对这些部分进行编码,然后再对其他部分进行编码)。元信息:压缩数据可能包含有关图像的信息,可用于对图像进行分类、搜索或浏览。此类信息可能包括颜色和纹理统计信息、小预览图像以及作者或版权信息。

处理能力:压缩算法需要不同数量的处理能力来编码和解码。一些高压缩算法需要高处理能力。

压缩方法的质量通常用峰值信噪比来衡量。它衡量的是图像有损压缩引入的噪声量,然而,观看者的主观判断也被视为一项重要衡量标准,或许是最重要的衡量标准。

在我们深入压缩图像之前,让我们创建一个函数,以友好的格式打印文件大小:

def get_size_format(b, factor=1024, suffix="B"):for unit in ["", "K", "M", "G", "T", "P", "E", "Z"]:if b < factor:return f"{b:.2f}{unit}{suffix}"b /= factorreturn f"{b:.2f}Y{suffix}"

接下来,让我们来制作压缩图像的核心函数:

def compress_img(image_name, new_size_ratio=0.9, quality=90, width=None, height=None, to_jpg=True):img = Image.open(image_name)print("[*] Image shape:", img.size)image_size = os.path.getsize(image_name)print("[*] Size before compression:", get_size_format(image_size))if new_size_ratio < 1.0:img = img.resize((int(img.size[0] * new_size_ratio), int(img.size[1] * new_size_ratio)), Image.ANTIALIAS)print("[+] New Image shape:", img.size)elif width and height:img = img.resize((width, height), Image.ANTIALIAS)print("[+] New Image shape:", img.size)filename, ext = os.path.splitext(image_name)if to_jpg:new_filename = f"{filename}_compressed.jpg"else:new_filename = f"{filename}_compressed{ext}"try:img.save(new_filename, quality=quality, optimize=True)except OSError:img = img.convert("RGB")img.save(new_filename, quality=quality, optimize=True)print("[+] New file saved:", new_filename)new_image_size = os.path.getsize(new_filename)print("[+] Size after compression:", get_size_format(new_image_size))saving_diff = new_image_size - image_sizeprint(f"[+] Image size change: {saving_diff/image_size*100:.2f}% of the original image size.")

现在我们已经有了核心函数,让我们使用 argparse 模块将其与命令行参数集成:

if __name__ == "__main__":import argparseparser = argparse.ArgumentParser(description="Simple Python script for compressing and resizing images")parser.add_argument("image", help="Target image to compress and/or resize")parser.add_argument("-j", "--to-jpg", action="store_true", help="Whether to convert the image to the JPEG format")parser.add_argument("-q", "--quality", type=int, help="Quality ranging from a minimum of 0 (worst) to a maximum of 95 (best). Default is 90", default=90)parser.add_argument("-r", "--resize-ratio", type=float, help="Resizing ratio from 0 to 1, setting to 0.5 will multiply width & height of the image by 0.5. Default is 1.0", default=1.0)parser.add_argument("-w", "--width", type=int, help="The new width image, make sure to set it with the `height` parameter")parser.add_argument("-hh", "--height", type=int, help="The new height for the image, make sure to set it with the `width` parameter")args = parser.parse_args()print("="*50)print("[*] Image:", args.image)print("[*] To JPEG:", args.to_jpg)print("[*] Quality:", args.quality)print("[*] Resizing ratio:", args.resize_ratio)if args.width and args.height:print("[*] Width:", args.width)print("[*] Height:", args.height)print("="*50)compress_img(args.image, args.resize_ratio, args.quality, args.width, args.height, args.to_jpg)

现在使用我们的脚本。首先,让我们使用不带任何参数的脚本:

$ python compress_image.py sample-images.png

输出:

==================================================
[*] Image: sample-images.png
[*] To JPEG: False
[*] Quality: 90
[*] Resizing ratio: 1.0
==================================================
[*] Image shape: (953, 496)
[*] Size before compression: 425.65KB
[+] New file saved: sample-images_compressed.png
[+] Size after compression: 379.25KB
[+] Image size change: -10.90% of the original image size.

图像大小从 425.65KB 减少到 379.25KB,减少了约 11%。接下来,让我们尝试传递 -j 以将 PNG 转换为 JPEG:

$ python compress_image.py sample-images.png -j

输出:

==================================================
[*] Image: sample-images.png
[*] To JPEG: True
[*] Quality: 90
[*] Resizing ratio: 1.0
==================================================
[*] Image shape: (953, 496)
[*] Size before compression: 425.65KB
[+] New file saved: sample-images_compressed.jpg
[+] Size after compression: 100.07KB
[+] Image size change: -76.49% of the original image size.

提高了 76.5%。让我们稍微降低质量:

$ python compress_image.py sample-satellite-images.png -j -q 75

输出:

==================================================
[*] Image: sample-images.png
[*] To JPEG: True
[*] Quality: 75
[*] Resizing ratio: 1.0
==================================================
[*] Image shape: (953, 496)
[*] Size before compression: 425.65KB
[+] New file saved: sample-images_compressed.jpg
[+] Size after compression: 64.95KB
[+] Image size change: -84.74% of the original image size.

在不影响原始图像分辨率的情况下减少约 85%。让我们尝试将图像的宽度和高度乘以 0.9:

$ python compress_image.py sample-satellite-images.png -j -q 75 -r 0.9

输出:

==================================================
[*] Image: sample-images.png
[*] To JPEG: True
[*] Quality: 75
[*] Resizing ratio: 0.9
==================================================
[*] Image shape: (953, 496)
[*] Size before compression: 425.65KB
[+] New Image shape: (857, 446)
[+] New file saved: sample-images_compressed.jpg
[+] Size after compression: 56.94KB
[+] Image size change: -86.62% of the original image size.

现在设置精确的宽度和高度值:

$ python compress_image.py sample-satellite-images.png -j -q 75 -w 800 -hh 400 

输出:

==================================================
[*] Image: sample-images.png
[*] To JPEG: True
[*] Quality: 75
[*] Resizing ratio: 1.0
[*] Width: 800
[*] Height: 400
==================================================
[*] Image shape: (953, 496)
[*] Size before compression: 425.65KB
[+] New Image shape: (800, 400)
[+] New file saved: sample-images_compressed.jpg
[+] Size after compression: 49.73KB
[+] Image size change: -88.32% of the original image size.

👉更新:亚图跨际

这篇关于Python(C)图像压缩导图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

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

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

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At