颜色矩是一种简单而有效的颜色特征,是由Stricker和Oreng提出的,这种方法的数学基础是图像中的任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(Variance)和三阶矩(Skewness)就足以表达图像的颜色分布,与颜色直方图相比,该方法的另一个好处是无须对特征进行量化。
设p(i,j)图像的像素值,N为像素数,则:
Mean=(sum(p(I,j)))/N
Variance=sqrt(sum(p(I,j )-mean)^2/N)
Skewness= Variance= (sum(p(I,j )-mean)^3/N)^1/3
图像的颜色矩一共有九个分量,每个颜色通道均有三个低阶矩。颜色矩仅仅使用少数几个矩,从而导致过多的虚警,因此颜色矩常和其他特征结合使用。
public void setColorJu(){
int i , j;
int k;
double sumh , sums , sumv;
this.colorJuH[1] = 0.0;
this.colorJuS[1] = 0.0;
this.colorJuV[1] = 0.0;
// System.out.println(this.width * this.height);
for( k = 1 ; k <= 3 ; k++ ){
sumh = 0.0;
sums = 0.0;
sumv = 0.0;
for( i = 0 ; i < this.width ; i++ ){
for( j = 0 ; j < this.height ; j++ ){
// double temp = this.points[i][j].getHHSV();
// temp -= this.colorJuH[1];
// temp = Math.pow(temp, k);
// sumh += temp;
sumh += Math.pow( ( this.points[i][j].getHHSV() - this.colorJuH[1] ) , k );
sums += Math.pow( ( this.points[i][j].getSHSV() - this.colorJuS[1] ) , k );
sumv += Math.pow( ( this.points[i][j].getVHSV() - this.colorJuV[1] ) , k );
}
}
// System.out.println(k+":");
this.colorJuH[k] = sumh / ( this.width * this.height );
if( k == 2 )
this.colorJuH[k] = Math.sqrt(this.colorJuH[k]);
if( k == 3 )
this.colorJuH[k] = Math.cbrt(this.colorJuH[k]);
// System.out.println(colorJuH[k]);
this.colorJuS[k] = sums / ( this.width * this.height );
if( k == 2 )
this.colorJuS[k] = Math.sqrt(this.colorJuH[k]);
if( k == 3 )
this.colorJuS[k] = Math.cbrt(this.colorJuH[k]);
this.colorJuV[k] = sumv / ( this.width * this.height );
if( k == 2 )
this.colorJuV[k] = Math.sqrt(this.colorJuH[k]);
if( k == 3 )
this.colorJuV[k] = Math.cbrt(this.colorJuH[k]);
// System.out.println("sumh"+sumh+","+"sums"+sums+","+"sumv"+sumv);
}
}