文档章节

DCT, IDCT变换--C语言实现

t
 tigerBin
发布于 2017/06/14 12:35
字数 498
阅读 54
收藏 0
点赞 0
评论 0

变换矩阵,DCT = IDCT'

static const double MtxDCT[8][8] = 
{
    {0.3536,    0.3536,    0.3536,    0.3536,    0.3536,    0.3536,    0.3536,    0.3536},
    {0.4904,    0.4157,    0.2778,    0.0975,   -0.0975,   -0.2778,   -0.4157,   -0.4904},
    {0.4619,    0.1913,   -0.1913,   -0.4619,   -0.4619,   -0.1913,    0.1913,    0.4619},
    {0.4157,   -0.0975,   -0.4904,   -0.2778,    0.2778,    0.4904,    0.0975,   -0.4157},
    {0.3536,   -0.3536,   -0.3536,    0.3536,    0.3536,   -0.3536,   -0.3536,    0.3536},
    {0.2778,   -0.4904,    0.0975,    0.4157,   -0.4157,   -0.0975,    0.4904,   -0.2778},
    {0.1913,   -0.4619,    0.4619,   -0.1913,   -0.1913,    0.4619,   -0.4619,    0.1913},
    {0.0975,   -0.2778,    0.4157,   -0.4904,    0.4904,   -0.4157,    0.2778,   -0.0975}
};


static const double MtxIDCT[8][8] = 
{
    {0.3536,    0.4904,    0.4619,    0.4157,    0.3536,    0.2778,    0.1913,    0.0975},
    {0.3536,    0.4157,    0.1913,   -0.0975,   -0.3536,   -0.4904,   -0.4619,   -0.2778},
    {0.3536,    0.2778,   -0.1913,   -0.4904,   -0.3536,    0.0975,    0.4619,    0.4157},
    {0.3536,    0.0975,   -0.4619,   -0.2778,    0.3536,    0.4157,   -0.1913,   -0.4904},
    {0.3536,   -0.0975,   -0.4619,    0.2778,    0.3536,   -0.4157,   -0.1913,    0.4904},
    {0.3536,   -0.2778,   -0.1913,    0.4904,   -0.3536,   -0.0975,    0.4619,   -0.4157},
    {0.3536,   -0.4157,    0.1913,    0.0975,   -0.3536,    0.4904,   -0.4619,    0.2778},
    {0.3536,   -0.4904,    0.4619,   -0.4157,    0.3536,   -0.2778,    0.1913,   -0.0975}
};

变换方程: F(u,v) = G * f * G'

逆变换方程: f(x,y) = G' * F * G

其中 G = DCT,  G' = IDCT ,  G 与 G' 互为转置

计算:

class MCU
{
public:
	int *operator[] (int row)
	{
		return data[row];
	}


	int data[8][8];
};


MCU MtxMulI2D(MCU &left, const double right[8][8])
{
	MCU dctBuf;
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			double tempVal = 0.0;
			for (int k = 0; k < 8; k++)
			{
				tempVal += left[i][k] * right[k][j];
			}
			dctBuf[i][j] = round(tempVal);
		}
	}
	return dctBuf;
}

MCU MtxMulD2I(const double left[8][8], MCU &right)
{
	MCU dctBuf;
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			double tempVal = 0.0;
			for (int k = 0; k < 8; k++)
			{
				tempVal += left[i][k] * right[k][j];
			}
			dctBuf[i][j] = round(tempVal);
		}
	}
	return dctBuf;
}

void DCT(MCU &block)
{
	block = MtxMulD2I(MtxDCT, block);
	block = MtxMulI2D(block, MtxIDCT);
}


void IDCT(MCU &block)
{
	block = MtxMulD2I(MtxIDCT, block);
	block = MtxMulI2D(block, MtxDCT);
}

测试:


int data2[8][8] = 
{
 {144,146,149,152,154,156,156,156},
 {148,150,152,154,156,156,156,156},
 {155,156,157,158,158,157,156,155},
 {160,161,161,162,161,159,157,155},
 {163,163,164,163,162,160,158,156},
 {163,163,164,164,162,160,158,157},
 {160,161,162,162,162,161,159,158},
 {158,159,161,161,162,161,159,158}
};

int data1[8][8] = 
{
 {139, 144, 149, 153, 155, 155, 155, 155}, 
 {144, 151, 153, 156, 159, 156, 156, 156}, 
 {150, 155, 160, 163, 158, 156, 156, 156}, 
 {159, 161, 162, 160, 160, 159, 159, 159}, 
 {159, 160, 161, 162, 162, 155, 155, 155}, 
 {161, 161, 161, 161, 160, 157, 157, 157}, 
 {162, 162, 161, 163, 162, 157, 157, 157}, 
 {162, 162, 161, 161, 163, 158, 158, 158} 
};


void Show(MCU &block)
{
	for (int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			printf("%4d ", block[i][j]);
		}
		printf("\n");
	}
}




int main(int argc, char *argv[])
{
	MCU block;
	for (int i=0;i<8;i++)
	{
		for(int j=0;j<8;j++)
		{
			block[i][j] = data1[i][j];
		}
	}

	DCT(block);   // 离散余弦变换
	IDCT(block);  // 逆离散余弦变换
	Show(block);
	return 0;
}

最后计算结果与原始数据相差不大

© 著作权归作者所有

共有 人打赏支持
t
粉丝 0
博文 61
码字总数 16992
作品 0
武汉
程序员
x264源代码简单分析:宏块编码(Encode)部分

