DCT / IDCT

Matlab一探DCT/IDCT变换在图像压缩中的应用 一般来说,低频部分决定了整个图像的大致走向,也就是轮廓,而高频部分则决定了图像的纹理细节。结束 阅读详情


/* DCT与IDCT变换的简单实现,不是最优解 */



#include <iostream>
#include <math.h>

using namespace std;

#define NUM 8
#define PI 3.1415926


short round(double a)
{
         if (a >= 0)
         {
                  return (short)(a + 0.5);
         }
         else
         {
                   return (short)(a - 0.5);
         }
}


// DCT - Discrete Cosine Transform

void DCT(short data[NUM][NUM])
{
         short output[NUM][NUM];
         double ALPHA, BETA;
         short u = 0;
         short v = 0;
         short i = 0;
         short j = 0;

         for(u = 0; u < NUM; u++)
         {
                   for(v = 0; v < NUM; v++)
                   {
                          if(u == 0)
                           {
                                     ALPHA = sqrt(1.0 / NUM);
                            }
                            else
                            {
                                     ALPHA = sqrt(2.0 / NUM);
                            }


                            if(v == 0)
                            {
                                     BETA = sqrt(1.0 / NUM);
                            }
                            else
                            {
                                     BETA = sqrt(2.0 / NUM);
                            }

                            double tmp = 0.0;

                            for(i = 0; i < NUM; i++)
                            {
                                     for(j = 0; j < NUM; j++)
                                     {
                                               tmp += data[i][j] * cos((2*i+1)*u*PI/(2.0 * NUM)) * cos((2*j+1)*v*PI/(2.0 * NUM));
                                     }
                            }
                            output[u][v] = round(ALPHA * BETA * tmp);
                   }
         }
         memset(data, 0, NUM * NUM * sizeof(short));
         memcpy(data, output, NUM * NUM * sizeof(short));

}

 
// Inverse DCT (IDCT)

void IDCT(short data[NUM][NUM])
{
         short output[NUM][NUM];
         double ALPHA, BETA;
         short u = 0;
         short v = 0;
         short i = 0;
         short j = 0;

         for(i = 0; i < NUM; i++)
         {
                   for(short j = 0; j < NUM; j++)
                   {
                            double tmp = 0.0;

                            for(short u = 0; u < NUM; u++)
                            {
                                     for(v = 0; v < NUM; v++)
                                     {
                                               if(u == 0)
                                               {
                                                        ALPHA = sqrt(1.0 / NUM);
                                               }
                                               else
                                               {
                                                       ALPHA = sqrt(2.0 / NUM);
                                               }
                                               if(v == 0)
                                               {
                                                        BETA = sqrt(1.0 / NUM);
                                               }
                                               else
                                               {
                                                        BETA = sqrt(2.0 / NUM);
                                               }
                                               tmp += ALPHA * BETA * data[u][v] * cos((2*i+1)*u*PI/(2.0 * NUM)) * cos((2*j+1)*v*PI/(2.0 * NUM));
                                     }
                            }
                            output[i][j] = round(tmp);
                   }
         }
         memset(data, 0, NUM * NUM * sizeof(short));
         memcpy(data, output, NUM * NUM * sizeof(short));
}
 

int   main(void)
{
         short i = 0;
         short j = 0;
         short u = 0;
         short v = 0;   

         // 8 x 8 的图像数据

         short input[NUM][NUM] =
         {
                   { 89, 101, 114, 125, 126, 115, 105, 96 },


                   { 97, 115, 131, 147, 149, 135, 123, 113 },


                   { 114, 134, 159, 178, 175, 164, 149, 137 },


                   { 121, 143, 177, 196, 201, 189, 165, 150 },


                   { 119, 141, 175, 201, 207, 186, 162, 144 },


                   { 107, 130, 165, 189, 192, 171, 144, 125 },


                   { 97, 119, 149, 171, 172, 145, 117, 96 },


                   { 88, 107, 136, 156, 155, 129, 97, 75 }


         };


         DCT(input); // DCT

         cout << "\nThe result of DCT:\n" << endl;

         for(u = 0; u < NUM; u++)
         {
                   for(v = 0; v < NUM; v++)
                   {
                            cout << input[u][v] << '/t';
                   }
                   cout << endl;
         }

         IDCT(input);  // IDCT

         cout << "\nThe result of IDCT:\n" << endl;

         for(i = 0; i < NUM; i++)
         {
                   for(short j = 0; j < NUM; j++)
                   {
                            cout << input[i][j] << '/t';
                   }
                   cout << endl;
         }
system("pause");
         return 0;
}



