java版本phash算法優化

phash

本文的參考實現是:https://blog.csdn.net/sunhuaqiang1/article/details/70232679

原有代碼中有一個四重for循環:

private double[][] applyDCT(double[][] f) {
        int N = size;

        double[][] F = new double[N][N];
        for (int u=0;u<N;u++) {
            for (int v=0;v<N;v++) {
                double sum = 0.0;
                for (int i=0;i<N;i++) {
                    for (int j=0;j<N;j++) {
                        sum+=Math.cos(((2*i+1)/(2.0*N))*u*Math.PI)*Math.cos(((2*j+1)/(2.0*N))*v*Math.PI)*(f[i][j]);
                    }
                }
                sum*=((c[u]*c[v])/4.0);
                F[u][v] = sum;
            }
        }
        return F;
    }

本文中對其做了一下改進,採用CPU對於矩陣乘法的優化進行加速,代碼如下,效果調高20%左右。

  private SimpleMatrix getMatrixA(int NN){
        //獲取備用矩陣 A
        SimpleMatrix a_array = new SimpleMatrix(NN, NN);
        for(int i = 0; i< NN; i++){
            for(int j = 0; j < NN; j++){
                a_array.set(i,j,Math.cos(((2*j+1)/(2.0*NN))*i*Math.PI));
            }
        }
        return a_array;
    }

    private double[][] applyDCT_1(double[][] f) {
        int N = size;
        SimpleMatrix f_array = new SimpleMatrix(f);
        SimpleMatrix a_array = getMatrixA(N);
        SimpleMatrix a_array_T = a_array.transpose();

        double[][] F = new double[N][N];
        for (int u=0;u<N;u++) {
            for (int v = 0; v < N; v++) {
                SimpleMatrix a_row_u = a_array.rows(u,u+1);
                SimpleMatrix a_col_v = a_array_T.cols(v,v+1);
                SimpleMatrix mult_res = a_col_v.mult(a_row_u);
                double sum = mult_res.elementMult(f_array).elementSum();
                sum*=((c[u]*c[v])/4.0);
                F[v][u] = sum;//轉置關係
            }
        }

        return F;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章