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;
}