图像处理中常用的正交变换除了傅里叶变换外,还有其他一些有用的正交变换,其中离散余弦就是一种。离散余弦变换表示为DCT( Discrete Cosine Transformation),常用于图像处理和图像识别等。

一维离散余弦变换

正变换

                                   (1)

                            (2)

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

反变换

  (3)

显然,式(1)式(2)和式(3)构成了一维离散余弦变换对。

二维离散余弦变换

正变换

  (4)

式(4)是正变换公式。其中f(x,y)是空间域二维向量之元素, x,y=0,1,2,......N-1;F(u,v)是变换系数阵列之元素。式中表示的阵列为N×N

反变换

 (5)

式中的符号意义同正变换式一样。式(4)和式(5)是离散余弦变换的解析式定义。

矩阵表示法

更为简洁的定义方法是采用矩阵式定义。根据以上公式定义可知,离散余弦变换的系数矩阵可以写成如下:

如果令N=4,那么由一维解析式定义可得如下展开式。

写成矩阵式

若定义F(u)为变换矩阵,A为变换系数矩阵,f(x)为时域数据矩阵,则一维离散余弦变换的矩阵定义式可写成如下形式

[F(u)]=[A][f(x)]                       (6)

同理,可得到反变换展开式

写成矩阵式即

[f(x)]=[A]T[F(u)]                      (7)

二维离散余弦变换也可以写成矩阵式:

[F(u,v)]=[A][f(x,y)][A]T            (8)

[f(x,y)]=[A]T[F(u,v)][A]                     

式中[f(x,y)]是空间数据阵列,A是变换系数阵列,[F(u,v)]是变换矩阵,[A]T是[A]的转置。

对二维图像进行离散余弦变换

由以上对二维离散余弦变换的定义及公式(7)可知,求二维图像的离散余弦变换要进行以下步骤:

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

2.求离散余弦变换的系数矩阵[A];

3.求系数矩阵对应的转置矩阵[A]T;

4.根据公式(7)[F(u,v)]=[A][f(x,y)][A]T 计算离散余弦变换;

源代码:

[java]  view plain copy
  1. package cn.edu.jxau.image;
  2. import java.awt.image.BufferedImage;
  3. /**
  4. * 图像的变换
  5. * @author luoweifu
  6. *
  7. */
  8. public class Transformation {
  9. /**
  10. * 要进行DCT变换的图片的宽或高
  11. */
  12. public static final int N = 256;
  13. /**
  14. * 傅里叶变换
  15. * @return
  16. */
  17. public int[] FFT() {
  18. return null;
  19. }
  20. /**
  21. * 离散余弦变换
  22. * @param pix 原图像的数据矩阵
  23. * @param n 原图像(n*n)的高或宽
  24. * @return 变换后的矩阵数组
  25. */
  26. public int[] DCT(int[] pix, int n) {
  27. double[][] iMatrix = new double[n][n];
  28. for(int i=0; i<n; i++) {
  29. for(int j=0; j<n; j++) {
  30. iMatrix[i][j] = (double)(pix[i*n + j]);
  31. }
  32. }
  33. double[][] quotient = coefficient(n);   //求系数矩阵
  34. double[][] quotientT = transposingMatrix(quotient, n);  //转置系数矩阵
  35. double[][] temp = new double[n][n];
  36. temp = matrixMultiply(quotient, iMatrix, n);
  37. iMatrix =  matrixMultiply(temp, quotientT, n);
  38. int newpix[] = new int[n*n];
  39. for(int i=0; i<n; i++) {
  40. for(int j=0; j<n; j++) {
  41. newpix[i*n + j] = (int)iMatrix[i][j];
  42. }
  43. }
  44. return newpix;
  45. }
  46. /**
  47. * 矩阵转置
  48. * @param matrix 原矩阵
  49. * @param n 矩阵(n*n)的高或宽
  50. * @return 转置后的矩阵
  51. */
  52. private double[][]  transposingMatrix(double[][] matrix, int n) {
  53. double nMatrix[][] = new double[n][n];
  54. for(int i=0; i<n; i++) {
  55. for(int j=0; j<n; j++) {
  56. nMatrix[i][j] = matrix[j][i];
  57. }
  58. }
  59. return nMatrix;
  60. }
  61. /**
  62. * 求离散余弦变换的系数矩阵
  63. * @param n n*n矩阵的大小
  64. * @return 系数矩阵
  65. */
  66. private double[][] coefficient(int n) {
  67. double[][] coeff = new double[n][n];
  68. double sqrt = 1.0/Math.sqrt(n);
  69. for(int i=0; i<n; i++) {
  70. coeff[0][i] = sqrt;
  71. }
  72. for(int i=1; i<n; i++) {
  73. for(int j=0; j<n; j++) {
  74. coeff[i][j] = Math.sqrt(2.0/n) * Math.cos(i*Math.PI*(j+0.5)/(double)n);
  75. }
  76. }
  77. return coeff;
  78. }
  79. /**
  80. * 矩阵相乘
  81. * @param A 矩阵A
  82. * @param B 矩阵B
  83. * @param n 矩阵的大小n*n
  84. * @return 结果矩阵
  85. */
  86. private double[][] matrixMultiply(double[][] A, double[][] B, int n) {
  87. double nMatrix[][] = new double[n][n];
  88. double t = 0.0;
  89. for(int i=0; i<n; i++) {
  90. for(int j=0; j<n; j++) {
  91. t = 0;
  92. for(int k=0; k<n; k++) {
  93. t += A[i][k]*B[k][j];
  94. }
  95. nMatrix[i][j] = t;          }
  96. }
  97. return nMatrix;
  98. }
  99. }

