OpenCV 图像压缩完整指南
本篇文章向大家介绍《OpenCV 图像压缩完整指南》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。
图像压缩是计算机视觉中的一项关键技术,它使我们能够更有效地存储和传输图像,同时保持视觉质量。理想情况下,我们希望拥有最佳质量的小文件。然而,我们必须做出权衡并决定哪个更重要。
本教程将教授使用 opencv 进行图像压缩,涵盖理论和实际应用。最后,您将了解如何为计算机视觉项目(或您可能拥有的任何其他项目)成功压缩照片。
什么是图像压缩?
图像压缩正在减小图像的文件大小,同时保持可接受的视觉质量水平。有两种主要的压缩类型:
- 无损压缩:保留所有原始数据,允许精确的图像重建。
- 有损压缩: 丢弃一些数据以获得更小的文件大小,可能会降低图像质量。
为什么要压缩图像?
如果正如我们经常听到的那样“磁盘空间很便宜”,那么为什么还要压缩图像呢?在小范围内,图像压缩并不重要,但在大范围内,它至关重要。
例如,如果您的硬盘上有一些图像,您可以压缩它们并保存几兆字节的数据。当硬盘驱动器以 tb 为单位时,这不会产生太大影响。但如果您的硬盘上有 100,000 张图像怎么办?一些基本的压缩可以节省实时时间和金钱。从性能的角度来看,是一样的。如果您的网站包含大量图像,并且每天有 10,000 人访问您的网站,那么压缩就很重要。
这就是我们这样做的原因:
- 减少存储要求:在同一空间中存储更多图像
- 更快的传输:非常适合网络应用程序和带宽受限的场景
- 提高处理速度:较小的图像加载和处理速度更快
图像压缩背后的理论
图像压缩技术利用两种类型的冗余:
- 空间冗余:相邻像素之间的相关性
- 颜色冗余:相邻区域颜色值的相似度
空间冗余利用了大多数自然图像中相邻像素往往具有相似值的事实。这会产生平滑的过渡。许多照片“看起来很真实”,因为从一个区域到另一个区域有一种自然的流动。当相邻像素具有截然不同的值时,您会得到“嘈杂”的图像。像素发生了变化,通过将像素分组为单一颜色,使这些过渡变得不那么“平滑”,从而使图像更小。
颜色冗余,另一方面,重点关注图像中的相邻区域如何经常共享相似的颜色。想象一下蓝天或绿地——图像的大部分可能具有非常相似的颜色值。它们也可以组合在一起并制成单一颜色以节省空间。
opencv 提供了用于处理这些想法的可靠工具。例如,opencv 的 cv2.inpaint() 函数利用空间冗余,使用附近像素的信息填充图片中缺失或损坏的区域。 opencv 允许开发人员使用 cv2.cvtcolor() 在多个关于颜色冗余的颜色空间之间转换图像。这作为许多压缩技术中的预处理步骤可能会有所帮助,因为某些颜色空间在编码特定类型的图像时比其他颜色空间更有效。
我们现在将测试这个理论的一些内容。我们来玩一下吧。
动手实践图像压缩
让我们探索如何使用 opencv 的 python 绑定来压缩图像。写下此代码或复制它:
您也可以在这里获取源代码
import cv2 import numpy as np def compress_image(image_path, quality=90): # read the image img = cv2.imread(image_path) # encode the image with jpeg compression encode_param = [int(cv2.imwrite_jpeg_quality), quality] _, encoded_img = cv2.imencode('.jpg', img, encode_param) # decode the compressed image decoded_img = cv2.imdecode(encoded_img, cv2.imread_color) return decoded_img # example usage original_img = cv2.imread('original_image.jpg') compressed_img = compress_image('original_image.jpg', quality=50) # display results cv2.imshow('original', original_img) cv2.imshow('compressed', compressed_img) cv2.waitkey(0) cv2.destroyallwindows() # calculate compression ratio original_size = original_img.nbytes compressed_size = compressed_img.nbytes compression_ratio = original_size / compressed_size print(f"compression ratio: {compression_ratio:.2f}")
此示例包含一个 compress_image 函数,该函数采用两个参数:
- 图片路径(图片所在的位置)
- 质量(所需图像的质量)
然后,我们将原始图像加载到original_img中。然后,我们将同一图像压缩 50% 并将其加载到新实例压缩图像中。
然后我们将显示原始图像和压缩图像,以便您可以并排查看它们。
然后我们计算并显示压缩比。
此示例演示了如何在 opencv 中使用 jpeg 压缩来压缩图像。质量参数控制文件大小和图像质量的权衡。
让我们运行它:
最初查看图像时,您发现几乎没有什么区别。然而,放大后你会发现质量的差异:
关闭窗口并查看文件后,我们可以看到文件的大小急剧减小:
另外,如果我们进一步降低,我们可以将质量更改为10%
compressed_img = compress_image('sampleimage.jpg', quality=10)
结果更加剧烈:
文件大小结果也更加剧烈:
您可以非常轻松地调整这些参数,并在质量和文件大小之间达到所需的平衡。
评估压缩质量
为了评估压缩的影响,我们可以使用以下指标:
- 均方误差(mse)
均方误差 (mse) 衡量两个图像之间的差异程度。当您压缩图像时,mse 可以帮助您确定压缩图像与原始图像相比发生了多少变化。
它通过对两个图像中相应像素的颜色之间的差异进行采样、对这些差异进行平方并求平均值来实现此目的。结果是一个数字:较低的 mse 意味着压缩图像更接近原始图像。相比之下,更高的 mse 意味着质量损失更明显。
这里有一些 python 代码来衡量:
def calculate_mse(img1, img2): return np.mean((img1 - img2) ** 2) mse = calculate_mse(original_img, compressed_img) print(f"mean squared error: {mse:.2f}")
这是我们的演示图像压缩的样子:
- 峰值信噪比(psnr)
峰值信噪比(psnr)是衡量压缩后图像质量下降程度的指标。这通常是肉眼可见的,但它指定了一个设定值。它将原始图像与压缩图像进行比较,并将差异表示为比率。
psnr 值越高,意味着压缩后的图像质量更接近原始图像,表明质量损失更少。 psnr 越低意味着退化越明显。 psnr 通常与 mse 一起使用,psnr 提供了一个更易于解释的量表,其中越高越好。
这是一些测量这一点的 python 代码:
def calculate_psnr(img1, img2): mse = calculate_mse(img1, img2) if mse == 0: return float('inf') max_pixel = 255.0 return 20 * np.log10(max_pixel / np.sqrt(mse)) psnr = calculate_psnr(original_img, compressed_img) print(f"psnr: {psnr:.2f} db")
这是我们的演示图像压缩的样子:
“观察”压缩后的图像以确定质量是否良好;然而,在大规模上,让脚本执行此操作是设置标准并确保图像遵循这些标准的更简单的方法。
让我们看看其他一些技巧:
先进的压缩技术
对于更高级的压缩,opencv 支持各种算法:
- png 压缩:
您可以将图像转换为png格式,这有很多优点。使用以下代码行,您可以根据需要将压缩设置为 0 到 9。 0 表示不进行任何压缩,9 表示最大。请记住,png 是一种“无损”格式,因此即使在最大压缩下,图像也应保持完整。最大的权衡是文件大小和压缩时间。
这是使用 opencv 进行 png 压缩的代码:
cv2.imwrite('compressed.png', img, [cv2.imwrite_png_compression, 9])
这是我们的结果:
注意:有时您可能会注意到 png 文件实际上尺寸更大,就像在本例中一样。这取决于图像的内容。
- webp 压缩:
您还可以将图像转换为 .webp 格式。这是一种越来越流行的新型压缩方法。多年来我一直在博客上的图像上使用这种压缩。
在下面的代码中,我们可以将图像写入 webp 文件,并将压缩级别设置为 0 到 100。这与 png 的比例相反,因为 0,因为我们设置的是 quality 而不是 compression。这个微小的区别很重要,因为设置为 0 是可能的最低质量,文件大小较小且损失很大。 100是最高质量,这意味着大文件具有最好的图像质量。
这是实现这一目标的 python 代码:
cv2.imwrite('compressed.webp', img, [cv2.IMWRITE_WEBP_QUALITY, 80])
这是我们的结果:
这两种技术非常适合压缩大量数据。您可以编写脚本来自动压缩数千或数十万张图像。
结论
图像压缩非常棒。它在很多方面对于计算机视觉任务至关重要,尤其是在节省空间或提高处理速度时。当您想要减少硬盘空间或节省带宽时,计算机视觉之外还有许多用例。图像压缩有很大帮助。
通过理解其背后的理论并应用它,您可以在您的项目中做一些强大的事情。
请记住,有效压缩的关键是找到减小文件大小和保持应用程序可接受的视觉质量之间的最佳点。
感谢您的阅读,如果您有任何意见或问题,请随时与我们联系!
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

