首页 > 编程知识 正文

离散余弦变换原理,离散余弦变换作用

时间:2023-05-03 10:46:57 阅读:228883 作者:2941

图像处理中常用的正交变换除了傅里叶变换外,还有其他一些有用的正交变换,其中离散余弦就是一种。离散余弦变换表示为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 计算离散余弦变换;

源代码: package cn.edu.jxau.image;import java.awt.image.BufferedImage;/** * 图像的变换 * @author luoweifu * */public class Transformation {/** * 要进行DCT变换的图片的宽或高 */public static final int N = 256;/** * 傅里叶变换 * @return */public int[] FFT() {return null;}/** * 离散余弦变换 * @param pix 原图像的数据矩阵 * @param n 原图像(n*n)的高或宽 * @return 变换后的矩阵数组 */public int[] DCT(int[] pix, int n) {double[][] iMatrix = new double[n][n]; for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {iMatrix[i][j] = (double)(pix[i*n + j]);}}double[][] quotient = coefficient(n);//求系数矩阵double[][] quotientT = transposingMatrix(quotient, n);//转置系数矩阵double[][] temp = new double[n][n];temp = matrixMultiply(quotient, iMatrix, n);iMatrix = matrixMultiply(temp, quotientT, n);int newpix[] = new int[n*n];for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {newpix[i*n + j] = (int)iMatrix[i][j];}}return newpix;}/** * 矩阵转置 * @param matrix 原矩阵 * @param n 矩阵(n*n)的高或宽 * @return 转置后的矩阵 */private double[][] transposingMatrix(double[][] matrix, int n) {double nMatrix[][] = new double[n][n];for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {nMatrix[i][j] = matrix[j][i];}}return nMatrix;}/** * 求离散余弦变换的系数矩阵 * @param n n*n矩阵的大小 * @return 系数矩阵 */private double[][] coefficient(int n) {double[][] coeff = new double[n][n];double sqrt = 1.0/Math.sqrt(n);for(int i=0; i<n; i++) {coeff[0][i] = sqrt;}for(int i=1; i<n; i++) {for(int j=0; j<n; j++) {coeff[i][j] = Math.sqrt(2.0/n) * Math.cos(i*Math.PI*(j+0.5)/(double)n);}}return coeff;}/** * 矩阵相乘 * @param A 矩阵A * @param B 矩阵B * @param n 矩阵的大小n*n * @return 结果矩阵 */private double[][] matrixMultiply(double[][] A, double[][] B, int n) {double nMatrix[][] = new double[n][n];double t = 0.0;for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {t = 0;for(int k=0; k<n; k++) {t += A[i][k]*B[k][j];}nMatrix[i][j] = t;}}return nMatrix;}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。