压缩编码之不同缩放参数对重建图像质量的影响的python实现——JPEG变换编码不同压缩率的模拟

原理

JPEG(Joint Photographic Experts Group)是一种常用的图像压缩标准,它通过采用离散余弦变换(DCT)和量化来实现图像的压缩。

离散余弦变换(DCT):

JPEG首先将图像分割成8x8的块。对于每个块,使用离散余弦变换(DCT)将空间域的图像数据转换为频域的系数。
DCT变换会将图像信息从原始的空间域转换到频域,这意味着图像中的信息被表示为一系列频率分量。
量化:

对于DCT变换后的每个8x8块,JPEG使用一个量化矩阵将其系数进行量化。量化的目的是减小高频部分的系数,因为在视觉上,人对于高频细节的敏感性较低。
JPEG定义了不同的量化矩阵,而不同的量化矩阵会导致不同的压缩质量。更高的压缩率通常对应着更大的量化值,因此导致更多的系数被舍弃。
熵编码:
量化后,对每个块的系数进行熵编码,通常使用Huffman编码。
Huffman编码是一种变长编码,通过为频繁出现的值分配短码字,为不太频繁出现的值分配长码字,从而进一步减小图像数据的大小。
压缩率控制:

JPEG允许用户通过设置不同的压缩质量参数来控制压缩率。更高的压缩质量通常对应着更小的压缩率,因为它会导致更少的量化失真。
压缩率的选择通常是一个权衡,用户需要根据具体的应用需求和存储/传输限制来确定适当的压缩率。
总的来说,JPEG通过DCT、量化和熵编码的组合来实现图像的有损压缩。不同的压缩率主要通过调整量化矩阵和压缩质量参数来实现。更高的压缩率通常会导致更多的信息损失,但可以获得更小的文件大小。

python实现下图

在这里插入图片描述

提示

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

在这里插入图片描述
在这里插入图片描述
最后对量化后的系数阵列进行反变换得到近似图像。

代码

import  cv2
import numpy as np
import matplotlib.pyplot as pltimg=cv2.imread("lena_gray_512.tif",0)
img=img.astype(np.float)
rows,cols=img.shapeimg_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压缩原理就是通过DCT变换去空间冗余来达到图片压缩的。经过DCT变换之后DCT系数只保留的左上角的数据(低频分量数据),右下角部分均变成0.因此,想要进一步压缩就可以从量化表下手。量化表的量化系数越大,得到的量化后的DCT系数就越小,高频信息消失的更多,图片容量就越小。

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

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

相关文章

LeetCode 160: 两个链表的相交节点 - 优雅解法

LeetCode 160: Intersection of Two Linked Lists 题目描述 给定两个单链表 headA 和 headB 的头节点,返回它们相交的节点。如果两个链表没有相交,返回 null。 示例: 输入:intersectVal 8, listA [4,1,8,4,5], listB [5,6,1,8,4,5], sk…

【安全策略】前端 JS 安全对抗浏览器调试方法

一、概念解析 1.1 什么是接口加密 如今这个时代,数据已经变得越来越重要,网页和APP是主流的数据载体。而如果获取数据的接口没有设置任何的保护措施,那么数据的安全性将面临极大的威胁。不仅可能造成数据的轻易窃取和篡改,还可能…

【shell编程入门】条件判断

前言 在 shell 编程中,[] 通常用于条件测试。 条件中的参数 字符串比较: : 字符串相等。!: 字符串不相等。 if [ "$string1" "$string2" ]; thenecho "字符串相等" fi文件测试: -e: 文件或目录是否存在…

MySQL事务原理与优化最佳实践

听课问题 除了读未提交,有一个事务对一条数据进行了修改,但是另外又有一个没有加事务的查询sql,那么读取到的数据是原始数据还是没提交的数据。 答案:没加事务的查询读取的是老数据,等事务提交以后就会读取新修改的数据 除了读…

高通平台开发系列讲解(USB篇)DWC3控制USB速率

