引言

  • 最近专业课在学信息隐藏与数字水印,上到了变换域隐藏技术,提到了其中的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. 搬东西 dp

    搬东西 现有n个扁担以及一辆货车,扁担一次挑两个货物,货车可以装K个货物,货车只能运送一次货物. 现在qwb要把总共2n+k个货物搬到某个地方.现在qwb想选K个货物让货车先运走,然后剩下的2n个货物 ...

  2. HashMap面试知识点总结

    主要参考 JavaGuide 和 敖丙 的文章, 其中也有参考其他的文章, 但忘记保存链接了, 文中图片也是引用别的大佬的, 请见谅. 新手上路, 若有问题, 欢迎指正. 背景 HashMap 的相关 ...

  3. java基础篇 之 接口

    组合接口时的名字冲突: 看下面这段代码: interface I1 { int f(); } interface I2 { void f(); } interface I3 { int f(int a ...

  4. 第三家面试过程,及导出elcel的进一步小结。(8月11号 周五)

    今天收到第三家公司的面试通知,面试地址也在民治附近,面试时间是上午十点.今早又失眠了,感觉到这边这么几天,总是天天失眠,晚上睡不好白天瞌睡睡不着,估计还需要些许时间的适应,早上七点多我整理好面试需要准 ...

  5. Mysql常用sql语句(16)- inner join 内连接

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 利用条件表达式来消除交叉连接(cross joi ...

  6. python --设置Python3 设置为机器默认

    echo alias python=python3 >> ~/.bashrc source ~/.bashrc 反之,如果仍然需要Python2.7 ,则改成2.7就行. update : ...

  7. 《C程序设计语言》 练习3-3

    问题描述 编写expand(s1,s2),将字符串s1中类似于a-z类的速记符号在字符串s2中扩展为等价的完整列表abc.....xyz.该函数可以处理大小写字母和数字,并可以处理a-b-c,a-z0 ...

  8. MySQL 入门(5):复制

    摘要 在这篇文章中,我将从MySQL为什么需要主从复制开始讲起,然后会提到MySQL复制的前提,bin log. 在这里会说明三种格式的bin log分别会有什么优缺点. 随后会讲到主从延迟方面的问题 ...

  9. R的安装以及包安装

        今天看论文,需要用到R语言的库,于是又折腾了半天..     其实并没有什么太大的问题,只是在第三方包的下载方面还有python中使用R方面遇到了问题: 第三方包的导入      其实在网上有 ...

  10. Angular核心概念之五---过滤器

    Filter:过滤器,用于在view中呈现数据时显示为另一种格式:过滤器的本质是一个函数,接收原始数据转换为新的格式进行输出: function(oldVal){ ... return newVal ...