一维离散余弦变换(DCT)及其反变换(IDCT)公式的一种推导 在层层推进的逻辑框架下分别由一维离散Fourier变换和逆变换推导一维离散余弦变换和逆变换公式的一篇文章。 阅读详情

相关推荐

基于流水线与CSD编码的高性能2D DCT/IDCT硬件加速器设计

离散余弦变换是图像与视频压缩的核心数学工具,其原理在于将图像从空间域转换到频率域,通过量化丢弃人眼不敏感的高频信息,从而实现高效压缩。在硬件实现层面,DCT/IDCT的计算复杂度是性能瓶颈,传统软件方案难以满足实时高清视频处理的需求。因此,采用专用硬件加速器,通过算法优化与并行架构设计来提升吞吐率与能效比,成为关键技术路径。本文聚焦于一种基于改进Loeffler算法与规范有符号数编码的硬件架构,通过深度流水线设计均衡计算负载,并以加法器和移位器取代传统乘法器,显著降低了资源消耗与关键路径延迟。同时,针对二维

weixin_30313409的博客 365

DCT变换编码及C语言实现

离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算。在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 离散余弦变换(DCT)是N.Ahmed等人在1974年提出的正交变换方法。它...

海阔天空 8627

编程速记(39):Matlab篇-提取图像高频/低频信息-基于DCT

一、简述 希望通过离散余弦变换获取某张图片的高频/低频信息 二、Demo 转灰图处理方式 RGB = imread('autumn.tif'); I = rgb2gray(RGB); J = dct2(I); figure imshow(log(abs(J)),[]) colormap(gca,jet(64)) colorbar J(abs(J) < 10) = 0; K = idct2...

weixin_38316806的博客 7650

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

变换矩阵,DCT = IDCT'googlestatic 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...

weixin_30436581的博客 571

TMS320C55x DSP硬件加速器:DCT、运动估计与像素插值实战解析

在嵌入式视频处理领域,硬件加速是平衡性能与功耗的关键技术。其核心原理是通过专用硬件电路,替代CPU执行计算密集且模式固定的算法任务,从而在算法灵活性与执行效率之间找到最佳平衡点。这种技术能带来显著的性能提升和功耗降低,尤其适用于实时视频编解码、图像处理等场景。具体到德州仪器TMS320C55x系列DSP,其通过集成**DCT/IDCT单元**、**运动估计单元**和像素插值单元等硬件扩展,为MPEG-4、H.263等视频标准的实时处理提供了强大的硬件支持。这些单元通过特殊的协处理器指令调用,能将变换、运动搜

weixin_29194255的博客 331

DCT快速数字水印:兼顾实时性与鲁棒性的工程实践

数字水印技术通过在多媒体内容中嵌入不可见的标识信息,为版权保护和内容认证提供了关键技术支撑。其核心原理分为空间域和变换域两大流派:空间域方法直接修改像素,速度快但鲁棒性差;变换域方法(如DCT)将图像转换到频域再嵌入水印,鲁棒性强但计算开销大。这种速度与鲁棒性的矛盾,在实时视频流和高分辨率图像处理中尤为突出。本文介绍一种创新的DCT快速水印方法,它通过精准的数学推导,将特定DCT系数的修改直接映射为像素值的调整,从而在保持变换域方法出色鲁棒性的同时,获得了接近空间域方法的嵌入速度。该方法在**实时性**和*

weixin_30878501的博客 708

JPEG图像压缩探索_DCT变换的应用

对于图像处理来说,细节部分一般具有亮度起伏大、较短的尺度下亮度变化次数多的特点,转换为数学方式的描述,就是图像细节部分一般为“高频信号”,因此,如果能使用“分频器”,把图像的“时域信号”转化为“频域信号”,即可实现筛选走一部分高频信号,只保留高频信号,使得表达图像时需要的空间减少。

轮子初级玩家 3763

