Wednesday, February 27, 2013

Searching in indexed image by histogram

The histogram calculated previously are extracted in file with the format following
126094.jpg;0.002390544;0.0012207029;0.010274278;0.00600177;8.9518283E-4....

The code source to calculate the distance between the two image is


private static float distanceL2(float d1[], float d2[]) {
        float computation = 0.0f;
        for (int i = 0; i < ((d1.length < d2.length) ? d1.length : d2.length); i++) {
            float diff = d1[i] - d2[i];
            computation += diff * diff;
        }
        return (float) Math.sqrt(computation);
    }

The code source to search on the image list and to sort by k number of the more near image:

public static void main(String[] args) {
        String listeImagesDB = args[0];
        String descripteurs = args[1];
        String imagerequete = args[2];
        int nombreResultat = Integer.parseInt(args[3]);
        String resultFile = "";
        if (args.length > 4) {
            resultFile = args[4];
        }

        //Load the descriptors and search for requested image : imagerequete
        File databaseFile = new File(descripteurs);
        FileReader datareader = null;
        float[] imageRequete = null;
     
        try {
            datareader = new FileReader(databaseFile);

            BufferedReader databuffer = new BufferedReader(datareader);
            String s;
            while ((s = databuffer.readLine()) != null) {
                String valuesStrList[] = s.split(";");
                float[] values = new float[valuesStrList.length - 1];
                for (int i = 1; i < valuesStrList.length; i++) {
                    values[i - 1] = Float.parseFloat(valuesStrList[i]);
                }
                if (valuesStrList[0].equals(imagerequete)) {
                    imageRequete = values;
                    break;
                }
             

            }
            datareader.close();
        } catch (Exception ex) {
            Logger.getLogger(QBE.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }

        //Search best results
        //saved result
        String[] resultImage = new String[nombreResultat];
        float[] resultDistance = new float[nombreResultat];
        int maxIndex = 0;
        //Iterator it = savedImgList.keySet().iterator();
        try {
            datareader = new FileReader(databaseFile);


            BufferedReader databuffer = new BufferedReader(datareader);
            String s;

            while ((s = databuffer.readLine()) != null) {
                String valuesStrList[] = s.split(";");
                float[] values = new float[valuesStrList.length - 1];
                for (int i = 1; i < valuesStrList.length; i++) {
                    values[i - 1] = Float.parseFloat(valuesStrList[i]);
                }

                String filename = valuesStrList[0];
                float imgvalues[] = values;
                float distance = distanceL2(imageRequete, imgvalues);

                int keyBefore = -1;
                for (int i = 0; i < nombreResultat; i++) {
                    String filenameResult = resultImage[i];
                    if (filenameResult == null || filenameResult.isEmpty()) {
                        break; //empty list
                    }
                    float distanRes = resultDistance[i];
                    if (distance < distanRes) {
                        keyBefore = i;
                        break; //fisrt occurence trouver
                    }

                }

                if (keyBefore == -1) {
                    if (maxIndex < nombreResultat) {
                        resultImage[maxIndex] = filename;
                        resultDistance[maxIndex] = distance;
                        maxIndex++;
                    }
                } else {

                    for (int i = nombreResultat - 1; i > keyBefore; i--) {
                        resultImage[i] = resultImage[i - 1];
                        resultDistance[i] = resultDistance[i - 1];
                        if (resultImage[i] == null || resultImage[i].isEmpty()) {
                            maxIndex = i; //retrieve empty index
                        }
                    }

                    resultImage[keyBefore] = filename;
                    resultDistance[keyBefore] = distance;
                }


            }
        } catch (IOException ex) {
            Logger.getLogger(QBE.class.getName()).log(Level.SEVERE, null, ex);
        }

        //Produce Result
        File dbFile = new File(listeImagesDB);

        String imagePath = dbFile.getParent() + File.separatorChar + "images" + File.separatorChar;

        StringBuffer buff = new StringBuffer();
        buff.append("<html><body>");
        for (int i = 0; i < nombreResultat; i++) {
            buff.append("<img src=\"" + imagePath + resultImage[i] + "\" alt=\"" + resultDistance[i] + "\"/>");
            buff.append(" Distance="+resultDistance[i]+" ");
        }
        buff.append("</body></html>");
        if (resultFile.isEmpty()) {
            System.out.println(buff.toString());
        } else {
            try {
                FileWriter indexedDB = new FileWriter(resultFile, false);
                indexedDB.write(buff.toString());
                indexedDB.close();
            } catch (IOException ex) {
                Logger.getLogger(QBE.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

After indexed 10000 images following the previous code sample based on histogram , I have tested some image request with the previous algorithm.
Here I show some results:
The requested image is the first on the left and top of each image. Nice result !






No comments:

Post a Comment