压缩编码之变换的选择之离散余弦变换(DCT)和离散傅立叶变换(DFT)——数字图像处理

news2025/1/11 20:45:28

原理

变换的选择是一个关键的考量因素,它决定了数据是如何被压缩的。选择变换时考虑以下几个重要原则:

数据去关联性:变换的目的之一是减少数据中的相关性。例如,在图像压缩中,像素间往往高度相关。通过适当的变换,如离散余弦变换(DCT),可以将这些相关性转化为更加独立的形式,从而提高压缩效率。

能量集中:理想的变换应该能将数据的能量(或信息)集中到尽可能少的系数中。这样,通过仅编码这些主要系数,就可以在保留大部分信息的同时实现有效的压缩。

可逆性:对于无损压缩,变换必须是可逆的,这意味着从压缩数据中可以完全恢复原始数据。对于有损压缩,这一要求可以放宽,允许在接受某种程度信息损失的前提下获得更高的压缩比。

计算效率:变换过程应该足够高效,以便于在实际应用中快速处理大量数据。这通常意味着变换算法需要能够被有效地实现,且计算复杂度可接受。

适应性:在某些情况下,变换应该具有适应性,能够根据数据的特性进行调整。例如,在音频和视频压缩中,根据内容的不同,可能需要使用不同的变换策略。

编码后的数据特性:变换应该产生便于编码的数据。例如,高效的压缩算法通常会生成具有高峰值和长尾分布的数据,这使得熵编码等技术更加有效。
变换的选择取决于特定应用的需求和特性。

以下是几种常用于数据压缩的变换:

离散余弦变换(DCT):这种变换广泛用于图像和视频压缩,例如在JPEG图像格式中。DCT能有效地将图像数据从空间域转换到频率域,使得图像中的高频信息(通常是细节部分)和低频信息(图像的主要部分)得以分离,从而便于进行更高效的压缩。

小波变换:小波变换在图像和视频压缩中也很流行,特别是在JPEG 2000图像格式中。与DCT相比,小波变换提供了更好的尺度和位置控制,使其在处理具有不同尺度特征的图像时更加有效。

离散傅立叶变换(DFT):虽然DFT在图像压缩中不如DCT常用,但它在音频压缩和通信系统中非常重要。DFT可以将时域信号转换为频域信号,使得频域中的能量分布更加明显,从而便于压缩。

Karhunen-Loève变换(KLT):这种变换在理论上可以提供最佳的数据压缩,但由于其高计算复杂性和数据依赖性,它在实际应用中不太常用。

**奇异值分解(**SVD):虽然SVD的计算成本较高,但它在某些特定应用中,如图像压缩的特定场景中,能提供优秀的压缩效果。

选择哪种变换取决于多种因素,包括压缩的目标(无损或有损)、数据类型(图像、视频、音频等)、处理速度要求、以及最终压缩数据的预期用途。在实际应用中,这些变换通常与其他压缩技术(如量化和熵编码)结合使用,以达到最优的压缩效果。

python实现下图

在这里插入图片描述

提示

结果显示了原图的两种变换后近似。先将原图分割为大小为8×8的子图像,并对每个子图像进行DCT和DFT变换,之后保留幅值最大的32个系数,最后对截尾后的系数阵列进行反变换得到近似图像,并计算原图与近似图之间的误差图像。
注意:dct变换可以通过函数cv2.dct(img)来实现,需要注意img在做dct变换之前需要转换为float类型。此外,为了增加误差图像的对比度,可用如下语句显示误差图像axs[i, j].imshow(img, vmin=img.min()*0.1, vmax=img.max()*0.1, cmap=‘gray’)

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
dct_inv_img = np.zeros(img.shape)
dft_inv_img = np.zeros(img.shape)
dct_dif_img = np.zeros(img.shape)
dft_dif_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])
        dft = np.fft.fft2(img[i:i+8, j:j+8])
        # idx = np.argpartition(dct.ravel(), 32)[:32]
        # idx2d = np.unravel_index(idx, dct.shape)
        # dct[idx2d] = 0
        med = np.median(np.abs(dct))
        dct[np.abs(dct) < med] = 0
        med = np.median(np.abs(dft))
        dft[np.abs(dft) < med] = 0

        dct_inv_img[i:i+8, j:j+8] = cv2.idct(dct)
        dft_inv_img[i:i+8, j:j+8] = np.abs(np.fft.ifft2(dft))
dct_dif_img=img-dct_inv_img
dft_dif_img=img-dft_inv_img