H264中的DCT变换和量化

下图为intra16x16 block的正向变换和反向变换过程,和非intra16x16 block相比,intra16x16 会进一步把这16个小块的DC分量再做哈达玛变换,然后再量化,所以对于每个小块中的16个系数,DC系数为先做DCT变换再做哈达玛变换的结果,15个AC系数为DCT变换的结果。反向变换和正向变换的顺序相反。反向变换为先对16个小块的DC分量做反哈达玛变换,然后再把每个小块的DC分量和它的AC分量放在一起,组成16个系数,然后对它再做反量化,接着IDCT,恢复block中的像素值。

音视频图像相关 1317

基于EARC-CORDIC协同优化的高能效DCT/IDCT硬件架构设计

离散余弦变换(DCT)及其逆变换(IDCT)是图像与视频压缩领域的核心算法,其原理是将信号从空间域转换到频域,通过滤除高频信息实现数据压缩。在硬件实现层面,传统基于乘法器的方案面临资源消耗大、功耗高的挑战。CORDIC算法以其仅需移位和加法的特性,成为低功耗硬件实现的理想选择,但其固有的迭代延迟和尺度因子误差制约了性能。本文聚焦于通过增强型自适应重编码CORDIC(EARC)与优化尺度因子近似的协同设计,在统一的硬件架构上同时实现DCT和IDCT功能。该方案针对不同旋转角度的计算需求,灵活组合无尺度因子的E

weixin_30325971的博客 591

【Simulink教程案例32】Simulink中导入图片并实现图片的各类变换域转换

欢迎订阅Simulink中,图片的读取和显示,分别使用模块image from file 和 video viewer两个模块,其分别来自:我们将这两个模块拖入到simulink设计界面中,得到如下模型:双击第一个模块,其参数设置界面如下:注意,将测试图片lena.jpg(经典图片,可以自行百度搜索一个512*512大小的测试图片) 和仿真模型放一起,如下图所示。

FPGA/MATLAB学习教程/源码/项目合作开发 1539

离散余弦变换DCT完整源码实现与解析

离散余弦变换(Discrete Cosine Transform, DCT)是一种将有限长度实数序列从时域转换到频域的线性正交变换,广泛应用于信号压缩领域。其核心思想是利用余弦函数作为基函数,将原始数据表示为不同频率的余弦分量之和。DCT最显著的优势在于具备良好的能量集中特性——对于具有强相关性的信号(如图像块),其能量往往集中在少数低频系数中,从而为后续的量化与压缩提供便利。

weixin_35755562的博客 512

图像的DCT与IDCT变换 -python

在此做一下记录方便以后自己调用。代码里包含了DCT与IDCT变换;快速2D-DCT/2D-IDCT变换。

A_F_AN的博客 541

DCT算法及IDCT源代码

DCT算法源代码,还有注释,很容易理解的。 DCT和GetPoints两个主要函数。 还有IDCT

图像处理算法

DCT属于图像变换编码,它运用了图像变换技术,将一幅原始图像进行变换之后,只要去接近于零的系数,并且对较小的系数进行粗量化,而保留包含了图像主要信息的系数,以进行压缩编码。DCT的编码过程如图 2-2所示。由图4-3可见,该系数矩阵具有良好的对称性,即第1、3、5、7行的左4列与右4列对称相等,第2、4、6、8行的左4列与右4列符号相反。因乘积项中的DCT系数值是已知的,所以采用查询表和移位相加的方法进行乘法运算,此DA算法可以使硬件结构比较简单,消耗的硬件资源相对比较少,最重要的是运算周期比较短。

qq_61141142的博客 885

要配置西门子G120XA变频器实现**端子启停**和**Modbus RTU(485)频率给定

如有问题,可通过STARTER软件在线诊断Modbus通讯状态。要配置西门子G120AX变频器实现。

微:13763355074 4842

Versal - 从零构建Petalinux 2024.2 AI边缘计算平台(VD100+SDT+JupyterLab实战)

本文详细介绍了如何从零开始,基于AMD Versal VD100开发板和Petalinux 2024.2构建AI边缘计算平台。内容涵盖开发环境搭建、Petalinux工程创建与配置、SDT新流程实战、启动SD卡制作,并最终集成JupyterLab与Conda,打造出开箱即用的交互式AI开发环境,帮助开发者快速进行算法验证与部署。

