精华内容
下载资源
问答
  • 离散余弦变换

    2020-10-27 00:09:28
  • 基于中频离散余弦变换滤波和离散余弦变换的自动聚焦新方法
  • fromhttp://blog.csdn.net/luoweifu/article/details/8214959图像处理中常用的正交变换除了傅里叶...离散余弦变换表示为DCT(DiscreteCosineTransformation),常用于图像处理和图像识别等。一维离散余弦变换正变换 ...

    from http://blog.csdn.net/luoweifu/article/details/8214959

    图像处理中常用的正交变换除了傅里叶变换外,还有其他一些有用的正交变换,其中离散余弦就是一种。离散余弦变换表示为DCT( Discrete Cosine Transformation),常用于图像处理和图像识别等。

    一维离散余弦变换

    正变换

    1353632653_2255.png                                   (1)

    1353632745_6059.png                            (2)

    式中F(u)是第u个余弦变换系数,u是广义频率变量,u=1,2,3......N-1; f(x)是时域N点序列, x=0,1,2......N-1

    反变换

    1353632875_8831.png  (3)

    显然,式(1)式(2)和式(3)构成了一维离散余弦变换对。

    二维离散余弦变换

    正变换

    1353633096_2524.png  (4)

    式(4)是正变换公式。其中f(x,y)是空间域二维向量之元素, x,y=0,1,2,......N-1;F(u,v)是变换系数阵列之元素。式中表示的阵列为N×N

    反变换

    1353633198_1395.png (5)

    式中的符号意义同正变换式一样。式(4)和式(5)是离散余弦变换的解析式定义。

    矩阵表示法

    更为简洁的定义方法是采用矩阵式定义。根据以上公式定义可知,离散余弦变换的系数矩阵可以写成如下:

    1353633448_3354.png

    如果令N=4,那么由一维解析式定义可得如下展开式。

    1353633524_2787.png

    写成矩阵式

    1353633828_9577.png

    若定义F(u)为变换矩阵,A为变换系数矩阵,f(x)为时域数据矩阵,则一维离散余弦变换的矩阵定义式可写成如下形式

    [F(u)]=[A][f(x)]                       (6)

    同理,可得到反变换展开式

    1353634247_6785.png

    写成矩阵式即

    [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

    for(int j=0; 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

    for(int j=0; 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

    for(int j=0; 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

    coeff[0][i] = sqrt;

    }

    for(int i=1; i

    for(int j=0; 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

    for(int j=0; j

    t = 0;

    for(int k=0; k

    t += A[i][k]*B[k][j];

    }

    nMatrix[i][j] = t;          }

    }

    return nMatrix;

    }

    }

    展开全文
  • 离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分。有这样一个性质:如果信号 在给定区间内满足狄利赫里条件,且为实对称函数,则可以展开成仅含有...

    离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分。有这样一个性质:如果信号

    equation?tex=x%5Bn%5D 在给定区间内满足狄利赫里条件,且为实对称函数,则可以展开成仅含有余弦项的傅里叶级数,即离散余弦变换。所以,我们在构造离散信号的周期函数的时候,要对其进行偶延拓。

    1. 一维离散余弦变换

    首先,我们回想一下,信号

    equation?tex=x%5Bn%5D 离散傅里叶变换为

    equation?tex=%7BX%7D%28k%29+%3D+%5Cfrac%7B1%7D%7BN%7D+%5Csum_%7Bn%3D1%7D%5E%7BN%7D+x%5Bn%5D+e%5E%7B+-+j+k+%5Cfrac%7B2+%5Cpi%7D%7BN%7D+n%7D+%3D++%5Cfrac%7B1%7D%7BN%7D+%5Csum_%7Bn%3D1%7D%5E%7BN%7D+x%5Bn%5D+%5Cleft+%5C%7B+%5Cmathrm%7Bcos%7D%28k+%5Cfrac%7B2+%5Cpi%7D%7BN%7D+n%29+-+i+%5Cmathrm%7Bsin%7D%28k+%5Cfrac%7B2+%5Cpi%7D%7BN%7D+n%29+%5Cright+%5C%7D

    设信号长度为

    equation?tex=N ,然后对其进行偶延拓。

    如果序列中不包含0点,即定义域为

    equation?tex=%5B1%2C+2%2C+%5Ccdots%2C+N+%5D ,则偶延拓后其对称中心为

    equation?tex=0 点,即

    equation?tex=x%5Bn%5D+%3D+x%5B-n%5D ,此时其傅里叶变换可写为

    equation?tex=%5Cbegin%7Balign%7D+%7BX%7D%28k%29+%26%3D+%5Cfrac%7B1%7D%7B2N%7D+%5Csum_%7Bn%3D-N%7D%5E%7BN%7D+x%5Bn%5D+%5Cleft+%5C%7B+%5Cmathrm%7Bcos%7D%28k+%5Cfrac%7B2++%5Cpi%7D%7B2+N%7D+n%29+-+i+%5Cmathrm%7Bsin%7D%28k+%5Cfrac%7B2+%5Cpi%7D%7B2+N%7D+n%29+%5Cright+%5C%7D+%5C%5C++%26%3D+%5Cfrac%7B1%7D%7B2N%7D+%5Csum_%7Bn%3D1%7D%5E%7BN%7D+x%5Bn%5D+%5Cleft+%5C%7B+%5B+%5Cmathrm%7Bcos%7D%28k+%5Cfrac%7B+%5Cpi%7D%7BN%7D+n%29+%2B+%5Cmathrm%7Bcos%7D%28-+k+%5Cfrac%7B%5Cpi%7D%7BN%7D+n%29+%5D+-+i+%5B+%5Cmathrm%7Bsin%7D%28k+%5Cfrac%7B%5Cpi%7D%7BN%7D+n%29+-+%5Cmathrm%7Bsin%7D%28k+%5Cfrac%7B+%5Cpi%7D%7BN%7D+n%29%5D+%5Cright+%5C%7D+%5C%5C+%26%3D%5Cfrac%7B1%7D%7B2N%7D+%5Csum_%7Bn%3D1%7D%5E%7BN%7D+x%5Bn%5D+%5Cleft+%5C%7B+2+%5B+%5Cmathrm%7Bcos%7D%28k+%5Cfrac%7B%5Cpi%7D%7BN%7D+n%29++%5D+%5Cright+%5C%7D+%5C%5C+%26%3D+%5Cfrac%7B1%7D%7BN%7D+%5Csum_%7Bn%3D1%7D%5E%7BN%7D+x%5Bn%5D+%5Cmathrm%7Bcos%7D%28k+%5Cfrac%7B%5Cpi%7D%7BN%7D+n%29++%5Cend%7Balign%7D

    而如果序列包含0点,即定义域为

    equation?tex=%5B0%2C+1%2C+%5Ccdots%2C+N-1+%5D ,偶延拓方式为

    equation?tex=x%5Bn%5D+%3D+x%5B-n-1%5D ,即对称中心为

    equation?tex=-%5Cfrac%7B1%7D%7B2%7D 。为方便,把

    equation?tex=x%5Bn%5D 右移

    equation?tex=%5Cfrac%7B1%7D%7B2%7D 变为

    equation?tex=x%5Bm%5D ,则

    equation?tex=x%5Bm%5D+%3D+x%5Bn%5D ,且

    equation?tex=m+%3D+n+%2B+%5Cfrac%7B1%7D%7B2%7D 。此时自变量

    equation?tex=m 的定语域为

    equation?tex=%5B1%2C+2%2C+%5Ccdots%2C+M%5D ,则其傅里叶变换可写为

    equation?tex=%5Cbegin%7Balign%7D+%7BX%7D%28k%29+%26%3D+%5Cfrac%7B1%7D%7B2M%7D+%5Csum_%7Bm%3D-M%7D%5E%7BM%7D+x%5Bm%5D+%5Cleft+%5C%7B+%5Cmathrm%7Bcos%7D%28k+%5Cfrac%7B%5Cpi%7D%7BN%7D+m%29+-+i+%5Cmathrm%7Bsin%7D%28k+%5Cfrac%7B%5Cpi%7D%7BN%7D+m%29+%5Cright+%5C%7D+%5C%5C++%26%3D+%5Cfrac%7B1%7D%7BM%7D+%5Csum_%7Bm%3D1%7D%5E%7BM%7D+x%5Bm%5D+%5Cmathrm%7Bcos%7D%28k+%5Cfrac%7B%5Cpi%7D%7BN%7D+m%29++%5C%5C+%26%3D+%5Cfrac%7B1%7D%7BN%7D+%5Csum_%7Bn%3D0%7D%5E%7BN-1%7D+x%5Bn%5D+%5Ccdot+%5Cmathrm%7Bcos%7D+%5Bk+%5Cfrac%7B%5Cpi%7D%7BN%7D+%28n+%2B+%5Cfrac%7B1%7D%7B2%7D%29+%5D+%5Cend%7Balign%7D

    因为计算机一般从0开始,所以DCT的标准公式为

    equation?tex=%5Cbegin%7Balign%7D+%7BX%7D%28k%29+%26%3D+%5Csqrt%7B+%5Cfrac%7B2%7D%7BN%7D+%7D+%5Csum_%7Bn%3D0%7D%5E%7BN-1%7D++x%5Bn%5D+%5Ccdot+a_%7Bk%7D+%5Cmathrm%7Bcos%7D+%5Bk+%5Cfrac%7B%5Cpi%7D%7BN%7D+%28n+%2B+%5Cfrac%7B1%7D%7B2%7D%29+%5D+%5C%5C+%5Ctext%7Bs.+t.%7D+a_%7Bk%7D+%26%3D+%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D+%5Cfrac%7B1%7D%7B%5Csqrt%7B2%7D%7D+%2C+k%3D0+%5C%5C++1%2C+k+%5Cneq+0+%5Cend%7Bmatrix%7D%5Cright.+%5Cend%7Balign%7D

    系数是为了单位化基底,推导过程可参考这里。将标准DCT公式展开

    equation?tex=%5Cbegin%7Bbmatrix%7D+X%280%29%2C++%5Ccdots+%2C+X%28N-1%29+%5C%5C++%5Cend%7Bbmatrix%7D+%3D+++%5Cbegin%7Bbmatrix%7D+x%280%29%2C+%5Ccdots+%2C+x%28N-1%29+%5C%5C++%5Cend%7Bbmatrix%7D++%5Cbegin%7Bbmatrix%7D+C_%7B0%2C+0%7D+%26+%5Ccdots+%26+C_%7B0%2C+N-1%7D+%5C%5C++%5Cvdots+%26+%5Cddots++%26+%5Cvdots+%5C%5C++C_%7BN-1%2C+0%7D+%26+%5Ccdots+%26+C_%7BN-1%2C+N-1%7D+%5Cend%7Bbmatrix%7D

    其中

    equation?tex=%5Cbm%7BC%7D 是系数矩阵

    equation?tex=%5Cbm%7BC%7D+%3D+%5Csqrt%7B%5Cfrac%7B2%7D%7BN%7D%7D+%5Cbegin%7Bbmatrix%7D+%5Csqrt%7B%5Cfrac%7B1%7D%7B2%7D%7D+%26+%5Cmathrm%7Bcos%7D%28%5Cfrac%7B1%7D%7B2%7D+%5Cfrac%7B%5Cpi%7D%7BN%7D%29+%26+%5Ccdots+%26+%5Cmathrm%7Bcos%7D%5B%28N-1%29+%5Cfrac%7B1%7D%7B2%7D+%5Cfrac%7B%5Cpi%7D%7BN%7D+%5D+%5C%5C++%5Csqrt%7B%5Cfrac%7B1%7D%7B2%7D%7D+%26+%5Cmathrm%7Bcos%7D%28%5Cfrac%7B3%7D%7B2%7D+%5Cfrac%7B%5Cpi%7D%7BN%7D%29+%26+%5Ccdots+%26+%5Cmathrm%7Bcos%7D%5B%28N-1%29+%5Cfrac%7B3%7D%7B2%7D+%5Cfrac%7B%5Cpi%7D%7BN%7D+%5D+%5C%5C++%5Cvdots+%26+%5Cvdots+%26+%5Cddots+%26+%5Cvdots+%5C%5C++%5Csqrt%7B%5Cfrac%7B1%7D%7B2%7D%7D+%26+%5Cmathrm%7Bcos%7D%28%5Cfrac%7B2N-1%7D%7B2%7D+%5Cfrac%7B%5Cpi%7D%7BN%7D%29+%26+%5Ccdots+%26++%5Cmathrm%7Bcos%7D%5B%28N-1%29+%5Cfrac%7B2N-1%7D%7B2%7D+%5Cfrac%7B%5Cpi%7D%7BN%7D+%5D+%5Cend%7Bbmatrix%7D

    矩阵内的元素为

    equation?tex=C_%7Bn%2C+k%7D+%3D+%5Csqrt%7B+%5Cfrac%7B2%7D%7BN%7D+%7D+a_%7Bk%7D+%5Cmathrm%7Bcos%7D+%5Bk+%5Cfrac%7B%5Cpi%7D%7BN%7D+%28n+%2B+%5Cfrac%7B1%7D%7B2%7D%29+%5D 。(有兴趣的同学也可以验证一下,

    equation?tex=%5Cbm%7BC%7D 是单位正交矩阵)

    逆DCT变换为

    equation?tex=x%5Bn%5D+%3D+%5Csum_%7Bk%3D0%7D%5E%7BN-1%7D+X%28k%29+a_%7Bk%7D+%5Cmathrm%7Bcos%7D%5B+k+%5Cfrac%7B%5Cpi%7D%7BN%7D%28n%2B%5Cfrac%7B1%7D%7B2%7D%29%5D 。(与逆傅里叶变换原理完全相同,不再赘述)

    2. 二维离散余弦变换

    先给出二维DCT的公式

    equation?tex=%5Cbegin%7Balign%7D+%7BX%7D%28k_%7B1%7D%2C+k_%7B2%7D%29+%26%3D+%5Cfrac%7B2%7D%7B%5Csqrt%7BN_%7B1%7D%2C+N_%7B2%7D%7D+%7D+%5Csum_%7Bn_%7B1%7D%3D0%7D%5E%7BN_%7B1%7D-1%7D+%5Csum_%7Bn_%7B2%7D%3D0%7D%5E%7BN_%7B2%7D-1%7D++x%5Bn_%7B1%7D%2C+n_%7B2%7D%5D+%5Ccdot+a_%7Bk_%7B1%7D%7D+a_%7Bk_%7B2%7D%7D+%5Cmathrm%7Bcos%7D+%5Bk_%7B1%7D+%5Cfrac%7B2+%5Cpi%7D%7BN_%7B1%7D%7D+%28n_%7B1%7D+%2B+%5Cfrac%7B1%7D%7B2%7D%29+%5D+%5Cmathrm%7Bcos%7D+%5Bk_%7B2%7D+%5Cfrac%7B2+%5Cpi%7D%7BN_%7B2%7D%7D+%28n_%7B2%7D+%2B+%5Cfrac%7B1%7D%7B2%7D%29+%5D++%5Cend%7Balign%7D

    将上述DCT的公式展开

    equation?tex=%5Cbegin%7Bbmatrix%7D+X%280%2C+0%29+%26+%5Ccdots+%26+X%280%2C+N_%7B2%7D-1%29%5C%5C++%5Cvdots+%26+%5Cddots+%26+%5Cvdots+%5C%5C++X%28N_%7B1%7D-1%2C+0%29+%26+%5Ccdots+%26+X%28N_%7B1%7D-1%2C+N_%7B2%7D-1%29+%5Cend%7Bbmatrix%7D+%3D+%5Cbegin%7Bbmatrix%7D+C_%7B0%2C+0%7D+%26+%5Ccdots+%26+C_%7B0%2C+N_%7B2%7D-1%7D+%5C%5C++%5Cvdots+%26+%5Cddots++%26+%5Cvdots+%5C%5C++C_%7BN_%7B1%7D-1%2C+0%7D+%26+%5Ccdots+%26+C_%7BN_%7B1%7D-1%2C+N_%7B2%7D-1%7D+%5Cend%7Bbmatrix%7D+%5E%7BT%7D+%5Cbegin%7Bbmatrix%7D+x%280%2C+0%29+%26+%5Ccdots+%26+x%280%2C+N_%7B2%7D-1%29%5C%5C++%5Cvdots+%26+%5Cddots+%26+%5Cvdots+%5C%5C++x%28N_%7B1%7D-1%2C+0%29+%26+%5Ccdots+%26+x%28N_%7B1%7D-1%2C+N_%7B2%7D-1%29+%5Cend%7Bbmatrix%7D++%5Cbegin%7Bbmatrix%7D+C_%7B0%2C+0%7D+%26+%5Ccdots+%26+C_%7B0%2C+N_%7B1%7D-1%7D+%5C%5C++%5Cvdots+%26+%5Cddots++%26+%5Cvdots+%5C%5C++C_%7BN_%7B2%7D-1%2C+0%7D+%26+%5Ccdots+%26+C_%7BN_%7B2%7D-1%2C+N_%7B1%7D-1%7D+%5Cend%7Bbmatrix%7D

    equation?tex=%5Cbm%7Bx%7D 看作是原始图像,则

    equation?tex=%5Cbm%7BX%7D 为DCT的结果。

    在数字图像处理中,处理的图像基本上都为方阵,即

    equation?tex=N_%7B1%7D+%3D+N_%7B2%7D ,所以二维DCT可写为

    equation?tex=%5Cbm%7BX%7D+%3D+%5Cbm%7BC%7D%5E%7BT%7D+%5Cbm%7Bx%7D+%5Cbm%7BC%7D

    二维逆DCT变换为

    equation?tex=x%5Bn%5D+%3D+%5Csum_%7Bk_%7B1%7D%3D0%7D%5E%7BN-1%7D+%5Csum_%7Bk_%7B2%7D%3D0%7D%5E%7BN-1%7D+X%28k_%7B1%7D%2C+k_%7B2%7D%29+a_%7Bk_%7B1%7D%7D+a_%7Bk_%7B2%7D%7D%5Cmathrm%7Bcos%7D%5B+k_1+%5Cfrac%7B%5Cpi%7D%7BN%7D%28n%2B%5Cfrac%7B1%7D%7B2%7D%29%5D+%5Cmathrm%7Bcos%7D%5B+k_2+%5Cfrac%7B%5Cpi%7D%7BN%7D%28n%2B%5Cfrac%7B1%7D%7B2%7D%29+%5D

    3. 二维图像的DCT

    我们先总结一下,DCT没有虚部,本质是傅里叶变换(无损)

    equation?tex=%5CRightarrow 图像从空间域快速(没有虚部)的变换到了频率域。好像很好用的样子~

    先来试一下效果:对Lena进行DCT与iDCT,结果如图1所示。

    # 离散余弦变换,并获取其幅频谱

    img_dct = cv2.dct(np.float32(image))

    img_dct_log = 20 * np.log(abs(img_dct))

    # 逆离散余弦变换,变换图像回至空间域

    img_back = cv2.idct(img_dct)图1 Lena的DCT与iDCT

    从图1中可以看到,左上角亮度高,即Lena的主要能量集中在左上角;而且,从其逆变换可看出,DCT为无损变换。

    其次,为了确定哪种能量、有多少能量集中在左上角,我对图1中的DCT of Lena以128像素为步长进行了裁剪,

    # 裁剪DCT of Lena

    for i in range(image_dct_1.shape[0]):

    for j in range(image_dct_1.shape[1]):

    if i > (256+128) or j > (256+128):

    image_dct_1[i, j] = 0 # 裁剪的实质为像素置0

    if i > 256 or j > 256:

    image_dct_2[i, j] = 0 # 裁剪的实质为像素置0

    if i > 128 or j > 128:

    image_dct_3[i, j] = 0 # 裁剪的实质为像素置0

    然后再对其进行逆DCT变换,结果如图2所示。图2 压缩(裁剪)DCT后进行iDCT的结果

    随着压缩比例的增大,图片中的细节部分逐渐消失。在back Lena 1中还可以明显的看到sharp的边缘,而back Lena 3中,虽然主要的信息还在,但明显的高频信息丢失了。因此,DCT使图片的低频成分集中在左上角。(对,你可能猜到了,这在图像压缩领域用的很多~)

    展开全文
  • 该PPT介绍了图像变换领域中的两个基础的变换, 傅里叶变换和离散余弦变换. 涉及内容包括一维傅里叶变换, 二维离散傅里叶变换, 二维离散傅里叶变换的性质, 快速傅里叶变换, 傅里叶变换在图像处理中的应用; 离散余弦...
  • 离散余弦变换是图像处理中很是经常使用的算法,能够用于jpg图像压缩等领域。数学原理我就不扯了,网上一大堆。但介于网上实在没有关于python+opencv来实现DCT的好文章(至少木盏没有搜到过)。因而稍微写一个博文作一...

    离散余弦变换是图像处理中很是经常使用的算法,能够用于jpg图像压缩等领域。数学原理我就不扯了,网上一大堆。但介于网上实在没有关于python+opencv来实现DCT的好文章(至少木盏没有搜到过)。因而稍微写一个博文作一个总结,给后人便利。python

    要用到的模块是opencv,安装方法看另外一篇文章《opencv快速安装》算法

    python==3.6.5函数

    opencv==3.1.0.net

    scipy==1.1.03d

    numpy==1.14.3code

    本实验对模块版本要求不严格,上述版本为做者使用环境,仅供参考。用到的函数是cv2.dct(),初学者很容易犯如下错误:blog

    OpenCV Error: Assertion failed (type == CV_32FC1 || type == CV_64FC1) in cv::dct, file ..\..\..\modules\core\src\dxt.cpp, line 3603

    (117, 128, 3)

    Traceback (most recent call last):

    File "dct.py", line 15, in

    img_dct = cv2.dct(img1)         #\u8fdb\u884c\u79bb\u6563\u4f59\u5f26\u53d8\u6362

    cv2.error: ..\..\..\modules\core\src\dxt.cpp:3603: error: (-215) type == CV_32FC1 || type == CV_64FC1 in function cv::dctip

    由于调用这个函数很容易犯两个错:1. 把输入维度搞错;2. 数值精度错误ci

    先给一个较通用的脚本demo:get

    """

    author: muzhan

    """

    import cv2

    import numpy as np

    img = cv2.imread('t0.jpg')

    img = img[:, :, 0] # 获取rgb通道中的一个

    print(img.shape)

    img = np.float32(img) # 将数值精度调整为32位浮点型

    img_dct = cv2.dct(img) # 使用dct得到img的频域图像

    print(img_dct.shape)

    img_recor2 = cv2.idct(img_dct) # 使用反dct从频域图像恢复出原图像(有损)

    dct计算的矩阵是一个二维矩阵,因此直接把三维图像塞进来的话容易报错如上,因此咱们能够把rgb三个维度一个一个丢进来dct,最后合成一个三维矩阵保存成彩色图像。

    同时,须要注意的是,要用np.float32把矩阵转换成32位浮点精度,这才是dct能处理的精度。因此必不可少。

    cv2.idct是反离散余弦变换,是将图像恢复出来的算法。咱们能够用matplotlib可视化出来:

    f2997693586ba11ecc688d2dfbef5bf3.png

    展开全文
  • 离散余弦变换PPT

    2017-06-11 11:43:33
    离散余弦变换PPT
  • 离散余弦变换/Discrete cosine transform, 根据离散傅里叶变换的性质,实偶函数的傅里叶变换只含实的余弦项,而数字图像都是实数矩阵,因此构造了一种实数域的变换——离散余弦变换(DCT)。 离散余弦变换具有很强的...
  • 离散余弦变换原理

    2018-10-02 16:24:05
    很详细地讲解了离散余弦变换的原理及其应用,并讨论了它的优缺点
  • Matlab-灰度和彩色图像的离散余弦变换 问题 对输入的灰度和彩色图像进行分块,每一块图像为8*8像素的大小。对分块图像进行离散余弦变换,输出频谱图(DCT系数); 结果图像???? Matlab代码???? clc;clear; ...
  • 正交变换VS2017编译通过,可直接运行 包括 傅立叶变换 离散余弦变换 沃尔什变换
  • 离散余弦变换代码

    2012-09-27 11:06:53
    DCT 离散余弦变换
  • 离散余弦变换(DCT,Discrete Cosine Transform)的变换核为实数的余弦函数,因而DCT的计算速度要比变换核为复指数的DFT要快得多。离散余弦变换是仅次于K-L变换的次最佳正交变换,且有这样的性质:许多有关图像的...
  • 在本文中,我们提出了一种使用离散余弦变换(DCT)域定位水印的方法。 离散余弦变换后,我们选择较低的能量区域用于离散嵌入水印。 这是DCT在网络水印中的一种新颖尝试。 实验结果表明,提出的基于离散余弦变换的...
  • 文章目录离散余弦变换概念形式应用特征变换步骤 离散余弦变换概念 离散余弦变换(英语:discrete cosine transform, DCT)是与傅里叶变换相关的一种变换,类似于离散傅里叶变换,但是只使用实数。离散余弦变换相当于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,687
精华内容 674
关键字:

离散余弦变换