文章目录 一、设备树二、相关结构体三、最大速率设置四、当前速率设置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB DWC3控制USB速率。 一、设备树 目录:msm-4.14/arch/arm64/boot/dts/qcom/sdxprairie-usb.dtsi dwc3@a600000 {compatibl…

为什么谷歌索引的页面数量会变少?

不知道大家是否会经常关注谷歌站长工具(GSC)中的页面索引报告,关注谷歌优化的人可能会时常查看该报告。通过该报告可以查看哪些网页已经编入索引,哪些网页还未编入索引以及未被编入索引的原因。那么今天就来讲下如何诊断收录问题并…

通过myBatis将sql语句返回的值自动包装成一个java对象(2)

1.之前我们是如何执行一个sql语句自动包装成一个java对象呢? 1.创建一个mapper.xml,定义 执行的语句名字 和 包装成什么类 2.在总的配置文件里申明这个mapper 3.在java里通过sqlSession执行mapper里定义好的内容 我们还可以使用另一种方法实现第三步。现…

md5使用教程

md5使用教程 简单介绍: MD5,全称Message-Digest Algorithm 5,是一种被广泛使用的密码散列函数,可以生成一个128位(16字节)的散列值(hash value),通常用32位的十六进制数表…

java如何修改windows计算机本地日期和时间?

本文教程,主要介绍,在java中如何修改windows计算机本地日期和时间。 目录 一、程序代码 二、运行结果 一、程序代码 package com;import java.io.IOException;/**** Roc-xb*/ public class ChangeSystemDate {public static void main(String[] args)…

快速更改flutter已有项目的项目名称和id等

如果你使用了别人已有的仓库模板或者想更改现有项目的名称,是一件非常繁琐的工作,需要修改全平台的文件还是相当麻烦的,所以这里推荐一个小工具,可以帮助大家快速实现更改项目名称的目的,这个工具地址:rena…

MySQL 5.x与8.X 版本差异

MySQL 5.x与8.x 版本之间存在多个重要差异和改进,以下是一些主要的更新内容: 性能改进 MySQL 8.0在查询优化器、并发控制、内存管理和缓存机制等方面进行了显著的性能提升,从而提高了整体处理能力和响应速度。 JSON支持增强 MySQL 5.x对JSON的…

任务14:使用MapReduce提取全国每年最低/最高气温

任务描述 知识点: 使用MapReduce提取数据 重 点: 开发MapReduce程序统计每年每个月的最低气温统计每年每个月的最高气温 内 容: 使用IDEA创建一个MapReduce项目开发MapReduce程序使用MapReduce统计每年每个月的最低气温使用MapReduce…

正则表达式和爬虫

目录 一、正则表达式: 作用: 字符类(只匹配一个字符) 细节 预定义字符字符(只匹配一个字符) 细节 数量词 二、爬虫 Pattern Matcher 要点说明 一、正则表达式: 作用: 1、校验字符…

pytorch集智-5手写数字识别器-卷积神经网络

1 简介 简称:CNN,convolutional neural network 应用场景:图像识别与分类(CNN),看图说话(CNNRNN)等 优越性:和多层感知机相比,cnn可以识别独特的模式&…

【经验总结】使用静态库编译静态库的方法

一,简介 本文主要介绍,如何使用静态库编译生成另外一个静态库的方法。由于编译静态库不能直接链接静态库,需要将静态库解压成.o文件,然后将解压之后的.o文件,连同其他.o文件一起打包成为.a文件。 二,操作…

Kubernetes (K8S) 3 小时快速上手 + 实践

1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序,可帮助创建和管理应用程序的容器化。用一个的例子来描述:"当虚拟化容器Docker有太多要管理的时候,手动管理就会很麻烦,于是我们便可以通…

二叉树:从基础结构到高级遍历技术

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 引言结构定义接口需求构建二叉树销毁二叉树计算节点和叶子的数量二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数 二叉树查找值为x的节点二叉树的…

立白科技集团:研发安全推动数字化蜕变,日化业务再上新高度

立白科技集团成立于1994年,是我国日化行业的领军企业,致力于成为一家“品牌引领、数字经营、富有创新、富有活力”的智慧服务型企业。从2018年开始,立白科技集团加速数字化转型,打造数据和业务中台,并建立toB和toC平台…

修改和调试 onnx 模型

1. onnx 底层实现原理 1.1 onnx 的存储格式 ONNX 在底层是用 Protobuf 定义的。Protobuf,全称 Protocol Buffer,是 Google 提出的一套表示和序列化数据的机制。使用 Protobuf 时,用户需要先写一份数据定义文件,再根据这份定义文…

【Android Studio】使用简单的adb命令远程连接设备进行调试以及文件推送

在使用Android Studio开发时候遇到设调试的时候,由于需要调试的设备不是这种移动设备,需要连接线路到电脑上很不方便操作,后面发现可以通过远程连接的方式,减少不必要的操作复杂度。 一、找到项目中adb配置的工具位置 一般情况下…