5f4d3s2a1q的博客 487

DCT变换编码C语言

#include #include #include #include #define PI 3.1415926#define CLK_TCK CLOCKS_PER_SECint N;void DCT(double *f,double *F){ int n,m,x; double *dTemp=new double[N*N];//中间矩阵 doub

青藤 1322

stm32学习笔记-启动文件

1、配置栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp EQU:相当于C中的define,定义Stack_Size = 0x00000400。 AREA: 指...

某风吾起的博客 4529

Python+OpenCV实战:用DCT算法给老照片降噪(附完整代码)

本文详细介绍了如何利用Python和OpenCV,结合离散余弦变换(DCT)算法为老照片进行智能降噪。通过实战代码演示了从空间域到频率域的思维转换、DCT核心算法实现、完整的降噪流水线构建以及参数调优技巧,帮助读者掌握这一经典的图像修复技术,有效去除噪声并保留珍贵细节。

y7z8a9的博客 436

SIwave仿真手册——软件基础(一)

最近在学习SIWAVE,在这里将自己的笔记整理一下,做一个专题。希望对大家有帮助,这个会持续更新的。仅限于软件操作学习,不涉及信号完整性的讨论。

luohuo9844的博客 4万+

UE5.4像素流送实战:GPU驱动、WebRTC与系统级调优全解析

像素流送是将实时3D渲染画面通过WebRTC编码推流至浏览器的关键技术,其本质是GPU硬件编码(如NVENC)与低延迟网络传输(UDP+BBR)的深度协同。理解其原理需跨越图形API(Vulkan/DX12)、实时音视频(H.264/H.265)、WebRTC信令与NAT穿透四大技术层。技术价值在于突破终端算力限制,支撑远程工业仿真、云VR看房等高交互场景;但落地难点集中于基础设施层——如NVIDIA驱动与UE5.4.3的CUDA Toolkit 12.2兼容性、Linux内核TCP/UDP参数调优、GPU

weixin_32943857的博客 614

【图像加密解密】DCT变换的图像加密与解密(含直方图)【含Matlab源码 15112期】

DCT变换的图像加密与解密 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 371

京瓷扫描驱动安装_京瓷喷头拆解和供墨原理剖析

在工业喷头打印领域,京瓷喷头作为主流喷头广泛应用于喷墨行业,目前京瓷喷头市面上销售主要有两个系列:KJ4A和KJ4B。其中KJ4A系列设计是用于油性墨水,例如UV墨水,主要用在广告领域;而KJ4B设计用于水性墨水,例如活性、分散墨水等,主要用在数码印花领域。最近我们团队对京瓷喷头进行了拆解分析,本期和大家分享一下我们对京瓷喷头拆解和喷头供墨原理的研究。京瓷喷头介绍1. KJ4A系列(油性)如下图所...

weixin_39883906的博客 1672

【图像加密】基于 DCT 变换的图像加密与解密附matlab代码

随着数字图像技术在医疗影像、军事侦察、个人隐私保护等领域的广泛应用,图像数据的安全性问题日益凸显。传统加密方法如AES直接对像素值加密,存在计算量大、无法兼容压缩传输、硬件实现复杂等缺陷。例如,512×512图像加密需处理262,144个像素点,而基于DCT(离散余弦变换)的加密方案通过频域系数扰动实现加密,计算量仅为传统方法的1/3,且与JPEG压缩标准兼容,可节省60%以上传输带宽。本研究聚焦于DCT变换在图像加密中的核心机制,旨在构建兼顾安全性与效率的频域加密框架。

2501_91572946的博客 681

逆向实战:从x-mini签名到RPC调用,Frida动态分析小红书加密协议

本文通过实战案例,详细拆解了小红书App的加密协议逆向分析过程。从识别x-mini签名等关键参数入手,结合静态分析与Frida动态Hook技术,追踪到核心的RPC调用入口,并最终封装成可独立调用的RPC函数,为安全研究和协议理解提供了完整的技术路径。

moss5的博客 1025

YOLO26优化:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 362
上一篇: extern "C"用法
下一篇: C++三种继承方式
tkp2014
博客等级 码龄12年 137粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值