📄 scalablecolor.java
字号:
int count = 0;
for (int k = 0; k < _h_value; k++) {
for (int l = 0; l < _s_value; l++) {
for (int m = 0; m < _v_value; m++) {
tmpHist[count] = _wholeHist[k][l][m];
count++;
}
}
}
QuantizeHistogram(tmpHist);
haarTransformedHistogram = HaarTransform(tmpHist);
// System.out.println("NumberOfCoefficients: " + NumberOfCoefficients );
// for (int i = 0; i < NumberOfCoefficients; i++) {
// System.out.println(haarTransformedHistogram[i] + " <- " + tmpHist[i]);
// }
// _wholeHist = null;
// _desHistograms = null;
}
public void recalc() {
if (img!=null) {
int[] tmpHist = new int[_h_value * _v_value * _s_value];
int count = 0;
for (int k = 0; k < _h_value; k++) {
for (int l = 0; l < _s_value; l++) {
for (int m = 0; m < _v_value; m++) {
tmpHist[count] = _wholeHist[k][l][m];
count++;
}
}
}
QuantizeHistogram(tmpHist);
haarTransformedHistogram = HaarTransform(tmpHist);
}
}
void _RGB2HSV(int R, int G, int B, int[] hsv) {
int max,min;
float hue = 0f;
max = Math.max(R, G); //calculation of max(R,G,B)
max = Math.max(max, B);
min = Math.min(R, G); //calculation of min(R,G,B)
min = Math.min(min, B);
if (max == 0)
hsv[1] = 0;
else
hsv[1] = (int) (((max - min) / (float) max) * 255.0); //Saturation range: (0..255)
if (max == min)
hue = 0; // (max - min) = 0
else {
if ((float) R == max)
hue = ((G - B) / (float) (max - min));
else if ((float) G == max)
hue = (2 + (B - R) / (float) (max - min));
else if ((float) B == max)
hue = (4 + (R - G) / (float) (max - min));
hue *= 60;
if (hue < 0.0)
hue += 360;
}
hsv[0] = (int) (hue); // Hue range: (0..359)
hsv[2] = max; // Value range:(0..255)
}
void _Quant(int H, int S, int V, int m, int n) {
int i, j, k;
i = (int) (H / _quant_h); //H in _quant_h levels
j = (int) (S / _quant_s); //S in _quant_s levels
k = (int) (V / _quant_v); //V in _quant_v levels
// _desHistograms[m][n][i][j][k]++;
_wholeHist[i][j][k]++;
}
public int getSimilarity(ScalableColor secHist) {
int diffsum = 0;
int diff = 0;
int i,j,k;
// similarity nur wenn #BitPlanes und #Coeff gleich ist:
if (secHist.getNumberOfBitplanesDiscarded() == getNumberOfBitplanesDiscarded() &&
secHist.getNumberOfCoefficients() == getNumberOfCoefficients() &&
secHist.getHaarTransformedHistogram() != null &&
haarTransformedHistogram != null) {
int[] secHaarHist = secHist.getHaarTransformedHistogram();
for (int l = 0; l < secHaarHist.length; l++) {
diff = Math.abs(secHaarHist[l] - haarTransformedHistogram[l]);
diffsum += diff;
}
} else {
if (haarTransformedHistogram != null && secHist.getHaarTransformedHistogram() != null)
System.out.println("NumberOfBitplanesDiscarded and/or NumberOfCoefficients not matching");
else
System.out.println("Damn it! One of the histograms is NULL");
}
// Summe der Differenzen als Mass der 膆nlichkeit
return diffsum;
}
// public int getSimilarity(ScalableColor secHist, int xblock, int yblock) {
// int diffsum = 0;
// int diff = 0;
// int i,j,k;
//
// //the desired block
// int x_block;
// int y_block;
//
// if (xblock > _xNumOfBlocks)
// x_block = 0;
// else
// x_block = xblock - 1;
//
// if (yblock > _yNumOfBlocks)
// y_block = 0;
// else
// y_block = yblock - 1;
//
// //quantisation - values and number of blocks have to be similar
// if ((_h_value == secHist._h_value) && (_s_value == secHist._s_value) && (_v_value == secHist._v_value) &&
// (_xNumOfBlocks == secHist._xNumOfBlocks) && (_yNumOfBlocks == secHist._yNumOfBlocks))
// for (i = 0; i < _h_value; i++) {
// for (j = 0; j < _s_value; j++) {
// for (k = 0; k < _v_value; k++) {
// diff = _desHistograms[x_block][y_block][i][j][k] - secHist.getBlockHistogramValue(x_block, y_block, i, j, k);
// if (diff < 0)
// diffsum += -(diff);
// else
// diffsum += diff;
// }
// }
// }
// return diffsum;
// }
// public int getHistogramValue(int i, int j, int k) {
// return _wholeHist[i][j][k];
// }
// public int getBlockHistogramValue(int blockX, int blockY, int i, int j, int k) {
// return _desHistograms[blockX][blockY][i][j][k];
// }
// von XM ... :)
void histo_3d_hirarch_5(int[][] tabelle, int tablae, int[] histogram,
int h_size, int s_size, int v_size, int hist_nr) {
int i,j,sum,dif,x1,y1,x2,y2;
int[][] matrix = new int[16][16];
int iprint = 0;
for (i = 0; i < h_size * s_size * v_size; ++i)
matrix[i % (h_size)][i / (h_size)] = histogram[i];
for (i = 0; i < tablae; ++i) {
y1 = tabelle[0][i];
x1 = tabelle[1][i];
y2 = tabelle[2][i];
x2 = tabelle[3][i];
sum = matrix[y1][x1] + matrix[y2][x2];
dif = matrix[y2][x2] - matrix[y1][x1];
if (iprint == 1)
matrix[y1][x1] = sum;
matrix[y2][x2] = dif;
}
for (i = 0; i < h_size * s_size * v_size; ++i)
histogram[i] = matrix[i % (h_size)][i / (h_size)];
}
// von XM ... :)
private void histo_3d_hirarch_16_5(int[][] tabelle, int tablae, int[] histogram,
int h_size, int s_size, int v_size, int hist_nr) {
int i,j,sum,dif,x1,y1,x2,y2;
int[][] matrix = new int[16][16];
int iprint = 0;
for (i = 0; i < h_size * s_size * v_size; ++i)
matrix[i % (h_size)][i / (h_size)] = histogram[i];
for (i = 0; i < tablae; ++i) {
if (tabelle[4][i] <= 8) continue;
y1 = tabelle[0][i];
x1 = tabelle[1][i];
y2 = tabelle[2][i];
x2 = tabelle[3][i];
sum = matrix[y1][x1] + matrix[y2][x2];
dif = matrix[y2][x2] - matrix[y1][x1];
if (iprint == 1) {
matrix[y1][x1] = sum;
}
matrix[y2][x2] = dif;
}
for (i = 0; i < h_size * s_size * v_size; ++i)
histogram[i] = matrix[i % (h_size)][i / (h_size)];
}
int[] QuantizeHistogram(int[] aHist) {
int factor = 15, iwert = 0;
double wert,potenz = 0.4;
double arg,maxwert;
maxwert = (double) 40 * (double) 2047 / (double) 100;
for (int i = 0; i < NumberOfCoefficients; i++) {
wert = (double) (aHist[i]);
if (wert > maxwert) iwert = (int) factor;
if (wert <= maxwert) {
arg = wert / maxwert;
wert = (float) factor * Math.pow(arg, potenz);
iwert = (int) (wert + 0.5);
}
if (iwert > factor) iwert = factor;
aHist[i] = iwert;
}
return aHist;
}
// kopiert von XM ... :)
private int[] HaarTransform(int[] aHist) {
int index,tablae = 255,iwert,hist_nr;
int[] histogram_in,histogram_out;
int RecHistogram = 0;
int h_size,s_size,v_size,max_color = 256;
int[][] tabelle = {
{
0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10,
12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2,
4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10,
12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2,
4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10,
12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6,
8, 10, 12, 14, 0, 4, 8, 12, 0, 4, 8, 12, 0, 4, 8, 12, 0, 4, 8, 12, 0, 4,
8, 12, 0, 4, 8, 12, 0, 4, 8, 12, 0, 8, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8,
8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13,
13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0,
0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6,
6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10,
12, 12, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0,
0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10,
10, 10, 10, 10, 0, 0, 0, 0, 2, 2, 2, 2, 8, 8, 8, 8, 10, 10, 10, 10, 0, 0,
0, 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0
},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -