`

图像的时频变换——离散余弦变换

 
阅读更多

研究过离散傅里叶变换的,都会觉得离散余弦变换的会更简单,不过不知道为什么网上却没有像离散傅里叶变换那样多的介绍,还得下次找本书好好钻研,后再补充。

二维离散余弦变换的正变换公式为:

在图像的压缩编码中,N一般取8.

二维DCT的反变换公式为:

以上各式中的系数:

 

基于DCTJPEG图像压缩编码理论算法 基于DCT编码的JPEG编码压缩过程框图,如图1所示。


图1  基于DCT编码的JPEG压缩过程简化图

上图是基于DCT变换的图像压缩编码的压缩过程,解压缩与上图的过程相反。

在编码过程中,首先将输入图像颜色空间转换后分解为8×8大小的数据块,然后用正向二维DCT把每个块转变成64DCT系数值,其中1个数值是直流(DC)系数,即8×8空域图像子块的平均值,其余的63个是交流(AC)系数,接下来对DCT系数进行量化,最后将变换得到的量化的DCT系数进行编码和传送,这样就完成了图像的压缩过程。

从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。为此,发送者首先将输入图像分解为8*816*16块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换。最后将操作完成后所有的块拼接起来构成一幅单一的图像。

所以DCT是对二维像素数组进行处理,下面附上程序:

     * in_image  输入图像矩阵
     * iw, ih    输入图像宽高
     * bsize     bsizeXbsize图像块DCT变换
     * type      type = 1为正DCT变换, type =-1为逆变换
     *------------------------------------------------------------*/
    public double[][] dctTrans(double[][] img, int iw, int ih, int bsize, int type)
    {
        int iter_num = 256 / bsize;
        dct_image = new double[iw][ih];
        dct_coef  = new double[bsize][bsize];
        dct_coeft = new double[bsize][bsize];
        image = new double[bsize][bsize];
        
        coeff(dct_coef, bsize);
        
        //定义转置矩阵系数
        for (int i = 0; i < bsize; i++)
            for (int j = 0; j < bsize; j++)
                dct_coeft[i][j] = dct_coef[j][i];

        if (type == 1)
        {        	
            for (int j = 0; j < iter_num; j++)
            {
                for (int i = 0; i < iter_num; i++)
                {
                    //取bsizeXbsize图像块image[][]
                    for (int k = 0; k < bsize; k++)
                        for (int l = 0; l < bsize; l++)                            
                            image[k][l] = img[i * bsize + k][j * bsize + l];
                     
                    //bsizeXbsize块DCT变换
                    dct(image, dct_coeft, dct_coef, bsize);//正变换
                    
                    //Output dct image
                    for (int k = 0; k < bsize; k++)
                        for (int l = 0; l < bsize; l++)
                            dct_image[i * bsize + k][j * bsize + l] = image[k][l];
                }
            }
        }
        else 
        {
            for (int j = 0; j < iter_num; j++)
            {
                for (int i = 0; i < iter_num; i++)
                {
                    //取bsizeXbsize图像块image[,]
                    for (int k = 0; k < bsize; k++)
                        for (int l = 0; l < bsize; l++)
                            image[k][l] = img[i * bsize + k][j * bsize + l];

                    //bsizeXbsize块IDCT变换
                    dct(image, dct_coef, dct_coeft, bsize);//逆变换
                    
                    //Output dct image
                    for (int k = 0; k < bsize; k++)
                        for (int l = 0; l < bsize; l++)
                            dct_image[i * bsize + k][j * bsize + l] = image[k][l];
                }
            }                
        }
        return dct_image;
    }

    public void coeff(double[][] dct_coef, int n)
    {
        double sqrt_1 = 1.0 / Math.sqrt(2.0);

        for (int i = 0; i < n; i++)
            dct_coef[0][i] = sqrt_1;

        //初始化DCT系数
        for (int i = 1; i < n; i++)
            for (int j = 0; j < n; j++)
                dct_coef[i][j] = Math.cos(i * Math.PI * (j + 0.5) / ((double)n));
    }

    public void dct(double[][] a, double[][] b, double[][] c, int n)
    {
        double x;
        double[][] af = new double[n][n];

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                x = 0.0;
                for (int k = 0; k < n; k++)
                    x += a[i][k] * b[k][j];
                af[i][j] = x;
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                x = 0.0;
                for (int k = 0; k < n; k++)
                    x += c[i][k] * af[k][j];
                a[i][j] = 2.0 * x / ((double)n);
            }
        }
    }

 

实验效果如下:


 

 

  • 大小: 16 KB
  • 大小: 15.2 KB
  • 大小: 10.2 KB
  • 大小: 16.6 KB
  • 大小: 39.9 KB
分享到:
评论

相关推荐

    图像变换之傅里叶_离散余弦变换.ppt

    总的来说,傅里叶变换和离散余弦变换是图像处理中不可或缺的工具,它们不仅帮助我们理解图像的内在结构,而且在图像滤波、压缩和分析等方面发挥着重要作用。通过深入理解和熟练运用这些变换,我们可以设计出更加高效...

    图像的正交变换源码 傅里叶变换 离散余弦变换 沃尔什变换

    本文将深入探讨四种常见的正交变换:傅里叶变换、离散余弦变换(DCT)、沃尔什变换,以及它们在图像处理中的应用。 首先,傅里叶变换是数学中的一个基本工具,它将信号或图像从时域或空域转换到频域。在图像处理中...

    图像时频变换 FFT等

    本主题将深入探讨四种常见的时频变换方法:离散余弦变换(DCT)、快速傅里叶变换(FFT)、小波变换(DWT)和离散沃尔什变换(DWT),并结合C#编程语言的实现来理解这些概念。 1. **离散余弦变换(DCT)**: DCT是...

    c++实现图像傅里叶变换、离散余弦变换和沃尔什变换

    在图像处理领域,傅里叶变换、离散余弦变换(DCT)和沃尔什变换是三种重要的数学工具,它们用于分析图像的频率成分。在C++编程环境下,实现这些变换可以帮助我们理解图像的本质特性,并在图像压缩、滤波、增强等方面...

    图像处理中的傅里叶变换与离散余弦变换_tuxiangchuli_

    在图像处理领域,傅里叶变换(Fourier Transform)和离散余弦变换(Discrete Cosine Transform, DCT)是两种重要的分析和处理图像的方法。它们被广泛应用于图像压缩、图像增强、噪声滤波等多个方面。下面我们将深入...

    图像处理傅里叶变换,离散余弦变换

    本程序是用VC++编写的用于图像的傅里叶变换,离散余弦变换处理的程序。其中编写了很好的一个基类ImgCenterDib。以后的傅里叶变换,边缘检测等等程序都是在此类基础上加以运用的。 本程序有很好的编程风格,代码...

    图像傅立叶变换,离散余弦变换,沃尔什变换

    在图像处理领域,傅立叶变换、离散余弦变换和沃尔什变换是三种重要的频域分析工具。它们被广泛应用于图像的压缩、去噪、特征提取等方面,为理解和优化图像信号提供了强有力的数学手段。 首先,让我们深入理解图像傅...

    图像处理中的正交变换包括傅里叶变换、离散余弦变换等

    2. **离散余弦变换**(Discrete Cosine Transform, DCT):离散余弦变换是一种在图像处理中特别适合于压缩的正交变换。与傅里叶变换相似,DCT将图像转换为频率成分,但其主要特点是低频成分更具能量集中性,这使得...

    离散余弦变换原理和JPEG压缩算法

    在JPEG压缩算法中,离散余弦变换是核心步骤之一,通过离散余弦变换,可以将图像信号从空间域变换到频率域,使得图像信号的相关性减弱,能量主要集中在直流和少数低频的变换系数上。然后,对变换后的信号进行量化和...

    基于图像的离散余弦变换

    离散余弦变换(Discrete Cosine Transform, DCT)是一种广泛应用的数字信号处理技术,特别是在图像和视频压缩领域,如JPEG和MPEG标准中。它通过将图像数据转换到频域,使得图像中的高频细节信息更加集中,从而便于...

    图像的离散余弦变换(DCT)

    离散余弦变换是仅次于K-L变换的次最佳正交变换,且有这样的性质:许多有关图像的重要可视信息都集中在DCT变换的一小部分系数中,因此已被广泛应用到图像压缩编码、语音信号处理等众多领域,并成为许多图像编码国际...

    图像时频变换(FFT等) C#源码

    本资源提供的是用C#编程语言实现的几种图像时频变换的源代码,包括快速傅里叶变换(FFT)、离散余弦变换(DCT)、离散小波变换(DWT)和沃尔什-哈达玛变换(Walsh-Hadamard Transform)及其逆变换。 1. **快速...

    数字图像处理及应用:第三章 离散余弦变换(32学时新).ppt

    数字图像处理及应用:第三章 离散余弦变换 数字图像处理及应用的第三章介绍了离散余弦变换(DCT),它是一种常用的正交变换,广泛应用于图像处理和压缩领域。本章节主要讨论了DCT的定义、性质和应用。 3.2 离散...

    数字图像处理|Matlab-灰度和彩色图像的离散余弦变换

    问题1:对输入的灰度和彩色图像进行分块,每一块图像为8...对分块图像进行离散余弦变换,输出频谱图(DCT系数); 问题2:尝试改变部分的DCT系数; 问题3:通过离散余弦逆变换,还原出图像,观察与原图像之间的区别。

    离散余弦变换(完整的源码)

    离散余弦变换(Discrete Cosine Transform, DCT)是一种在数字信号处理领域广泛应用的数学变换技术,特别是在图像和音频压缩中,如JPEG和MP3等标准中扮演着核心角色。DCT能够将信号从时域转换到频域,从而帮助我们...

    图像处理中傅立叶变换,离散余弦变换及小波变换的例子

    在图像处理领域,傅立叶变换(Fast Fourier Transform, FFT)、离散余弦变换(Discrete Cosine Transform, DCT)以及小波变换(Wavelet Transform, DWT)是三种非常重要的工具,它们用于分析图像的频域特性,进而...

    离散余弦变换的原理的介绍

    离散余弦变换(Discrete Cosine Transform, DCT)是一种广泛应用在图像和视频编码中的数学变换技术。它的核心原理是将图像或视频信号从空间域转换到频率域,以利用信号的能量集中特性来实现数据压缩。在空间域中,...

    离散余弦变换_离散余弦变换_varioushvb_Vc_

    离散余弦变换(Discrete Cosine Transform, DCT)是一种在数字信号处理领域广泛应用的数学变换技术,特别是在图像和音频压缩中,如JPEG图像压缩标准和MP3音频编码中都利用了DCT。它是连续余弦变换在离散域上的近似,...

    离散余弦变换 和逆离散余弦变换的快速算法

    离散余弦变换 和逆离散余弦变换的快速算法

    C++实现灰度图像正交变换,包括傅里叶变换、离散余弦变换、沃尔什变换,小波变换

    本项目通过C++编程语言实现了四种常见的正交变换:傅里叶变换、离散余弦变换、沃尔什变换以及小波变换,专门针对灰度图像进行操作,并且在VC6.0环境下成功运行。以下是对这四种变换的详细解释: 1. **傅里叶变换**...

Global site tag (gtag.js) - Google Analytics