⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorlayout.java

📁 图像检索的代码b
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        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 + -