DCT变换及量化的c++实现(基于opencv矩阵运算)

基于Python+OpenCV不同尺寸的DCT变换的性能比较 一、项目背景与意义离散余弦变换(DCT)是图像和视频压缩中常用的一种变换技术,能够将图像从空间域转换到频率域,使得图像的能量主要集中在低频部分,从而便于进行后续的压缩处理。OpenCV作为一个强大的计算机视觉库,提供了DCT变换的相关函数。本项目旨在通过Python和OpenCV,对不同尺寸的图像进行DCT变换,并比较其性能差异,以探究DCT变换在图像处理中的最优应用策略。二、技术框架与工具Python:作为脚本语言,Python在数据处理和算法实现上具有简洁、易读的优势。 阅读详情

由于DCT的数学原理不好描述,直接放代码了:

#include<iostream>
#include<fstream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;
const double pi = 3.141592;
void initDctMat(Mat &A)  //计算8x8块的离散余弦变换系数
{
	for (int i = 0; i < 8; ++i)
		for (int j = 0; j < 8; ++j)
		{
			float a;
			if (i == 0)
				a = sqrt(1.0 / 8.0);
			else
				a = sqrt(2.0 / 8.0);
			A.ptr<float>(i)[j] = a*cos((j + 0.5)*pi*i / 8);
		}
}
//dct变换
void myDct(Mat &image, const Mat &A, const Mat &mask)
{
	//分块 8x8
	for(int i = 0; i < 256; i+=8)
		for (int j = 0; j < 256; j += 8)
		{

			//X = AXAT 
			image(Range(i, i + 8), Range(j, j + 8)) = A * image(Range(i, i + 8), Range(j, j + 8)) *A.t();
			//用mask量化
			image(Range(i, i + 8), Range(j, j + 8)) /= mask;
		
		}
}
//dct反变换
void myiDct(Mat &image, const Mat &A, const Mat &mask)
{
	//分块8x8
	for (int i = 0; i < 256; i += 8)
		for (int j = 0; j < 256; j += 8)
		{
			//还原量化
			image(Range(i, i + 8), Range(j, j + 8)) = image(Range(i, i + 8), Range(j, j + 8)).mul(mask);
			//X = ATXA
			image(Range(i, i + 8), Range(j, j + 8)) = A.t() * image(Range(i, i + 8), Range(j, j + 8)) * A;
		}
}
int main()
{
	//读取图像,图像为灰度图,单通道
	Mat image = imread("lena.bmp",CV_LOAD_IMAGE_GRAYSCALE);
	Mat fimage;
	Mat A(Size(8, 8), CV_32FC1);// 离散余弦系数矩阵
	//初始化mask量化矩阵
	float msk[8][8] = { {16,11,10,16,24,40,51,61},{12,12,14,19,26,58,60,55},{14,13,16,24,40,57,69,56},{14,17,22,29,51,87,80,62},{18,22,37,56,68,109,103,77},{24,35,55,64,81,104,113,92},{49,64,78,87,103,121,120,101},{72,92,95,98,112,100,103,99}};
	Mat mask(8, 8, CV_32FC1, msk);
	//显示原图
	if (!image.empty())
		imshow("image", image);
	//计算A系数
	initDctMat(A);
	//转换成浮点数矩阵,进行dct变换
	image.convertTo(fimage, CV_32FC1);
	myDct(fimage, A, mask);
	//计算压缩率, 用非零矩阵点数量比总数量、
	fimage.convertTo(image, CV_8UC1);
	double dctRate = countNonZero(image) / (256.0 * 256.0);
	cout << "the size becomes " << dctRate * 100 << "% of the original." << endl;
	imshow("压缩图", fimage);
	//dct反变换
	myiDct(fimage, A, mask);
	//显示还原的图像
	fimage.convertTo(image, CV_8UC1);
	imshow("还原图", image);
	waitKey(0);
	return 0;
}
运行结果:



如何使用OpenCV Python找到图像的离散余弦变换? 我们使用来找到图像的离散余弦变换。此函数将dtype float32的灰度图像转换为变换图像。它接受两种类型的标志或。为了将变换后的图像转换回原始图像,我们使用。 阅读详情

相关推荐

8*8DCT、量化、zigzag扫描

距上次说的DCT处理有段时间了,一直没

Tang 1万+

图像处理之DCT图像压缩(基于c++ opencv实现)

利用c++ opencv使用DCT函数实现图像压缩

weixin_51303016的博客 2707

C++与OpenCV实现图像8x8分块DCT与量化处理

图像压缩是多媒体处理中的基础技术,其核心原理是通过变换编码减少数据冗余。离散余弦变换(DCT)作为经典方法,能将图像从空间域转换到频率域,使能量集中在低频区域。量化是关键步骤,通过有选择地舍弃高频信息实现压缩,量化表的设计直接影响压缩率与图像质量。在工程实践中,结合OpenCV库,可以高效实现分块处理与算法验证。本文以8x8分块DCT与量化处理为例,演示了从原理到代码实现的全过程,帮助理解JPEG压缩标准的基础框架,并探讨了量化强度调节与性能优化等实际问题。

weixin_29274969的博客 254

python opencv 常用增强 dct变换+侵蚀+扩张+索贝尔算子+直方图均衡化+光照平衡+

opencv图像增强操作

ResumeProject的博客 1508

从零实现JPEG解码器:深入理解DCT、哈夫曼编码与图像压缩原理

