📄 colorlayout.java
字号:
StringBuffer b = new StringBuffer();
for (int i = 0; i < numYCoeff; i++) {
b.append(YCoeff[i] + " ");
}
// System.out.println("y: " + b.toString());
}
private void setCbCoeff(int[] CbCoeff) {
StringBuffer b = new StringBuffer();
for (int i = 0; i < numCCoeff; i++) {
b.append(CbCoeff[i] + " ");
}
// System.out.println("cb: " + b.toString());
}
private void setCrCoeff(int[] CrCoeff) {
StringBuffer b = new StringBuffer();
for (int i = 0; i < numCCoeff; i++) {
b.append(CrCoeff[i] + " ");
}
// System.out.println("cr: " + b.toString());
}
/**
* Nicht alle Werte sind laut MPEG-7 erlaubt ....
*/
private int getRightCoeffNumber(int num) {
int val = 0;
if (num <= 1)
val = 1;
else if (num <= 3)
val = 3;
else if (num <= 6)
val = 6;
else if (num <= 10)
val = 10;
else if (num <= 15)
val = 15;
else if (num <= 21)
val = 21;
else if (num <= 28)
val = 28;
else if (num > 28) val = 64;
return val;
}
/**
* Takes two ColorLayout DS and calculates similarity.
* @return -1.0 if c1 or c2 does not contain a valid ColorLayout DS
*/
public static double getSimilarity(Element c1, Element c2) {
double val = -1.0;
int YCoeff1, YCoeff2, CCoeff1, CCoeff2, YCoeff, CCoeff;
Vector v1 = getCoeffs(c1);
Vector v2 = getCoeffs(c2);
int[] y1, cb1, cr1, y2, cb2, cr2;
if (v1 != null && v2 != null) { // valid??
y1 = (int[]) v1.get(0);
cb1 = (int[]) v1.get(1);
cr1 = (int[]) v1.get(2);
y2 = (int[]) v2.get(0);
cb2 = (int[]) v2.get(1);
cr2 = (int[]) v2.get(2);
val = getSimilarity(y1, cb1, cr1, y2, cb2, cr2);
}
return val;
}
/**
* Takes two ColorLayout DS and calculates similarity.
* @return Vector of int[] (yCoeff at Vector.get(0), cbCoeff at Vector.get(1), crCoeff cbCoeff at Vector.get(2)) or null if not valid ColorLayoutDS
*/
public static Vector getCoeffs(Element descriptor) {
Vector vals = null;
int[] y,cb,cr;
int numY = 0;
int numC = 0;
Namespace mpeg7, xsi;
mpeg7 = Namespace.getNamespace("", "urn:mpeg:mpeg7:schema:2001");
xsi = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
boolean isValid = false;
if (descriptor.getChild("YDCCoeff", mpeg7) != null && descriptor.getChild("CbDCCoeff", mpeg7) != null && descriptor.getChild("CrDCCoeff", mpeg7) != null) {
isValid = true;
numC = 1;
numY = 1;
}
if (isValid) {
String str_y, str_cb, str_cr;
str_y = descriptor.getChildTextTrim("YDCCoeff", mpeg7) + " ";
str_cb = descriptor.getChildTextTrim("CbDCCoeff", mpeg7) + " ";
str_cr = descriptor.getChildTextTrim("CrDCCoeff", mpeg7) + " ";
java.util.List l = descriptor.getChildren();
for (Iterator i = l.iterator(); i.hasNext();) {
Element e = (Element) i.next();
if (e.getName().startsWith("YACCoeff")) {
numY = Integer.parseInt(e.getName().substring(8)) + 1;
str_y = str_y + e.getTextTrim();
} else if (e.getName().startsWith("CbACCoeff")) {
numC = Integer.parseInt(e.getName().substring(9)) + 1;
str_cb = str_cb + e.getTextTrim();
} else if (e.getName().startsWith("CrACCoeff")) {
numC = Integer.parseInt(e.getName().substring(9)) + 1;
str_cr = str_cr + e.getTextTrim();
}
}
// getting y-coeff:
y = new int[numY];
cb = new int[numC];
cr = new int[numC];
// debug("NumYCoeffs: " + numY + ", NumCCoeffs: " + numC);
StringTokenizer st = new StringTokenizer(str_y.trim(), " ");
int countSteps = 0;
while (st.hasMoreElements()) {
y[countSteps] = Integer.parseInt(st.nextToken());
countSteps++;
}
st = new StringTokenizer(str_cb.trim(), " ");
countSteps = 0;
while (st.hasMoreElements()) {
cb[countSteps] = Integer.parseInt(st.nextToken());
countSteps++;
}
st = new StringTokenizer(str_cr.trim(), " ");
countSteps = 0;
while (st.hasMoreElements()) {
cr[countSteps] = Integer.parseInt(st.nextToken());
countSteps++;
}
vals = new Vector();
vals.add(y);
vals.add(cb);
vals.add(cr);
}
return vals;
}
/**
* Takes two ColorLayout Coeff sets and calculates similarity.
* @return -1.0 if data is not valid.
*/
public static double getSimilarity(int[] YCoeff1, int[] CbCoeff1, int[] CrCoeff1, int[] YCoeff2, int[] CbCoeff2, int[] CrCoeff2) {
int numYCoeff1, numYCoeff2, CCoeff1, CCoeff2, YCoeff, CCoeff;
//Numbers of the Coefficients of two descriptor values.
numYCoeff1 = YCoeff1.length;
numYCoeff2 = YCoeff2.length;
CCoeff1 = CbCoeff1.length;
CCoeff2 = CbCoeff2.length;
//take the minimal Coeff-number
YCoeff = Math.min(numYCoeff1, numYCoeff2);
CCoeff = Math.min(CCoeff1, CCoeff2);
setWeightingValues();
int j;
int[] sum = new int[3];
int diff;
sum[0] = 0;
for (j = 0; j < YCoeff; j++) {
diff = (YCoeff1[j] - YCoeff2[j]);
sum[0] += (weightMatrix[0][j] * diff * diff);
}
sum[1] = 0;
for (j = 0; j < CCoeff; j++) {
diff = (CbCoeff1[j] - CbCoeff2[j]);
sum[1] += (weightMatrix[1][j] * diff * diff);
}
sum[2] = 0;
for (j = 0; j < CCoeff; j++) {
diff = (CrCoeff1[j] - CrCoeff2[j]);
sum[2] += (weightMatrix[2][j] * diff * diff);
}
//returns the distance between the two desciptor values
double val = Math.sqrt(sum[0] * 1.0) + Math.sqrt(sum[1] * 1.0) + Math.sqrt(sum[2] * 1.0);
return val;
}
private static void setWeightingValues() {
weightMatrix[0][0] = 2;
weightMatrix[0][1] = weightMatrix[0][2] = 2;
weightMatrix[1][0] = 2;
weightMatrix[1][1] = weightMatrix[1][2] = 1;
weightMatrix[2][0] = 4;
weightMatrix[2][1] = weightMatrix[2][2] = 2;
for (int i = 0; i < 3; i++) {
for (int j = 3; j < 64; j++)
weightMatrix[i][j] = 1;
}
}
private BufferedImage YCrCb2RGB(int[][] rgbSmallImage) {
BufferedImage br = new BufferedImage(8, 8, BufferedImage.TYPE_INT_RGB);
WritableRaster r = br.getRaster();
double rImage, gImage,bImage;
int pixel[] = new int[3];
for (int i = 0; i < 64; i++) {
rImage = ((rgbSmallImage[0][i] - 16.0) * 256.0) / 219.0;
gImage = ((rgbSmallImage[1][i] - 128.0) * 256.0) / 224.0;
bImage = ((rgbSmallImage[2][i] - 128.0) * 256.0) / 224.0;
pixel[0] = Math.max(0, (int) ((1.0 * rImage) + (1.402 * bImage) + 0.5)); //R
pixel[1] = Math.max(0, (int) ((1.0 * rImage) + (-0.34413 * gImage) + (-0.71414 * bImage) + 0.5)); //G
pixel[2] = Math.max(0, (int) ((1.0 * rImage) + (1.772 * gImage) + 0.5)); //B
r.setPixel(i % 8, i / 8, pixel);
}
return br;
}
public BufferedImage getColorLayoutImage() {
if (colorLayoutImage != null)
return colorLayoutImage;
else {
int[][] smallReImage = new int[3][64];
// inverse quantization and zig-zagging
smallReImage[0][0] = IquantYdc((YCoeff[0]));
smallReImage[1][0] = IquantCdc((CbCoeff[0]));
smallReImage[2][0] = IquantCdc((CrCoeff[0]));
for (int i = 1; i < 64; i++) {
smallReImage[0][(arrayZigZag[i])] = IquantYac((YCoeff[i]));
smallReImage[1][(arrayZigZag[i])] = IquantCac((CbCoeff[i]));
smallReImage[2][(arrayZigZag[i])] = IquantCac((CrCoeff[i]));
}
// inverse Discrete Cosine Transform
Idct(smallReImage[0]);
Idct(smallReImage[1]);
Idct(smallReImage[2]);
// YCrCb to RGB
colorLayoutImage = YCrCb2RGB(smallReImage);
return colorLayoutImage;
}
}
private void Idct(int[] iShapes) {
int u, v ,k;
double s;
double[] dct = new double[64];
//calculation of the cos-values of the second sum
for (u = 0; u < 8; u++) {
for (v = 0; v < 8; v++) {
s = 0.0;
for (k = 0; k < 8; k++)
s += arrayCosin[k][v] * iShapes[8 * u + k];
dct[8 * u + v] = s;
}
}
for (v = 0; v < 8; v++) {
for (u = 0; u < 8; u++) {
s = 0.0;
for (k = 0; k < 8; k++)
s += arrayCosin[k][u] * dct[8 * k + v];
iShapes[8 * u + v] = (int) Math.floor(s + 0.499999);
}
}
}
private int IquantYdc(int i) {
int j;
i = i << 1;
if (i > 112)
j = 194 + (i - 112) * 4;
else if (i > 96)
j = 162 + (i - 96) * 2;
else if (i > 32)
j = 96 + (i - 32);
else if (i > 16)
j = 66 + (i - 16) * 2;
else
j = i * 4;
return j * 8;
}
private int IquantCdc(int i) {
int j;
if (i > 63)
j = 192;
else if (i > 56)
j = 162 + (i - 56) * 4;
else if (i > 48)
j = 145 + (i - 48) * 2;
else if (i > 16)
j = 112 + (i - 16);
else if (i > 8)
j = 97 + (i - 8) * 2;
else if (i > 0)
j = 66 + i * 4;
else
j = 64;
return j * 8;
}
private int IquantYac(int i) {
int j;
i = i << 3;
i -= 128;
if (i > 128)
i = 128;
if (i < -128)
i = -128;
if ((Math.abs(i)) > 96)
j = (Math.abs(i)) * 4 - 256;
else if ((Math.abs(i)) > 64)
j = (Math.abs(i)) * 2 - 64;
else
j = Math.abs(i);
j = (i < 0)? -j:j;
return j * 2;
}
private int IquantCac(int i) {
int j;
i = i << 3;
i -= 128;
if (i > 128)
i = 128;
if (i < -128)
i = -128;
if ((Math.abs(i)) > 96)
j = (Math.abs(i) * 4 - 256);
else if ((Math.abs(i)) > 64)
j = (Math.abs(i) * 2 - 64);
else
j = Math.abs(i);
j = (i < 0)? -j:j;
return j;
}
public int getNumberOfCCoeff() {
return numCCoeff;
}
public void setNumberOfCCoeff(int numberOfCCoeff) {
this.numCCoeff = numberOfCCoeff;
}
public int getNumberOfYCoeff() {
return numYCoeff;
}
public void setNumberOfYCoeff(int numberOfYCoeff) {
this.numYCoeff = numberOfYCoeff;
}
// private static void debug(String message) {
// if (AnnotationFrame.DEBUG) System.out.println("[at.lux.fotoannotation.ColorLayout] " + message);
// }
/*
EXAMPLE:
========
<VisualDescriptor xsi:type="ColorLayoutType">
<YDCCoeff>12</YDCCoeff>
<CbDCCoeff>2</CbDCCoeff>
<CrDCCoeff>2</CrDCCoeff>
<YACCoeff5>1 1 1 1 1</YACCoeff5>
<CbACCoeff2>2 2</CbACCoeff2>
<CrACCoeff2>2 2</CrACCoeff2>
</VisualDescriptor>
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -