Python(C)图像压缩导图

news2024/11/15 23:54:57

🎯要点

  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 /= factor
    return 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_size
    print(f"[+] Image size change: {saving_diff/image_size*100:.2f}% of the original image size.")

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

if __name__ == "__main__":
    import argparse
    parser = 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.

👉更新:亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078418.html

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

相关文章

Gazebo Harmonic gz-harmonic 和 ROS2 Jazzy 注意事项

激光显示 点呈现 射线呈现 rviz2 新旧版本并存的混乱 本教程旨在为在Ubuntu Jammy&#xff08;最新支持Gazebo Classic包的Ubuntu版本&#xff09;上运行Gazebo Classic&#xff08;如Gazebo 11&#xff09;的用户提供指导&#xff0c;这些用户计划将其代码迁移到新的Gazebo版…

大语言模型(LLMs)全面学习指南

大语言模型&#xff08;LLMs&#xff09;作为人工智能&#xff08;AI&#xff09;领域的一项突破性发展&#xff0c;已经改变了自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff08;ML&#xff09;应用的面貌。这些模型&#xff0c;包括OpenAI的GPT-4o和Google的gem…

泛运动生态持续破圈,重估Keep时刻来临

在中国超40万亿的庞大消费市场中&#xff0c;从不缺少“燃点”。 前不久举办的巴黎奥运会&#xff0c;就带火了国内规模空前的“奥运经济”。在诸多品牌助力下&#xff0c;这股运动消费热潮持续破圈。 比如&#xff0c;运动科技公司Keep通过发布主题为《心火已燃》的品牌TVC&…

生信圆桌x生信友好期刊:助力生物信息学研究的学术平台

介绍 生物信息学作为一门交叉学科&#xff0c;近年来得到了快速发展。为了促进生信领域的科研交流&#xff0c;许多学术期刊开始关注并专门发表生物信息学相关的研究成果。这些期刊被称为“生信友好期刊”&#xff0c;它们为研究人员提供了一个展示和传播最新科研成果的重要平…

怎么成为ChatGPT使用大神?

成为高效使用ChatGPT的高手&#xff0c;可以通过以下几个方面来提升你的使用体验和效果&#xff1a; 1. 清晰明确的提问 明确问题&#xff1a;尽量将问题表述清楚、具体。例如&#xff0c;“如何提高文章写作技巧&#xff1f;” 比 “写作技巧” 更具体。提供上下文&#xf…

UnrealEngine学习(01):安装虚幻引擎

1. 下载安装 Epic Games 目前下载UE引擎需要先下载Epic Games&#xff0c;官网为我们提供了下载路径&#xff1a; https://www.unrealengine.com/zh-CN/downloadhttps://www.unrealengine.com/zh-CN/download 我们点击图中步骤一即可进行下载。 注释&#xff1a;Unreal Engi…

AI嵌入式开发 ---- pt模型文件 -> ONNX模型 -> rknn模型 -> 部署到RK3588开发板上(以yolov5为例)

目录 一、前言 1.1 任务 1.2 开发板下跑预训练模型流程 二、pt 文件转换为 onnx 或 TorchScript 文件&#xff08;平台&#xff1a;x86机器Windows系统&#xff09; 二、将 .onnx 模型文件转换为 .rknn 模型文件【平台&#xff1a;x86上的 Linux虚拟系统】 三、在 Linux虚…

python爬虫控制aiohttp并发数量方式例子解析

在使用Python的aiohttp库进行爬虫开发时&#xff0c;控制并发数量是一个重要的环节&#xff0c;以避免对目标网站造成过大压力或触发反爬机制。以下是一些控制并发数量的方法和示例&#xff1a; 使用Semaphore限制并发数&#xff1a;Semaphore&#xff08;信号量&#xff09;是…

用大模型学习大模型-40问掌握大模型入门知识点(上)

采用提问方式&#xff0c;从个人知识盲点开始&#xff0c;渐进式掌握大模型入门知识点。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 1、大模型中7b、70B代表什么 在讨论人工智能领域特别是大型语言模型&#xff08;LLMs&#xff09;时&#xff0c;“7b”和“70B”均…