图像压缩是计算机图形学和多媒体处理中的基础技术,其核心目标是在保证视觉质量的前提下减少数据存储与传输开销。JPEG作为最广泛使用的有损压缩格式,其原理基于离散余弦变换将图像从空间域转换到频域,分离出对人眼敏感的低频信息和不敏感的高频信息。通过量化过程有选择地丢弃高频细节,再结合哈夫曼编码等熵编码技术,实现高效的数据压缩。这种技术方案在数字摄影、网页传输和视频流媒体等场景中具有重要工程价值。本文通过实现一个完整的JPEG解码器,深入解析哈夫曼编码的位流解析和DCT反变换过程,帮助开发者掌握图像压缩的底层实现机

weixin_33724659的博客 320

在OpenCV里实现DCT变换

离散余弦变换简称为DCT(是英Discrete Cosine Transform的缩写词),是一种数字处理方法,经常用于数据处理。DCT是多种数字变换方法的一种,它是把空间域图像变换到频率域进行分析的方法。由于DCT的变换核构成的基向量与图像内容无关,而且变换核是可以分离的,既二维DCT可以用两次一维DCT来完成,使得数学运算难度大大简化,再配以已经发现的其它快速算法,使得DCT编码得到了广泛的应...

大坡3D软件开发 3254

数字信号实验:使用C++与OpenCV实现DCT变换压缩图片

数字信号实验:DCT压缩图片c++和OpenCV代码实现

qq_50645395的博客 986

C++结合OpenCV实现图像8x8分块DCT与量化处理

固定量化表虽好,但无法适应所有场景。比如文本图像需要保护边缘,医学影像要保留微小病灶。解决方案:引入内容感知量化!思路很简单:先计算每个块的方差(反映纹理复杂度),再决定用哪种量化强度。// 平滑区,保细节// 纹理区,狠压缩} else {A[输入图像块] --> B{计算方差}B --> C[Var < 低阈值?C -->|是| D[应用平滑区量化表]C -->|否| E{Var > 高阈值?E -->|是| F[应用纹理区量化表]

weixin_42573757的博客 6451

数字信号与图像处理实验三:图像处理基础与图像变换

数字信号与图像处理实验三 使用C++与OpenCV实现DCT图像压缩 编写程序实现图像的水平垂直和中心对称(注:不能用系统的旋转函数)

路飞DoD的博客 3252

基于OpenCV的JPEG图像压缩实现与实战

本文还有配套的精品资源,点击获取 简介:OpenCV是一个广泛应用于图像处理和计算机视觉的开源库。本项目围绕基于OpenCV的JPEG压缩展开,介绍了JPEG图像压缩的基本原理与实现流程,包括离散余弦变换(DCT)、颜色空间转换、分块处理、量化、熵编码等关键技术。项目使用C++语言结合OpenCV 2.0库,在VS2005环境下实现了图像加载、RGB数据处理、自定义JPEG压缩与保存的全过程。通过本项目,开发者可深入理解图像压缩机制,并掌握OpenCV在图像处理中的实际应用。

weixin_42591413的博客 1144

VC++DCT变换源码

VC++实现的DCT 变换与反变换源码! 欢迎下载学习,共同提高!

矩阵论在图像算法中的应用

本文详细阐述了矩阵论在图像算法中的广泛应用。首先介绍了图像在计算机中的矩阵表示形式,然后从图像压缩、图像变换、图像特征提取与识别、图像恢复与重建等多个方面深入分析了矩阵论相关技术的作用原理和优势。通过对这些应用的探讨,展示了矩阵论在提高图像处理效率、增强图像质量和实现复杂图像分析任务中的关键地位,同时对其未来发展方向进行了展望。

m0_44975814的博客 2601

opencv处理图像8*8分块DCT变换和量化

自己编写的opencv处理图像DCT,8*8分块DCT变换和量化。量化步长自己定义8*8矩阵输入

实现正方形图片dct的c++代码(使用AXAT)

#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;opencv2/core/core.hpp&gt; #include&lt;opencv2/highgui/highgui.hpp&gt; using namespace std; using namespace cv; const double pi = 3.141592...

zyckhuntoria的博客 777

DCT变换以及逆变换 C++函数

DCT变换以及逆变换,使用VS2013+OPENCV(版本不限),C++语言编写的两个函数,只是函数,参数均为图像,直接调用函数即可

opencv3/C++ 离散余弦变换DCT方式

离散余弦变换/Discrete cosine transform, 根据离散傅里叶变换的性质,实偶函数的傅里叶变换只含实的余弦项,而数字图像都是实数矩阵,因此构造了一种实数域的变换——离散余弦变换(DCT)。 离散余弦变换具有很强的”能量集中”特性,左上方称为低频数据,右下方称为高频数据。而大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分。因此也可以在图像压缩算法中用来进行有损压缩。(如JPEG压缩编码) OpenCV中dct() 在OpenCV中有专门进行离散余弦变换的函数dct()。 dct()函数执行1D或2D浮点数组的正向或反向离散余弦变换(DCT): N个元素

Xcode+OpenCV+C++实现图像感知哈希相似度比对

感知哈希(Perceptual Hash)是一种将图像映射为固定长度指纹的轻量级内容比对技术,其核心原理是通过灰度变换、尺寸归一化与离散余弦变换(DCT)提取低频结构特征,生成抗缩放、旋转、水印的64位哈希值。相比深度学习模型,它无需GPU依赖、无训练开销,单图处理仅需毫秒级,特别适合iOS/macOS端本地化场景,如相册去重、教学素材查重、UI截图识别等。在Xcode环境下结合OpenCV C++实现,可充分发挥Metal加速与零拷贝内存管理优势,显著提升批量处理吞吐与稳定性。本文聚焦pHash算法在真实

weixin_28828243的博客 191

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1091
上一篇: PCA算法的原理以及c++实现(Eigen库实现)源码
下一篇: 感知机模型的原理
Qer_
博客等级 码龄11年 34粉丝 69原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值