===================================================== H.264源代码分析文章列表: 【编码 - x264】 x264源代码简单分析:概述 x264源代码简单分析:x264命令行工具(x264.exe) x264源代码...

leixiaohua1020 ⋅ 2015/05/24 ⋅ 0

从零开始手敲次世代游戏引擎(JPEG特别篇)-1

上一篇我们导入了Aili这个相对比较复杂的模型,并发现了一些问题,进行了修正。 但是目前我们所渲染的只是一个没有任何材质的模型(也常常被称为白模,或者灰模)。为了能够输出类似Blender...

陈文礼 ⋅ 2017/12/01 ⋅ 0

x264源代码简单分析:编码器主干部分-1

===================================================== H.264源代码分析文章列表: 【编码 - x264】 x264源代码简单分析:概述 x264源代码简单分析:x264命令行工具(x264.exe) x264源代码...

leixiaohua1020 ⋅ 2015/05/11 ⋅ 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 ⋅ 0

OpenCV - Operations on Arrays 对数组(矩阵)的一些操作

Function (函数名) Use (函数用处) add 矩阵加法,A+B的更高级形式,支持mask scaleAdd 矩阵加法,一个带有缩放因子dst(I) = scale * src1(I) + src2(I) addWeighted 矩阵加法,两个带有缩放...

苍海一粟 ⋅ 2012/11/20 ⋅ 2

从奔腾I的VCD播放到AI区块链播放器——程序优化的魔法

从上个世纪本腾I电脑播放VCD,通过巧妙的算法优化,可以在损失部分效果的情况下在低性能的电脑上播放VCD。时至今日,硬件性能大幅飙升,许多算法近乎“失传”了。但对于充满好奇心的程序员,...

LiveVideoStack ⋅ 04/23 ⋅ 0

Matlab图像处理入门教程(菜鸟级)

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

枫言风语 ⋅ 2012/09/22 ⋅ 0

x264源代码简单分析:x264_slice_write()

===================================================== H.264源代码分析文章列表: 【编码 - x264】 x264源代码简单分析:概述 x264源代码简单分析:x264命令行工具(x264.exe) x264源代码...

leixiaohua1020 ⋅ 2015/05/17 ⋅ 0

离散余弦变换(DCT)

DCT变换、DCT反变换、分块DCT变换 一、引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性...

li_wen01 ⋅ 2017/06/05 ⋅ 0

编码原理(七) --回顾

1 DCT变换 经过DCT变换,实现了频率的集中。 2量化 经过量化,我们对DCT变换后的系数进行以QP=28的量化,此时得到了一些左上角集中了非零值的系数矩阵。 3 ZigZag扫描 ZigZag扫描,将二维的系...

mmlf ⋅ 02/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

分布式数据库中间件DDM的实现原理

随着数据量不断增大,传统的架构模式难以解决业务量不断增长所带来的问题,特别是在业务成线性、甚至指数级上升的情况。此时我们不得不通过水平扩展,把数据库放到不同服务器上来解决问题,也...

中间件小哥 ⋅ 13分钟前 ⋅ 0

字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8

原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享。 1、引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。 这个问题比我想象的复杂,午饭...

JackJiang- ⋅ 19分钟前 ⋅ 0

Spring Cloud构建微服务架构:服务消费(基础)

使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的定义我们在上一篇介...

itcloud ⋅ 20分钟前 ⋅ 0

MaxCompute产品最新进展 -- 从马力到计算力

摘要:本文从马力作为功率衡量标准为切入点,介绍了大数据领域的计算力衡量标准TPCBB以及MaxCompute2.0在Big Bench上的卓越表现。同时详细地分享了取得优异成绩背后的产品在最新有哪些进展,...

猫耳m ⋅ 20分钟前 ⋅ 0

Linux系统

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Linux系统: Unix:是C语言转做出来的,最早的网...

凯哥学堂 ⋅ 21分钟前 ⋅ 0

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

13.1 设置更改root密码 启动MySQL数据库 [root@linux-10 ~]# /etc/init.d/mysqld startStarting MySQL SUCCESS! 由于MySQL的相关命令的所在路径不在系统的环境变量中,因此需要将路径添...

影夜Linux ⋅ 23分钟前 ⋅ 0

jeesite shiro+redis实现cache和session共享

jeesite这个开源框架本身集成的有shiro+redis来实现cache和session共享,但是需要修改一下文件配置即可 首先找到spring-context-shiro.xml文件 找到bean id为sessionDAO,将其修改为如下 <!...

wangxujun59 ⋅ 24分钟前 ⋅ 0

基本JNI搭建

1、编写Java代码 首先我们需要编写自己的java代码 public class Hello { static{ System.loadLibrary("hello-jni"); } public native String sayHello();} 2、把...

国仔饼 ⋅ 25分钟前 ⋅ 0

MaxCompute产品最新进展 -- 从马力到计算力

摘要:本文从马力作为功率衡量标准为切入点,介绍了大数据领域的计算力衡量标准TPCBB以及MaxCompute2.0在Big Bench上的卓越表现。同时详细地分享了取得优异成绩背后的产品在最新有哪些进展,...

阿里云云栖社区 ⋅ 30分钟前 ⋅ 0

AppDelegate 设置Root相关

self.window = UIWindow.init(frame: UIScreen.main.bounds) self.window?.backgroundColor = UIColor.white self.window?.makeKeyAndVisible() self.window?.rootViewController = RootTabB......

west_zll ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部