压缩编码之JPEG变换编码不同压缩率的模拟的实现——数字图像处理

news/2024/7/21 6:55:19 标签: 计算机视觉, 图像处理, 人工智能, opencv, python

原理

离散余弦变换(DCT)和量化是图像压缩中的两个关键步骤,尤其是在JPEG压缩标准中。

离散余弦变换(DCT):DCT的目的是将图像从空间域(即像素表示)转换到频率域。这种转换后,图像的能量会集中在少数几个系数中,特别是低频系数中。
图像的大部分视觉信息都包含在低频成分中,而高频成分通常与图像细节(如边缘、纹理)相关。
**量化:**量化是压缩过程中降低DCT系数精度的步骤。它通过使用一个预定义的量化矩阵来完成,该矩阵决定了每个DCT系数被缩减的程度。
量化的过程实际上是一种有损压缩。较大的量化值导致更多的数据丢失,但也提供了更高的压缩比。量化矩阵通常设计为对高频成分进行更激烈的量化(因为人眼对高频细节的敏感度较低),而保留更多的低频成分。

图像质量与量化级别的关系:

低量化级别:使用较低的量化级别(或者说量化矩阵的缩放参数小)会保留更多的DCT系数,从而保留更多的图像细节和质量,但这会导致较低的压缩比。
高量化级别:较高的量化级别(量化矩阵的缩放参数大)会导致更多的DCT系数被减少或归零,从而提高压缩比,但同时会导致图像质量下降,表现为模糊和块状伪影(尤其在高频细节区域)。
视觉感知和压缩效率:

人眼对不同频率的细节有不同的敏感度。通过利用这一点,量化可以被设计成在保持相对较好的视觉质量的同时,实现有效的数据压缩。
在实际应用中,量化矩阵和量化级别的选择取决于目标压缩比和可接受的图像质量损失。

总结:DCT和量化是实现图像压缩的关键步骤。DCT帮助集中图像数据的能量,而量化则减少数据的精度以减小文件大小。量化级别的选择对压缩效率和图像质量有直接影响。较低的量化级别保留更多的细节但压缩率低,而较高的量化级别虽然提高压缩率,但会导致显著的图像质量下降。正确的平衡取决于特定应用的需求和对图像质量的容忍度。

python_21">python实现

在这里插入图片描述

提示

结果显示了用不同比例因子去乘标准化阵列后得到的DCT编解码结果。先将原图分割为大小为8×8的子图像,并对每个子图像进行DCT变换,之后对系数阵列进行如下运算来对其量化:
在这里插入图片描述

python_27">python代码

python">import  cv2
import numpy as np
import matplotlib.pyplot as plt

img=cv2.imread("lena_gray_512.tif",0)
img=img.astype(np.float)
rows,cols=img.shape

img_list = []
img_name_list = []
Z = np.array([[16, 11, 10, 16, 24, 40, 51, 61],
     [12, 12, 14, 19, 26, 58, 60, 55],
     [14, 13, 16, 24, 40, 57, 69, 56],
     [14, 17, 22, 29, 51, 87, 80, 62],
     [18, 22, 37, 56, 68, 109, 103, 77],
     [24, 35, 55, 64, 81, 104, 113, 92],
     [49, 64, 78, 87, 103, 121, 120, 101],
     [72, 92, 95, 98, 112, 100, 103, 99]])
scl_par=[1,2,4,8,16,32]
for scl in scl_par:
    dct_inv_img = np.zeros(img.shape)
    for i in range(0, rows, 8):
        for j in range(0, cols, 8):
            dct = cv2.dct(img[i:i+8, j:j+8])
            dct = np.round(dct / (Z * scl))

            dct_inv_img[i:i+8, j:j+8] = cv2.idct(dct)

    img_list.append(dct_inv_img)
    img_name_list.append('scl=' + str(scl))

_, axs = plt.subplots(2, 3)

for i in range(2):
    for j in range(3):
        axs[i, j].imshow(img_list[i*3+j], cmap='gray')
        axs[i, j].set_title(img_name_list[i*3+j])
        axs[i, j].axis('off')

plt.show()

结果展示

在这里插入图片描述

总结

在JPEG压缩编码原理介绍中就知道整个JPEG压缩原理就是通过DCT变换去空间冗余来达到图片压缩的。经过DCT变换之后DCT系数只保留的左上角的数据(低频分量数据),右下角部分均变成0.因此,想要进一步压缩就可以从量化表下手。量化表的量化系数越大,得到的量化后的DCT系数就越小,高频信息消失的更多,图片容量就越小。


http://www.niftyadmin.cn/n/5328318.html

相关文章

屏幕录制软件有哪些?强烈推荐5款免费好用录屏软件

录制全屏视频是制作视频教程、评论、游戏等内容的绝佳方式。它可以包括您计算机屏幕上的任何活动以及您的音频和网络摄像头。特别是,屏幕录像机对喜欢创建软件评论的视频博主很有帮助。如果您是其中之一,那么好消息是您可以在网络上找到很多屏幕录制应用…

统计学-R语言-4.7

文章目录 前言描述水平的统计量平均数分位数中位数四分位数 众数描述差异的统计量(数据离散程度)极差四分位差方差和标准差变异系数标准分数 描述分布形状的统计量偏度与偏度系数峰度与峰度系数 数据的综合描述综合描述的R函数综合描述的实例 总结 前言 …

Hutool改变我们的coding方式(二)

Hutool改变我们的coding方式 Hutool📚简介🍺Hutool如何改变我们的coding方式📝文档📦安装🍊Maven 1、文件读取FileReader2、文件写入FileWriter3、资源工具ResourceUtil4、ClassPath资源访问ClassPathResource5、Prope…

关于浮点数的四舍五入问题

最近有关注到,在C/C中,对于浮点数的四舍五入,与实际的有一些出入,我打算今天总结一下,并解释一下这是为啥, 好了,下面进入正题,都是干货哦,认真看完,留下你的…

Go+快速开始详细指南

Go快速开始 Go编程语言是为工程、STEM教育和数据科学设计的。 对于工程:用儿童能掌握的最简单的语言工作。对于STEM教育:学习一门可以在未来工作中使用的工程语言。对于数据科学:用同一种语言与工程师交流。 安装方法 现在,我们建议您从源代码安装Go。 注意:需…

数据结构与算法-二叉树-后序遍历

二叉树的后续遍历 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1]递归版本实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;*…

一台电脑如何通过另一台联网电脑访问网络

电脑A没有连接网络,电脑B已经连接wifi。 电脑A如何通过访问电脑B从而连接网络? 1. 将这2台电脑用网线直连 2. 电脑B打开【网络和Internet设置】 3. 右键点击WLAN,选择属性,进入共享tab页面,勾选【允许其他网络用户通过…

Vue3+antDesignVue实现表单校验

一 <a-formref"form":model"form":rules"rules":label-col"{ md: { span: 6 }, sm: { span: 24 } }":wrapper-col"{ md: { span: 18 }, sm: { span: 24 } }"><!-- <a-form-item label创建人: namecreated…