【Kotlin设计模式】Kotlin实现装饰器模式

前言 装饰器模式&#xff08;Decorator Pattern&#xff09;&#xff0c;用于动态地为对象添加新功能&#xff0c;而无需修改其结构&#xff0c;通过使用不用装饰类及这些装饰类的排列组合&#xff0c;可以实现不同的功能和效果&#xff0c;但是这样的效果就是会增加很多类&…

debian12 - rsyslog的安装/配置/使用

文章目录 debian12 - rsyslog的安装/配置/使用概述笔记实现main.cppmy_syslog.hmy_syslog.cppMakefileMakefile的准备工作END debian12 - rsyslog的安装/配置/使用 概述 以前在debian7.5中用syslog可以。 现在准备在debian12虚拟机中做个rsyslog的实验&#xff0c;看syslog还…

2024年PDF转换成PPT三步走,职场小白秒变高手

这个信息满天飞的时代&#xff0c;我们几乎天天都得处理一堆文件&#xff0c;PDF和PPT这对搭档简直就是我们工作学习中的老面孔。你有没有碰到过这种头疼事&#xff1a;急着要把PDF转成PPT来准备个演讲&#xff0c;但就是找不到个又快又好使的招&#xff1f;别慌&#xff0c;今…

一文搞懂大模型!基础知识、 LLM 应用、 RAG 、 Agent 与未来发展

LLM 探秘&#xff1a;想要深入了解人工智能界的“新宠”大型语言模型&#xff08;LLM&#xff09;吗&#xff1f;本文将带你走进 LLM 的世界&#xff0c;从入门知识到实际应用&#xff0c;全方位解读这个充满魔力的“大模型”。我们将一起揭开 LLM 的神秘面纱&#xff0c;领略其…

代码随想录算法训练营第三十九天 | 198.打家劫舍 , 213.打家劫舍II , 337.打家劫舍III

目录 198.打家劫舍 思路 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 方法一&#xff1a; 动态规划-一维 方法二&#xff1a;动态规划-二维 方法三&#xff1a;动态规划-两个变…

零知识证明-基础数学(二)

零知识证明(Zero—Knowledge Proof)&#xff0c;是指一种密码学工具&#xff0c;允许互不信任的通信双方之间证明某个命题的有效性&#xff0c;同时不泄露任何额外信息 导数、偏导数 ,互质数&#xff0c;费马小定理&#xff0c;欧拉定理 1 导数 导数是微积分学中的重要概念&am…

从《黑神话:悟空》看中国3A游戏之路:历史回顾与未来展望

近年来&#xff0c;随着中国游戏行业的不断发展&#xff0c;一款名为《黑神话&#xff1a;悟空》的游戏引发了全球的广泛关注。这款游戏不仅在视觉效果和动作设计上令人惊艳&#xff0c;还被誉为中国3A游戏的里程碑。然而&#xff0c;从《黑神话&#xff1a;悟空》的发布&#…

STM32-PWM驱动呼吸灯——HAL库

&#xff08;根据B站up主keysking的STM32教程视频的笔记&#xff09; 【STM32】动画讲解轻松学会STM32的PWM_哔哩哔哩_bilibili 什么是PWM&#xff1f; PWM&#xff0c;全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种调制技术&#xf…

对各项数据的统计汇总,集中展示,便于查看厂区情况的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

【云原生】Kubernetes中常见的Pod故障排查定位与解决方案

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

3D环绕音效增强软件 Boom3D for Mac v2.0.2 中文破解版下载

Boom3D for Mac 专业的3D环绕音效增强软件中文版&#xff0c;Boom 3D是适用于Mac和Windows系统的专业音效增强软件&#xff0c;旨在通过播放器&#xff0c;媒体或流媒体服务等介质&#xff0c;在不同类型的耳机上以3D环绕效果播放媒体内容。您无需使用昂贵的耳机或其他附加环绕…