注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

阿弥陀佛

街树飘影未见尘 潭月潜水了无声 般若观照心空静...

 
 
 

日志

 
 
关于我

一直从事气象预报、服务建模实践应用。 注重气象物理场、实况场、地理信息、本体知识库、分布式气象内容管理系统建立。 对Barnes客观分析, 小波,计算神经网络、信任传播、贝叶斯推理、专家系统、网络本体语言有一定体会。 一直使用Java、Delphi、Prolog、SQL编程。

网易考拉推荐

DCT.java--工作采用的算法  

2013-02-21 18:52:09|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dct;

import wave2k.Calculater;

/**
 * 离散余弦变换
 * @author 何险峰
 * 修改自: http://code.google.com/p/dct-watermark/source/browse/trunk/src/net/watermark/DCT.java?r=2
 * 2013-02-21
 */
public class DCT {
        static int N;
    static float MAX,MIN,MID;
    public double[][] C;
    public double[][] Ct;
    public DCT(){
        this(8);
    }

    public DCT(int n) {
        N=n;
        C = new double[N][N];
        Ct = new double[N][N];
        int i,j;
        final double pi = Math.atan(1.0) * 4.0;
        for (j = 0; j < N; j++) {
            this.C[0][j] = 1.0 / Math.sqrt(N);
            this.Ct[j][0] = this.C[0][j];
        }
        for (i = 1; i < N; i++) {
            for (j = 0; j < N; j++) {
                this.C[i][j] = Math.sqrt(2.0 / N) * Math.cos(pi * (2 * j + 1) * i / (2.0 * N));
                this.Ct[j][i] = this.C[i][j];
            }
        }
    }

    final public float[][] dct(final float[][] input) {
        final double[][] temp = new double[N][N];
        final float[][] output = new float[N][N];
        double temp1;
        int i, j, k;
        MAX = Calculater.max(input);
        MIN = Calculater.min(input);
        MID = (MAX+MIN)/2.0f;
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                temp[i][j] = 0.0;
                for (k = 0; k < N; k++) {
                    temp[i][j] += (input[i][k] - MID) * this.Ct[k][j];
                }
            }
        }

        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                temp1 = 0.0;
                for (k = 0; k < N; k++) {
                    temp1 += this.C[i][k] * temp[k][j];
                }
                output[i][j] = (float) temp1;
            }
        }
        return output;
    }

    final public float[][] idct(final float[][] input) {
        final double[][] temp = new double[N][N];
        float[][] output = new float[N][N];
        double temp1;
        int i, j, k;
        MID = (MAX+MIN)/2.0f;
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                temp[i][j] = 0.0;
                for (k = 0; k < N; k++) {
                    temp[i][j] += input[i][k] * this.C[k][j];
                }
            }
        }

        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                temp1 = 0.0;
                for (k = 0; k < N; k++) {
                    temp1 += this.Ct[i][k] * temp[k][j];
                }
                temp1 += MID;
                if (temp1 < 0) {
                    output[i][j] = 0;
                } else if (temp1 > MAX) {
                    output[i][j] = MAX;
                } else {
                    output[i][j] = (float) temp1;
                }
            }
        }
        return output;
    }
   
    public static void testDCT() {
        int n = 32,lev=3;
        float[][] x = new float[n][n];
        int i;
        DCT dct = new DCT(n);

        // Makes a fancy cubic signal
        for (i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                x[i][j] = 2 + i + j + 0.4f * i * j - 0.02f * i * j * j;
            }
        }

        // Prints original sigal x
        Calculater.prn(String.format("Original signal(%d x %d):\n",n,n), x);

        // Do the forward 9/7 transform
        float[][] c = dct.dct(x);
        Calculater.prn("dct coefficients:\n", c);

        float[][] p = Calculater.compress(c, lev);
        //float[][] p = w2d.fwtBound(x, lev);
        Calculater.prn("dct pressed coefficients:\n", p);

        /*
         // Do the inverse 9/7 transform
         float[][] y = w2d.ifwt2(c, lev);
         Calculater.prn("Reconstructed signal:\n", y);
         **/

        float[][] u = Calculater.uncompress(p, lev);
        float[][] y = dct.idct(u);
        Calculater.prn("Reconstructed signal:\n", y);

        //float[][] y = w2d.ifwtBound(p);
        //Calculater.prn("Reconstructed signal:\n", y);

        //PSNR
        double psnr = Calculater.PSNR(x, y);
        System.out.println("PSNR = " + psnr);
    }

    public static void main(String[] args) {
        testDCT();
    }
}
=================================================================
ant -f D:\\my\\java\\MathArithmetic -Djavac.includes=dct/DCT.java -Drun.class=dct.DCT run-single
init:
Deleting: D:\my\java\MathArithmetic\build\built-jar.properties
deps-jar:
Updating property file: D:\my\java\MathArithmetic\build\built-jar.properties
Compiling 1 source file to D:\my\java\MathArithmetic\build\classes
警告: [options] 未与 -source 1.5 一起设置引导类路径
1 个警告
compile-single:
run-single:
Original signal:
    2     3     4     5     6     7     8     9
    3     4     6     7     8    10    11    12
    4     6     7     9    11    12    13    15
    5     7     9    11    13    15    16    17
    6     9    11    13    15    17    19    20
    7    10    13    15    17    20    21    23
    8    11    14    17    20    22    24    26
    9    13    16    19    22    25    27    29

