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

原理

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

数据去关联性:变换的目的之一是减少数据中的相关性。例如,在图像压缩中,像素间往往高度相关。通过适当的变换,如离散余弦变换(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 pltimg=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] = 0med = np.median(np.abs(dct))dct[np.abs(dct) < med] = 0med = np.median(np.abs(dft))dft[np.abs(dft) < med] = 0dct_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_imgimg_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.hqwc.cn/news/338744.html

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

相关文章

动手学深度学习二:关于熵和损失函数的理解

李沐动手学深度学习 课程网址&#xff1a;https://courses.d2l.ai/zh-v2/ 包含教材和视频网址链接 关于熵&#xff0c;教材中的描述非常形象&#xff0c;那就是描述信息量多少。当我们根据一些数据去预测一个结果&#xff0c;如果这些数据都单一的指向结果&#xff0c;那么这些…

Django的数据库模型的CharField字段的max_length参数与中文字符数的关系探索(参数max_length的单位是字符个数还是字节数?)

01-清理干净之前的数据库迁移信息 02-根据setting.py中的信息删除掉之前建立的数据库 03-删除之后重新创建数据库 04-models.py中创建数据库模型 from django.db import modelsclass User(models.Model):username models.CharField(max_length4)email models.EmailField(uni…

R语言安装教程(附安装包链接)

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件&#xff0c;它是一个用于统计计算和统计制图的优秀工具。 Mac支持M1芯片&#xff0c;下载其中的arm即可&#xff0c;其余下载另一个文件 下载链接&#xff1a; 链接: https://pan…

读元宇宙改变一切笔记04_网络化

1. 思想实验 1.1. 如果森林中的一棵树倒下&#xff0c;但周围没有人听到&#xff0c;那它是否会发出声音&#xff1f; 1.1.1. “贝克莱的树” 1.2. 主观唯心主义哲学家乔治贝克莱(George Berkeley)提出的&#xff0c;他认为“存在就是被感知” 1.2.1. 如果有人或有其他事物…

【Linux】Ubuntu 解压 zip、z01、z02等压缩文件的方法,Linux如何解压分卷压缩的

zip分卷压缩&#xff0c;在windows上压缩来的&#xff0c;如何解压这种文件&#xff1a; -rw-rw-r-- 1 20401094656 Dec 10 20:06 FFHQ.z01 -rw-rw-r-- 1 20401094656 Dec 10 20:10 FFHQ.z02 -rw-rw-r-- 1 20401094656 Dec 10 23:22 FFHQ.z03 -rw-rw-r-- 1 20401094656 Dec 10…

nvm管理多版本Node.js

nvm管理多版本Node.js 可能大家都曾苦恼于Node环境问题&#xff0c;某个项目需要升版本&#xff0c;某项目又需要降&#xff0c;甚至还出现npm版本与Node对不上的情况。 通过nvm进行版本管理&#xff0c;即可解决。 卸载Node 通过命令行输入node -v命令查看是否已安装Node&…

如何快速断行、分割行、切割行、换行、限制每行字数、平均分割每行字数、序号自动换行、关键字断行等等内容格式整理

首先&#xff0c;需要用到的这个工具&#xff1a; 百度 密码&#xff1a;qwu2蓝奏云 密码&#xff1a;2r1z 打开工具&#xff0c;切换到“文章工作域”&#xff08;嗯...默认就是&#xff09; 找到这个&#xff0c;多内容断行分割 点击打开&#xff0c;出现如下窗口设置 相关的…

C++游戏引擎中的坐标系

一.Direct3D四大变换 <1.世界矩阵变换: 为了模拟3D物体的旋转,缩放,平移等功能,Direct3D将静态模型的顶点坐标x,y,z经过旋转平移矩阵变换以得到新的顶点坐标x1,y1,z1 D3DXMATRIX mTrans ; D3DXMatrixTranslation (&mTrans , 5 , - 3 , 0 ); g_pd3dDevice->SetTr…

用java实现Client和Server之间的互相通信

概要&#xff1a;看过我之前文章的人都知道&#xff0c;client和server之间的通信必不可少的就是socket。而java已经帮我们做了很多事情。 创建Server端 第一步&#xff0c;创建ServerSocket 这个从名字上就可以看出来&#xff0c;服务器上的socket 0.0 ServerSocket ser…

Apache JMeter 5.5: 新手指南

如何获取并运行 JMeter 首先&#xff0c;要使用 JMeter&#xff0c;你需要从官网获取软件包。前往 Apache JMeter 的官方页面&#xff0c;然后下载所 需的压缩文件。 配置和启动 JMeter 获取了 JMeter 后&#xff0c;由于它是无需安装即可使用的工具&#xff0c;直接解压下载…

使用pygame.draw绘制基本图形

import pygame# 初始化pygame pygame.init()# 创建显示窗口 screen pygame.display.set_mode((640, 480)) pygame.display.set_caption("绘制基本图形")# 定义颜色 BLACK (0, 0, 0) WHITE (255, 255, 255) RED (255, 0, 0) GREEN (0, 255, 0) BLUE (0, 0, 255)…

AMD SEV基本原理

AMD SEV基本原理 背景SMEArchC-bitSME-MKInterfaceSMESME-MK SEVArchInterface SEV APIKey ManagementGuest PolicyMailbox Register ProtocolPlatform Management APIGuest Management API 背景 TODO SME SME&#xff08;Secure Memory Encryption&#xff09;是AMD内存加密…