图像压缩是计算机视觉中的一项关键技术,它使我们能够更有效地存储和传输图像,同时保持视觉质量。理想情况下,我们希望拥有最佳质量的小文件。然而,我们必须做出权衡并决定哪个更重要。
本教程将教授使用 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 意味着质量损失更明显。
这里有一些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 通常与 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格式,它有很多优点。使用以下代码行,您可以根据需要将压缩设置为 0 到 9。 0 表示不进行任何压缩,9 表示最大。请记住,PNG 是一种“无损”格式,因此即使在最大压缩下,图像也应保持完整。最大的权衡是文件大小和压缩时间。
以下是使用 OpenCV 进行 PNG 压缩的代码:
cv2.imwrite('compressed.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 9])
这是我们的结果:
注意:有时您可能会注意到 PNG 文件实际上尺寸更大,如本例所示。这取决于图像的内容。
您还可以将图像转换为 .webp 格式。这是一种越来越流行的新型压缩方法。多年来我一直在博客上的图像上使用这种压缩。
在下面的代码中,我们可以将图像写入 webp 文件并将压缩级别设置为 0 到 100。这与 PNG 的比例相反,因为 0,因为我们设置的是 quality 而不是压缩。这个微小的区别很重要,因为设置为 0 是可能的最低质量,文件大小较小且损失很大。 100是最高质量,这意味着大文件具有最好的图像质量。
下面是实现这一点的 Python 代码:
cv2.imwrite('compressed.webp', img, [cv2.IMWRITE_WEBP_QUALITY, 80])
这是我们的结果:
这两种技术非常适合压缩大量数据。您可以编写脚本来自动压缩数千或数十万张图像。
图像压缩非常棒。它在很多方面对于计算机视觉任务都是至关重要的,特别是在节省空间或提高处理速度时。当您想要减少硬盘空间或节省带宽时,计算机视觉之外还有许多用例。图像压缩有很大帮助。
通过理解其背后的理论并应用它,您可以在您的项目中做一些强大的事情。
请记住,有效压缩的关键是找到减小文件大小和保持应用程序可接受的视觉质量之间的最佳平衡点。
感谢您的阅读,如果您有任何意见或问题,请随时与我们联系!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3