MATLAB DCT变换原理和源码相关推荐

  1. java.lang.ThreadLocal实现原理和源码分析

    java.lang.ThreadLocal实现原理和源码分析 1.ThreadLocal的原理:为每一个线程维护变量的副本.某个线程修改的只是自己的副本. 2.ThreadLocal是如何做到把变量变 ...

  2. Dubbo原理和源码解析之服务引用

    github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...

  3. currenthashmap扩容原理_ConcurrentHashMap实现原理和源码解读

    前言 HashMap是java编程中最常用的数据结构之一,由于HashMap非线程安全,因此不适用于并发访问的场景.JDK1.5之前,通常使用HashTable作为HashMap的线程安全版本,Has ...

  4. 第41课:Checkpoint彻底解密:Checkpoint的运行原理和源码实现彻底详解

    第41课:Checkpoint彻底解密:Checkpoint的运行原理和源码实现彻底详解 一:Checkpoint到底是什么? 1,  Spark在生产环境下经常会面临Tranformations的R ...

  5. 【项目一、xxx病虫害检测项目】1、SSD原理和源码分析

    目录 前言 一.SSD backbone 1.1.总体结构 1.2.修改vgg 1.3.额外添加层 1.4.需要注意的点 二.SSD head 2.1.检测头predictor 2.2.生成defau ...

  6. Nacos高级特性Raft算法以及原理和源码分析

    Nacos高级特性Raft算法以及原理和源码分析 对比springcloud-config配置中心 springcloud-config工作原理 Nacos的工作原理图 springcloud-con ...

  7. HashMap实现原理和源码详细分析

    HashMap实现原理和源码详细分析 ps:本博客基于Jdk1.8 学习要点: 1.知道HashMap的数据结构 2.了解HashMap中的散列算法 3.知道HashMap中put.remove.ge ...

  8. dct基 matlab,DCT 变换的基函数与基图像

    DCT 变换的基函数与基图像 1. 图像变换的基函数 在图像的二维变换中, 如果图像本身是正方形的 (图像的长与宽相等), 并且图像的变换核满足课可分离性和对称性, 则此时图像的二维变换可以用两个一维 ...

  9. MapReduce多用户任务调度器——容量调度器(Capacity Scheduler)原理和源码研究

    前言:为了研究需要,将Capacity Scheduler和Fair Scheduler的原理和代码进行学习,用两篇文章作为记录.如有理解错误之处,欢迎批评指正. 容量调度器(Capacity Sch ...

最新文章

  1. 设计磁标读写模块-STC8G1K08-HALL
  2. pluto实现分析(7)
  3. [100]第三波常用命令
  4. 第12周学习进度总结
  5. bpython bs4用哪个解释器好_针对python爬虫bs4(BeautifulSoup)库的基础问题
  6. LINQ字符拼接的AND和OR操作
  7. ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)
  8. jsoncpp-src-0.5.0.tar.gz 源码错误!!!!
  9. dcc garch matlab,如何用Eviews或者MATLAB实现DCC-garch模型?
  10. android web通讯录,Android手机开发之通讯录
  11. 常用sql操作语句实战演示
  12. indy idhttpserver有关下载的两个问题
  13. 前端系统化学习【JS篇】:(四)Javascript中的数据类型
  14. Mac电脑下使用Socket报错socket抛出Can’t assign requested address解决
  15. 福昕高级PDF编辑器Mac版PDF编辑器注册机激活下载版
  16. 阿里巴巴与星巴克合作 AR场景识别首次大规模商用
  17. tableau可视化图表及仪表板设计
  18. 计算机重启没有用户名,电脑重启之后图标没了怎么办
  19. 黑莓手机刷Linux系统
  20. 面试题67. 把字符串转换成整数

热门文章

  1. 浙江数字孪生数字化工厂三维激光扫描建模_三维可视化管理平台_吉优赛维_三维建模解决方案_3D模型
  2. 俄勒冈大学计算机科学专业,俄勒冈大学计算机与信息科学详解 热门专业不容错过...
  3. 嵌入式分享合集128
  4. PLC、运动控制卡、运动控制器,傻傻分不清
  5. 你写一个web网页小游戏
  6. ppt保存类型中无html,ppt保存类型里没有pdf怎么办?这样做即可!
  7. css关于:hover的使用
  8. vmware开启虚拟机时虚拟机黑屏的解决办法
  9. 算法笔记——常见DP问题汇总
  10. 小程序开发:完整发布上线流程