二维DCT变换 | Python实现
引言
- 最近专业课在学信息隐藏与数字水印,上到了变换域隐藏技术,提到了其中的
DCT
变换,遂布置了一个巨烦人的作业,让手动给两个的矩阵做二维DCT
变换,在苦逼的算了一小时后,我决定放弃,转而决定写脚本来解决,,正好看网上好像只有matlab
的脚本,好像没人用Python
来写这个,遂打算搞一个(你就是纯粹为了偷懒不做作业
二维DCT变换原理
-
还是要普及一下的嘛,毕竟让我头疼了一下午的东西,当然也要好好给你们分享一下啦ԅ(¯﹃¯ԅ)
-
DCT(Discrete Cosine Transform)
,又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩。经过DCT
变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是能量都集中在离散余弦变换后的直流和低频部分 -
1、一维
DCT
变换
要弄懂二维离散余弦变换,首先我们需要先了解它在一维下的情况,具体表达式如下:
式中是第个余弦变换值,是广义频率变量,是时域点序列。 -
2、二维
DCT
变换
二维离散余弦变换可由下列表达式表示:
是二维离散余弦变换的正变换公式,其中是空间域一个的二维向量元素,即一个的矩阵,是经计算后得到的变换域矩阵,.求和可分性是二维离散余弦变换的一个重要特征,因此我们可以用下式表示:
由一维和二维的离散余弦变换公式性质可以推导得到二维离散余弦变换也可以写成矩阵相乘形式:
-
为一维离散余弦变换的变换系数矩阵,是的转置矩阵
-
对图像进行二维离散余弦变换的步骤
1.获得图像的二维数据矩阵;
2.求离散余弦变换的系数矩阵;
3.求系数矩阵对应的转置矩阵;
4.根据公式计算离散余弦变换; -
注:公式的大致推导,由于都是正交阵,所以,故
参考链接:https://www.cnblogs.com/latencytime/p/10228938.html
参考链接:https://blog.csdn.net/allen_sdz/article/details/83279210
Python编程实现
- 大家注意上述的第个式子,将变换的两个转变成了变换矩阵和转置矩阵以及代转换矩阵之间乘积的问题(注意这里的乘是指的叉乘)
- 遂可以发现后的矩阵应等于
- 此外,对于同时为0的情况,其参数要单独考虑
- 大致的思路就是,由于直接计算变换比较繁琐,所以我们就先对于一个单位阵进行操作运算,将其变成一个
DCT
的变换矩阵,而后在与代算矩阵和转置矩阵叉乘即可。 - 至此我们就可以着手写脚本了,这里主要是用了两个库
numpy
和math
# -*- coding:utf-8 -*-
# Author:Konmu
# DCT二维变换
from numpy import array as matrix, arange,zeros,transpose,matmul,ones
from math import sqrt,cos,pi
'''
作业代转化矩阵1
a=matrix([[0,255,0,255,0,255,0,255],
[255,0,255,0,255,0,255,0],
[0,255,0,255,0,255,0,255],
[255,0,255,0,255,0,255,0],
[0,255,0,255,0,255,0,255],
[255,0,255,0,255,0,255,0],
[0,255,0,255,0,255,0,255],
[255,0,255,0,255,0,255,0]])
'''
a=ones((8,8))#生成单位阵
for i in range(8):
a[i]=matrix([128]*8)
# 生成全是128的矩阵(作业代转化矩阵2)
'''
测试数据
a=matrix([[61,19,50,20],
[82,26,61,45],
[89,90,82,43],
[93,59,53,97]])
'''
A=zeros((8,8))#生成0矩阵
shape=a.shape[1]#获取维数
for i in range(8):
for j in range(8):
if(i == 0):
x=sqrt(1/shape)
else:
x=sqrt(2/shape)
A[i][j]=x*cos(pi*(j+0.5)*i/shape)#与维数相关
A_T=A.transpose()#矩阵转置
Y1=matmul(A,a)#矩阵叉乘
Y=matmul(Y1,A_T)
print(Y)
'''
想要近似值可以尝试这样输出
for i in range(shape):
for j in range(shape):
print('{:^8.4f}'.format(Y[i][j]),end='\n')
print()
'''
- 结果:
0和255的对称矩阵
128的单元素矩阵
测试矩阵
结语
- ok,完美撒花,结束,交作业喽ヾ(≧O≦)〃嗷~C
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!