dct coefficients:
 -923   -35    -2    -4    -1    -1    -0    -0
  -37    11     2     1     0     0     0     0
   -0     0    -0    -0     0    -0     0    -0
   -4     1     0     0     0     0     0     0
   -0     0    -0    -0     0    -0     0    -0
   -1     0     0     0     0     0     0     0
    0     0     0    -0    -0    -0    -0    -0
   -0     0     0     0     0     0     0     0

dct pressed coefficients:
 -923   -35
  -37    11

Reconstructed signal:
    3     3     4     6     7     8     9    10
    3     4     5     6     8     9    10    11
    4     5     6     8    10    12    13    14
    6     7     8    10    12    15    16    17
    7     8    10    13    15    18    20    21
    9    10    12    15    18    21    23    24
   10    11    14    17    20    23    25    26
   11    12    14    17    21    24    26    28

PSNR = 49.81856067504111
成功构建 (总时间: 0 秒)
===========================================================================
Original signal(16  x 16):
    2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17
    3     4     6     7     8    10    11    12    13    14    15    16    17    18    19    20
    4     6     7     9    11    12    13    15    16    17    18    19    20    21    21    22
    5     7     9    11    13    15    16    17    19    20    21    22    23    23    24    25
    6     9    11    13    15    17    19    20    22    23    24    25    26    26    27    27
    7    10    13    15    17    20    21    23    25    26    27    28    29    29    29    30
    8    11    14    17    20    22    24    26    28    29    30    31    32    32    32    32
    9    13    16    19    22    25    27    29    30    32    33    34    34    35    35    35
   10    14    18    21    24    27    29    32    33    35    36    37    37    38    37    37
   11    15    19    23    27    30    32    34    36    38    39    40    40    40    40    40
   12    17    21    25    29    32    35    37    39    41    42    43    43    43    43    42
   13    18    23    27    31    35    37    40    42    44    45    46    46    46    45    45
   14    20    25    29    33    37    40    43    45    47    48    49    49    49    48    47
   15    21    26    31    36    40    43    46    48    50    51    52    52    52    51    50
   16    22    28    33    38    42    46    48    51    53    54    55    55    54    54    52
   17    24    30    35    40    45    48    51    54    56    57    58    58    57    56    55

dct coefficients:
-523842  -128   -44   -14   -11    -5    -5    -2    -2    -1    -1    -1    -1    -0    -0    -0
 -179    34    27     4     7     1     3     1     1     0     1     0     0     0     0     0
    0    -0    -0     0     0     0    -0    -0     0    -0     0     0     0    -0    -0     0
  -20     4     3     0     1     0     0     0     0     0     0     0     0     0     0     0
    0    -0    -0     0    -0     0    -0     0     0    -0     0    -0     0     0     0    -0
   -7     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0
   -0     0     0    -0     0    -0     0    -0    -0     0     0     0    -0     0    -0     0
   -3     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0
   -0     0     0    -0    -0    -0    -0    -0     0     0     0    -0     0    -0    -0     0
   -2     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
   -0    -0    -0     0    -0    -0    -0    -0     0     0     0    -0     0     0     0    -0
   -1     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -0
    0    -0    -0    -0    -0     0     0     0     0     0    -0    -0    -0    -0    -0     0
   -1     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -0
   -0    -0    -0    -0    -0    -0    -0     0     0     0     0     0     0     0     0     0
   -0     0     0     0     0     0     0     0     0     0     0     0    -0     0     0     0

dct pressed coefficients:
-523842  -128
 -179    34

Reconstructed signal:
    5     5     6     7     8     9    10    11    13    14    15    17    18    18    19    19
    5     6     6     7     8     9    11    12    13    15    16    17    18    19    20    20
    6     7     7     8     9    10    12    13    15    16    17    19    20    21    21    21
    8     8     8     9    10    12    13    15    16    18    19    21    22    23    23    24
    9    10    10    11    12    14    15    17    19    20    22    23    25    25    26    26
   11    11    12    13    14    16    18    19    21    23    25    26    28    29    29    30
   13    14    14    15    17    19    20    22    24    26    28    30    31    32    33    33
   15    16    17    18    19    21    23    25    27    29    31    33    35    36    37    37
   18    18    19    20    22    24    26    28    31    33    35    37    39    40    41    41
   20    20    21    23    25    27    29    31    34    36    38    40    42    44    44    45
   22    23    24    25    27    29    31    34    37    39    42    44    46    47    48    49
   24    25    26    27    29    31    34    37    39    42    45    47    49    50    51    52
   26    26    27    29    31    33    36    39    42    44    47    49    51    53    54    55
   27    27    29    30    32    35    38    40    43    46    49    51    53    55    56    57
   28    28    30    31    33    36    39    42    45    48    50    53    55    57    58    58
   28    29    30    32    34    36    39    42    45    48    51    53    56    57    58    59

PSNR = 36.71736988278973
成功构建 (总时间: 0 秒)
==================================================================================
对 32 x 32 矩阵效果陡然下降,用4x4的系数,PSNR = 21.04700961317274;用8x8的系数,PSNR = 21.283492034483782;
故使用DCT,适宜将图形块设置为8x8, 16x16的大小,否则压缩将会产生严重失真。
  评论这张
 
阅读(1081)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017