文档章节

离散余弦变换(含源码)

自由的角马
 自由的角马
发布于 2015/01/10 13:56
字数 1009
阅读 17
收藏 0

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


本文转载自:http://blog.csdn.net/luoweifu/article/details/8214959

自由的角马
粉丝 1
博文 269
码字总数 0
作品 0
文山
私信 提问
【工具使用系列】关于 MATLAB 图像变换,你需要知道的事

如何进行图像变换(频域处理) 正交变换 傅里叶变换 二维连续傅里叶变换 二维离散傅里叶变换(DFT) 快速傅里叶变换(FFT) 离散余弦变换 一维离散余弦变换 二维离散余弦变换 离散正弦变换 ...

AllenMoore
2018/01/26
47
0
离散余弦变换(DCT)的来龙去脉

1. 图像的二维离散变换   与一维的有限长离散非周期信号存在傅里叶变换(DFT)一样,图像作为一个二维离散信号同样存在着二维离散变换(注意这里是介绍一个通用的概念,二维离散变换,包括...

dugudaibo
2017/11/01
0
0
【DCT】OPENCV python 离散余弦变换问题

因为项目需要,目前在研究《基于离散余弦变换和区域生长的白粉虱图像分割算法》,使用的OPENCV python。 论文地址:%e5%9f%ba%e4%ba%8e%e7%a6%bb%e6%95%a3%e4%bd%99%e5%bc%a6%e5%8f%98%e6%8d...

majisong
2016/06/02
2.2K
0
Matlab图像处理入门教程(菜鸟级)

1,图像的读入和显示: (1)图像读入:A=imread('文件名',文件格式) [X,map]=imread('文件名') %X代表索引图像矩阵,map为颜色映射表 (2)图像显示:image(A); 2. 图像写回 A=imwrite('文件......

枫言风语
2012/09/22
21.3K
0
C/C++开发求职

个人简介: 本人98年公费中等师范毕业后分配去大山中教书育人,为期三年。学历有限。 以后所学,庞杂多端。06年左右开始接触数值算法编程,学习了各种数学软件(如matlab,mathematica,maple)...

numcpp
2012/03/06
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
24分钟前
3
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部