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