- 上一篇
- 如何编写针对多个用例进行优化的可重用 Java 函数?

- 下一篇
- 如何实现 PHP 函数的依赖注入?
-
- 文章 · python教程 | 3小时前 |
- Python追加文件内容的实用方法及技巧
- 403浏览 收藏
-
- 文章 · python教程 | 4小时前 |
- Python导入模块的正确方法及技巧
- 213浏览 收藏
-
- 文章 · python教程 | 4小时前 | Django Flask 性能优化 输入验证 RESTfulAPI
- Python实现RESTfulAPI的技巧与方法
- 104浏览 收藏
-
- 文章 · python教程 | 5小时前 |
- VSCode配置Python:插件推荐与调试技巧
- 167浏览 收藏
-
- 文章 · python教程 | 5小时前 |
- FastAPI在Python中依赖注入的使用技巧
- 445浏览 收藏
-
- 文章 · python教程 | 5小时前 | JSON 数据处理 beautifulsoup Pandas xml.etree.ElementTree
- Python爬虫数据处理实用技巧及应用
- 112浏览 收藏
-
- 文章 · python教程 | 6小时前 |
- 获取淘宝服务器时间的Python代码实战
- 460浏览 收藏
-
- 文章 · python教程 | 6小时前 | 工厂模式 单例模式 类方法 @classmethod 类变量
- Python类方法定义的终极攻略
- 269浏览 收藏
-
- 文章 · python教程 | 6小时前 | scikit-learn DBSCAN 数据预处理 K-means 轮廓系数
- Python聚类分析教程与实战技巧分享
- 259浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 29次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 43次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 40次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 51次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 43次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览