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 !
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 !