引言

  • 最近专业课在学信息隐藏与数字水印,上到了变换域隐藏技术,提到了其中的DCT变换,遂布置了一个巨烦人的作业,让手动给两个\(8\times8\)的矩阵做二维DCT变换,在苦逼的算了一小时后,我决定放弃,转而决定写脚本来解决,\((๑•̀ㅂ•́)و✧\),正好看网上好像只有matlab的脚本,好像没人用Python来写这个,遂打算搞一个(你就是纯粹为了偷懒不做作业\((* ̄rǒ ̄))\)

二维DCT变换原理

  • 还是要普及一下的嘛,毕竟让我头疼了一下午的东西,当然也要好好给你们分享一下啦ԅ(¯﹃¯ԅ)

  • DCT(Discrete Cosine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩。经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是能量都集中在离散余弦变换后的直流和低频部分

  • 1、一维DCT变换

    要弄懂二维离散余弦变换,首先我们需要先了解它在一维下的情况,具体表达式如下:

    \(F(0)=\dfrac{1}{\sqrt{N}}\sum_{x=0}^{N-1} f(x)\) \(...........1\)

    \(F(u)=\sqrt{\dfrac{2}{N}}\sum_{x=0}^{N-1} f(x) \cos{\dfrac{(2x+1)u\pi}{2N}}\) \(...........2\)

    式中\(F(u)\)是第\(u\)个余弦变换值,\(u\)是广义频率变量,\(u=1,2,….,N-1;f(x)\)是时域\(N\)点序列。\(x= 1,2,….,N-1;\)

  • 2、二维DCT变换

    二维离散余弦变换可由下列表达式表示:

    \(F(0,0)=\dfrac{1}{N}\sum_{x=0}^{N-1}\sum_{y=0}^{N-1} f(x,y)\) \(...........3\)

    \(F(0,v)=\dfrac{\sqrt{2}}{N}\sum_{x=0}^{N-1}\sum_{y=0}^{N-1} f(x,y) \cdot \cos{\dfrac{(2y+1)v\pi}{2N}}\) \(...........4\)

    \(F(u,0)=\dfrac{\sqrt{2}}{N}\sum_{x=0}^{N-1}\sum_{y=0}^{N-1} f(x,y) \cdot \cos{\dfrac{(2x+1)u\pi}{2N}}\) \(...........5\)

    \(F(u,v)=\dfrac{2}{N}\sum_{x=0}^{N-1}\sum_{y=0}^{N-1} f(x,y) \cdot \cos{\dfrac{(2x+1)u\pi}{2N}}\cdot \cos{\dfrac{(2y+1)v\pi}{2N}}\) \(...........6\)

    \(6\)是二维离散余弦变换的正变换公式,其中\(f(x,y)\)是空间域一个\(N*N\)的二维向量元素,即一个\(N*N\)的矩阵,\(x,y = 0,1,2,…,N-1;F(U,V)\)是经计算后得到的变换域矩阵,\(u,v = 0,1,2,….,N-1\).求和可分性是二维离散余弦变换的一个重要特征,因此我们可以用下式表示\(6\):

    \(F(u,v)=\dfrac{2}{N}\sum_{x=0}^{N-1} \cdot \cos{\dfrac{(2x+1)u\pi}{2N}}{\sum_{y=0}^{N-1} f(x,y) }\cdot \cos{\dfrac{(2y+1)v\pi}{2N}} ..........7\)

    由一维和二维的离散余弦变换公式性质可以推导得到二维离散余弦变换也可以写成矩阵相乘形式:

    \(F=A[f(x,y)A^{T}]..............8\)

  • \(A\)为一维离散余弦变换的变换系数矩阵,\(A^{T}\)是\(A\)的转置矩阵

  • 对图像进行二维离散余弦变换\((2D-DCT)\)的步骤

    1.获得图像的二维数据矩阵\(f(x,y)\);

    2.求离散余弦变换的系数矩阵\(A\);

    3.求系数矩阵对应的转置矩阵\(A^{T}\);

    4.根据公式\(F=A\times[f(x,y)]\times A^{T}\)计算离散余弦变换;

  • 注:公式的大致推导,由于\(A\)都是正交阵,所以\(A^{-1}=A^{T}\),故\(Y=A\times[f(x,y)]\times A^{T} ,f(x,y)=A^{T}\times Y \times A=A^{T}\times A\times[f(x,y)]\times A^{T}\times A\)

参考链接:https://www.cnblogs.com/latencytime/p/10228938.html

参考链接:https://blog.csdn.net/allen_sdz/article/details/83279210

Python编程实现

  • 大家注意上述的第\(8\)个式子,将变换的两个\(\sum_{i=0}^n\)转变成了变换矩阵和转置矩阵以及代转换矩阵之间乘积的问题(注意这里的乘是指的叉乘)
  • 遂可以发现\(DCT\)后的矩阵应等于\(A\times X \times A^{T}\)
  • 此外,对于\(x,y\)同时为0的情况,其参数要单独考虑
  • 大致的思路就是,由于直接计算变换比较繁琐,所以我们就先对于一个单位阵进行操作运算,将其变成一个DCT的变换矩阵,而后在与代算矩阵和转置矩阵叉乘即可。
  • 至此我们就可以着手写脚本了,这里主要是用了两个库numpymath
# -*- 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

二维DCT变换 | Python实现的更多相关文章

  1. 二维DCT变换

    DCT(Discrete Consine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩.经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是 ...

  2. DCT变换、DCT反变换、分块DCT变换

    一.引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能.DCT变换本身是无损 ...

  3. python创建与遍历List二维列表

    python创建与遍历List二维列表 觉得有用的话,欢迎一起讨论相互学习~Follow Me python 创建List二维列表 lists = [[] for i in range(3)] # 创 ...

  4. Python 二维码解码

    二维码解析 Python中关于二维码解析的现成模块有很多,比较著名的就是Zbar以及ZXing.然而很不幸的是,官方的版本都是支持到python2.x,下面是在python2.x的例子: import ...

  5. 使用Python第三方库生成二维码

    本文主要介绍两个可用于生成二维码的Python第三方库:MyQR和qrcode. MyQR的使用: 安装: pip install MyQR 导入: from MyQR import myqr imp ...

  6. Python用MyQR生成自定义个性二维码

    MyQR是一个能够生成自定义二维码的python第三方库,根据需要能够生成普通二维码.带背景图片的艺术二维码.动态二维码. 1.MyQR安装 安装非常简单,直接用pip install MyQR,需要 ...

  7. 第三百二十节,Django框架,生成二维码

    第三百二十节,Django框架,生成二维码 用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qr ...

  8. Python 创建本地服务器环境生成二维码

    一. 需求 公司要做一个H5手机端适配页面,因技术问题所以H5是外包的,每次前端给我们源码,我们把源码传到服务器让其他人访问看是否存在bug,这个不是很麻烦吗?有人说,可以让前端在他们的服务器上先托管 ...

  9. Python生成二维码脚本

    简单的记录下二维码生成和解析的Python代码 依赖下面三个包: PIL(图像处理包,安装:pip install PIL) qrcode(二维码生成包,安装:pip install qrcode) ...

随机推荐

  1. CF1336C Kaavi and Magic Spell

    CF1336C Kaavi and Magic Spell 区间dp 题意 给一个长度为 \(n\) 的字符串 \(S\) 和一个长度为 \(m\) 的字符串\(T\) ,\(1\le m\le n\ ...

  2. POJ3255(次最短路)

    描述 求1到n的次最短路 开个\(dis[maxn][2]\)的储存距离的二维数组,0储存最短路,1储存次短路 初始化全为正无穷,\(dis[1][0]=0;\) 然后遍历更新时,先尝试更新最短路和次 ...

  3. Spring Cloud Stream学习(五)入门

    前言: ​ 在了解完RabbitMQ后,再来学习SpringCloudStream就轻松很多了,SpringCloudStream现在主要支持两种消息中间件,一个是RabbitMQ,还有一个是KafK ...

  4. MySQL连接不上

    access denied for user root @localhost 解决办法: create user 'root'@'localhost' identified by '你的密码'; gr ...

  5. hadoop中如何动态更新集群队列和容量

    1.集群默认是FIFO容量调度器,有的时候不同的业务部门都需要使用hadoop集群,那么这时候就需要来设置容量调度器了,如何平衡各个部门的容量.合理利用资源? 首先配置调度器需要在修改两个配置文件,分 ...

  6. 美团分布式ID生成框架Leaf源码分析及优化改进

    本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...

  7. Qt子窗口设置背景色只能应用到其中的部件的问题

    问题描述:设置父窗口后子窗口会嵌在父窗口中,背景变透明,此时用qss设置子窗口的背景色发现只应用到的子窗口的控件中,除控件外的地方并没有应用到背景色. 解决方法:不使用qss设置背景色,重写paint ...

  8. CF#135 D. Choosing Capital for Treeland 树形DP

    D. Choosing Capital for Treeland 题意 给出一颗有方向的n个节点的树,现在要选择一个点作为首都. 问最少需要翻转多少条边,使得首都可以到所有其他的城市去,以及相应的首都 ...

  9. Docker & k8s 系列一:快速上手docker

    Docker & k8s 系列一:快速上手docker 本篇文章将会讲解:docker是什么?docker的安装,创建一个docker镜像,运行我们创建的docker镜像,发布自己的docke ...

  10. 接口(API)测试理念

    什么是接口测试 接口测试就是针对软件对外提供服务的接口的输入输出进行测试,以及接口间相互逻辑的测试,验证接口功能与接口描述文档的一致性: 测试的重点是检查数据交互.传递.和控制管理过程以及系统间的相互 ...