img_list = [img, dct_inv_img, dct_dif_img, img, dft_inv_img, dft_dif_img]
img_name_list = ['original', 'dct', 'dct_diff', 'original', 'dft', 'dft_diff']
_,axs=plt.subplots(2,3)

for i in range(2):
    for j in range(3):
        if j==2:
            axs[i, j].imshow(img_list[i*3+j], vmin=img_list[i*3+j].min()*0.1, vmax=img_list[i*3+j].max()*0.1, cmap='gray')
        else:
            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()

结果展示

在这里插入图片描述

总结

在变化编码中,其性能与所选用的正交变换类型,图像类型,变化块的大小,压缩方式和压缩程度等因素有关。在变换方式确定之后,变换块的大小选择就显得尤为重要,因为大多数图像统计结果显示,大多数图像仅在约20个相邻像素间有较大的相关性,而且一般当子图像尺寸n>16(像素)时,其性能已经改善不大。同时,如果子图像块过大,其中所包含的像素就越多,变换时所需要的计算量也就越大,因此一般子图像块的大小选为8像素8像素或16像素16像素。对图像进行字块划分的好处是:小块图像的变换计算容易,它可以将传输误差造成的图像损伤限制在子图像的范围之内,从而避免误码的扩散。

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

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

相关文章

Redis-Cluster 与 Redis 集群的技术大比拼

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis-Cluster 与 Redis 集群的技术大比拼 前言概念与原理对比Redis-Cluster&#xff1a;基于哈希槽的分布式解决方案传统 Redis 集群&#xff1a;主从架构下的数据分片方式 搭建与配置的异同Redis-Cl…

跟着小德学C++之进程信息记录

嗨&#xff0c;大家好&#xff0c;我是出生在达纳苏斯的一名德鲁伊&#xff0c;我是要立志成为海贼王&#xff0c;啊不&#xff0c;是立志成为科学家的德鲁伊。最近&#xff0c;我发现我们所处的世界是一个虚拟的世界&#xff0c;并由此开始&#xff0c;我展开了对我们这个世界…

JS逆向之加密参数定位

文章目录 前言加密参数的处理步骤加密参数的定位方法搜索断点XHR断点DOM断点EVENT断点 hook 前言 当我们对网络请求进行抓包分析之后&#xff0c;需要用开发者工具对加密参数进行全局搜索。当搜索不到加密参数的时候&#xff0c;应该采取什么解决方法去定位。 还有一个应用场…

Tomcat-快速使用

关于Tomcat的概念及来由在Tomcat基本知识中进行了介绍&#xff0c;下面我们直接上手快速使用起来。 一、快速使用 &#xff08;1&#xff09;tomcat下载 &#xff08;2&#xff09;解压缩 &#xff08;3&#xff09;启动程序 &#xff08;4&#xff09;访问tomcat&#xff1a…

Windows和Linux中检查端口是否被占用

一、windows 1、查询端口占用情况 cmd > netstat -ano 2、查询8080端口是否被占用 cmd > netstat -ano|findstr 8080 3、查询哪个程序占用了端口 cmd > tasklist|findstr PID 4、终止该占用进程 cmd > ntsd -c q -p PID 二、Linux 1、查询8080端口是否被占用…

windows10 装docker和docker compose

一.windows环境准备 开启过程中的问题&#xff0c;进入bios修复 二.docker下载安装 1.下载 Docker Desktop: The #1 Containerization Tool for Developers | Docker 下载最新版有问题&#xff0c;下载老版本试试 Docker Desktop release notes | Docker Docs 2.安装 三.do…

GitHub pull request(傻瓜式入门版)

基础入门版 pull request一、fork项目二、clone代码到本地三、进入到克隆的项目目录下四、列出所有分支五、创建一个本地分支&#xff0c;并追踪远程项目分支六、查看当前分支七、与远程仓库建立连接八、与上游仓库建立连接八、同步最新代码九、修改代码并提交十、提交pr pull …

虚幻引擎:开创视觉与创意的新纪元

先看看据说虚幻5做出来的东西吧&#xff1a; 虚幻引擎5&#xff01;&#xff01;&#xff01;4K画质PS5实机演示&#xff01; 好了&#xff0c;用文字认识一下吧&#xff1a; 虚幻引擎5.3对UE5的核心工具集作了进一步优化&#xff0c;涉及渲染、世界构建、程序化内容生成&…

服务器执行rm命令时自动记录到审计日志中

