图像处理中常用的正交变换除了傅里叶变换外,还有其他一些有用的正交变换,其中离散余弦就是一种。离散余弦变换表示为DCT(DiscreteCosineTransformation),常用于图像处理和图像识别等。
一维离散余弦变换
正变换
(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;
}
}
分享到:
相关推荐
离散余弦变换(Discrete Cosine Transform, DCT)是一种在数字信号处理领域广泛应用的数学变换技术,特别是在图像和音频压缩中,如JPEG和MP3等标准中扮演着核心角色。DCT能够将信号从时域转换到频域,从而帮助我们...
本文将深入探讨四种常见的正交变换:傅里叶变换、离散余弦变换(DCT)、沃尔什变换,以及它们在图像处理中的应用。 首先,傅里叶变换是数学中的一个基本工具,它将信号或图像从时域或空域转换到频域。在图像处理中...
这个项目提供的源码是实现离散余弦变换的具体实例,且经过了测试,这意味着它们可以被直接用于实际应用或者作为学习参考。 离散余弦变换的公式为: \[ X[k] = \sum_{n=0}^{N-1} x[n] \cos\left(\frac{\pi}{N} kn\...
【图像加密】基于DCT(离散余弦变换)与SVD(奇异值分解)域自适应嵌入水印matlab源码.md
本文将深入探讨基于小波变换(Discrete Wavelet Transform, DWT)和离散余弦变换(Discrete Cosine Transform, DCT)的音频数字水印嵌入与提取的方法,以及如何在MATLAB环境中实现这一过程。 首先,我们需要理解...
二维离散余弦变换(2D Discrete Cosine Transform,简称2D-DCT)是一种重要的数字信号处理技术,广泛应用于图像和视频压缩领域,如JPEG和MPEG标准中。在这个项目中,我们关注的是一段使用C++语言编写的、在Visual ...
离散余弦变换(DCT,Discrete Cosine Transform)是一种在数字信号处理领域广泛应用的数学变换技术,特别是在图像和音频编码中。傅里叶变换是它的基础,但DCT相比傅里叶变换在实际应用中更具有优势,因为它对实数...
《深入理解基于离散余弦变换DCT的音频数字水印技术》 在现代数字信息时代,保护知识产权和确保数据安全变得尤为重要。数字水印技术就是一种有效的解决方案,它允许在数字媒体中嵌入不可见的标识,以证明所有权、...
离散余弦变换DCT变换灰色图像信息隐藏(数字水印嵌入攻击提取)【含Matlab源码 3879期】.md
【图像去噪】基于matlab离散余弦变换DCT彩色图像去噪(含PSNR)【含Matlab源码 4262期】
【图像隐写】基于matlab离散余弦变换水印图像嵌入攻击提取【含Matlab源码 4842期】.md
离散余弦变换DCT结合奇异值分解SVD灰色图像信息隐写(含NC PSNR)【含Matlab源码 3892期】.md
【图像融合】基于matlab离散余弦变换DCT变焦距灰色图像融合【含Matlab源码 4263期】.md
离散余弦变换DCT和PN序列数字水印嵌入和提取(含PSNR)【含Matlab源码 3939期】 (1).md
离散余弦变换结合奇异值分解DCT-SVD灰色图像信息隐写(含SNR SSIM)【含Matlab源码 3880期】.md
离散余弦变换结合奇异值分解DCT-SVD灰色图像信息隐写(含SNR SSIM)【含Matlab源码 3881期】.md
【图像隐写】基于matlab离散余弦变换DCT分块灰色图像信息隐藏(含直方图)【含Matlab源码 3937期】.md
离散余弦变换DCT结合与奇异值分解SVD自适应水印嵌入攻击提取(含相关系数NC)【含Matlab源码 4366期】.md
1、资源内容:基于Matlab使用离散余弦变换进行图片压缩(源码+图片).rar 2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 3、解压说明:本资源需要...
多媒体技术原理应用于MATLAB的DCT变化代码示例