目的 当在服务器上执行类似于 rm 命令时&#xff0c;自动记录该命令执行的时间&#xff0c;在哪里执行的&#xff0c;删除的什么文件&#xff0c;记录到审计日志中&#xff0c;能够查找到某些文件丢失原因 配置 # 需要root权限&#xff0c;sudo不行&#xff0c;这里假设执行…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说&#xff0c;在短时间内开发一款高质量设备专用软件&#xff0c;是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台&#xff0c;让客户快速高效的开发自己的设备专…

PyQt5零基础入门(二)——QLabel控件

前言 QLabel控件可以视为是一个标签项&#xff0c;具有显示文本、图像的作用。在本篇文章中将介绍QLabel控件的常见用法。 例子 显示文本 import sys from PyQt5.QtWidgets import *if __name__ "__main__":app QApplication([])label QLabel(Hello world!)la…

了解结构体以及结构体数组

C语言的结构体你真的了解吗&#xff1f; 一起来看一下吧&#xff01;&#xff01;&#xff01; 1.结构体是啥&#xff1f; 结构体是多种数据类型的组合体 2.格式&#xff08;一般放在主函数前&#xff0c;也就是int main()前面 &#xff09; 关键字 结构体名字 {成员列表…

网络安全B模块(笔记详解)- Web信息收集

Web信息收集 1.通过Kali对服务器场景Linux进行Web扫描渗透测试(使用工具nikto,查看该命令的完整帮助文件),并将该操作使用命令中固定不变的字符串作为Flag提交; Flag:nikto -H 2.通过Kali对服务器场景Linux进行Web扫描渗透测试(使用工具nikto,扫描目标服务器8080端口,…

springCould中的Bus-从小白开始【11】

目录 &#x1f9c2;1.Bus是什么❤️❤️❤️ &#x1f32d;2.什么是总线❤️❤️❤️ &#x1f953;3.rabbitmq❤️❤️❤️ &#x1f95e;4.新建模块3366❤️❤️❤️ &#x1f373;5.设计思想 ❤️❤️❤️ &#x1f37f;6.添加消息总线的支持❤️❤️❤️ &#x1f9…

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中&#xff0c;本地环境&#xff08;dev&#xff09;和开发环境&#xff08;feature&#xff09;会共同使用相同的中间件&#xff08;本篇拿Redis举例&#xff09;&#xff0c;对于不同环境中的&#xff0c;图片、视频、语音等资源类型的预览地址url&#xff0c;需要配…

Ncast盈可视 高清智能录播系统 IPSetup.php信息泄露+RCE漏洞复现(CVE-2024-0305)

0x01 产品简介 Ncast盈可视 高清智能录播系统是广州盈可视电子科技有限公司一种先进的音视频录制和播放解决方案,旨在提供高质量、高清定制的录播体验。该系统采用先进的摄像和音频技术,结合强大的软件平台,可以实现高清视频录制、多路音频采集、实时切换和混音、定制视频分…

thinkphp学习07-数据库的数据查询

单数据查询 单条数据查询&#xff0c;一般是一维数组 Db::table()中 table 必须指定完整数据表&#xff08;包括前缀&#xff09;&#xff0c;如果配置了表前缀&#xff0c;Db::name()中可以忽略 如果希望只查询一条数据&#xff0c;可以使用 find()方法&#xff0c;需指定 wh…

赋能智慧农业生产,基于YOLOv7开发构建农业生产场景下油茶作物成熟检测识别系统

AI赋能生产生活场景&#xff0c;是加速人工智能技术落地的有利途径&#xff0c;在前文很多具体的业务场景中我们也从实验的角度来尝试性地分析实践了基于AI模型来助力生产生活制造相关的各个领域&#xff0c;诸如&#xff1a;基于AI硬件实现农业作物除草就是一个比较熟知的场景…

IDEA中在Java项目中添加Web模块 与配置tomcat服务器

现有项目添加直接走第二步 生成普通新项目 给项目添加框架支持 勾选 Web Application 选项, 点击OK 得到项目目录结构 , 出现web目录结构, 且web目录文件夹出现小蓝点 web或webapp 没有出现小蓝点 说明web配置没有出现或是手动构建的目录结构 , 在IDE关闭或者迁移项目时会出…

【申请SSL证书】免费申请阿里云SSL证书

注意&#xff1a;申请 SSL证书的前提是有一个域名且备案了 第一部&#xff1a;申请免费证书 免费 CA 证书购买地址&#xff08;请戳这里&#xff09; 选择合适的选项如下图 为了解决免费证书近期存在的吊销、统计等问题&#xff0c;自2021年起&#xff0c;免费证书申请申请将…