Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.62 KB | None | 0 0
  1. package com.prgguru.webapp;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.FilenameFilter;
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.Collections;
  12. import java.util.Comparator;
  13.  
  14. import net.semanticmetadata.lire.DocumentBuilder;
  15. import net.semanticmetadata.lire.DocumentBuilderFactory;
  16. import net.semanticmetadata.lire.imageanalysis.FCTH;
  17.  
  18. import org.apache.commons.codec.binary.Base64;
  19. import org.apache.lucene.document.Document;
  20. import org.apache.lucene.document.Field;
  21. import org.apache.lucene.util.BytesRef;
  22.  
  23. public class ManipulateImage {
  24.  
  25. static class ImageInImageDatabase {
  26.  
  27. public String fileName;
  28. public double[] fcthFeatureVector;
  29. public double distanceToSearchImage;
  30. }
  31.  
  32. static class ImageComparator implements Comparator<ImageInImageDatabase> {
  33.  
  34. @Override
  35. public int compare(ImageInImageDatabase object1,
  36. ImageInImageDatabase object2) {
  37. if (object1.distanceToSearchImage < object2.distanceToSearchImage) {
  38. return -1;
  39. } else if (object1.distanceToSearchImage > object2.distanceToSearchImage) {
  40. return 1;
  41. } else {
  42. return 0;
  43. }
  44. }
  45. }
  46.  
  47. public static double[] getFCTHFeatureVector(String fullFilePath)
  48. throws FileNotFoundException, IOException {
  49.  
  50. DocumentBuilder builder = DocumentBuilderFactory
  51. .getFCTHDocumentBuilder();
  52. FileInputStream istream = new FileInputStream(fullFilePath);
  53. Document doc = builder.createDocument(istream, fullFilePath);
  54. istream.close();
  55. FCTH fcthDescriptor = new FCTH();
  56. String fieldname = ((Field) doc.getFields().get(0)).name();
  57. BytesRef br = doc.getBinaryValue(fieldname);
  58. fcthDescriptor.setByteArrayRepresentation(br.bytes, br.offset,
  59. br.length);
  60. return fcthDescriptor.getDoubleHistogram();
  61.  
  62. }
  63.  
  64. public static double calculateEuclideanDistance(double[] vector1,
  65. double[] vector2) {
  66.  
  67. double innerSum = 0.0;
  68. for (int i = 0; i < vector1.length; i++) {
  69. innerSum += Math.pow(vector1[i] - vector2[i], 2.0);
  70. }
  71.  
  72. return Math.sqrt(innerSum);
  73.  
  74. }
  75.  
  76. // Decode String into an Image
  77. public static String convertStringtoImage(String encodedImageStr,
  78. String fullPath, String filename) {
  79. String resultName = "";
  80. try {
  81. // Decode String using Base64 Class
  82. byte[] imageByteArray = Base64.decodeBase64(encodedImageStr);
  83.  
  84. // Write Image into File system - Make sure you update the path
  85. FileOutputStream imageOutFile = new FileOutputStream(fullPath);
  86. imageOutFile.write(imageByteArray);
  87.  
  88. imageOutFile.close();
  89.  
  90. String[] args = new String[2];
  91. // path of source
  92. args[0] = "src/sourceimagesfolder/";
  93. // photo taken
  94. //args[1] = fullPath;
  95. args[1] = "WebContent/UploadedImages/example1.jpg";
  96. if (args.length != 2) {
  97.  
  98. System.out
  99. .println("This application requires two parameters: "
  100. + "the name of a directory containing JPEG images, and a file name of a JPEG image.");
  101. return "";
  102.  
  103. }
  104.  
  105. String imageDatabaseDirectoryName = args[0];
  106. String searchImageFilePath = args[1];
  107. double[] searchImageFeatureVector = getFCTHFeatureVector(searchImageFilePath);
  108.  
  109. System.out.println("Search image FCTH vector: "
  110. + Arrays.toString(searchImageFeatureVector));
  111.  
  112. ArrayList<ImageInImageDatabase> database = new ArrayList();
  113.  
  114. File directory = new File(imageDatabaseDirectoryName);
  115.  
  116. FilenameFilter filter = new FilenameFilter() {
  117. public boolean accept(File dir, String name) {
  118. return name.endsWith(".jpg") || name.endsWith(".jpeg");
  119. }
  120. };
  121.  
  122. String[] fileNames = directory.list(filter);
  123.  
  124. for (String fileName : fileNames) {
  125.  
  126. double[] fcthFeatureVector = getFCTHFeatureVector(imageDatabaseDirectoryName
  127. + "\\" + fileName);
  128. double distanceToSearchImage = calculateEuclideanDistance(
  129. fcthFeatureVector, searchImageFeatureVector);
  130.  
  131. ImageInImageDatabase imageInImageDatabase = new ImageInImageDatabase();
  132.  
  133. imageInImageDatabase.fileName = fileName;
  134. imageInImageDatabase.fcthFeatureVector = fcthFeatureVector;
  135. imageInImageDatabase.distanceToSearchImage = distanceToSearchImage;
  136.  
  137. database.add(imageInImageDatabase);
  138.  
  139. }
  140.  
  141. Collections.sort(database, new ImageComparator());
  142.  
  143. for (ImageInImageDatabase result : database) {
  144.  
  145. System.out.println("Distance "
  146. + Double.toString(result.distanceToSearchImage) + ": "
  147. + result.fileName);
  148. }
  149.  
  150. System.out.println("Image Successfully Stored");
  151. } catch (FileNotFoundException fnfe) {
  152. System.out.println("Image Path not found" + fnfe);
  153. } catch (IOException ioe) {
  154. System.out.println("Exception while converting the Image " + ioe);
  155. }
  156. return resultName;
  157. }
  158.  
  159. public static void main(String[] args) throws FileNotFoundException,
  160. IOException {
  161.  
  162. args = new String[2];
  163. // path of source
  164. args[0] = "src/sourceimagesfolder/";
  165. // photo taken
  166. args[1] = "WebContent/UploadedImages/example1.jpg";
  167. if (args.length != 2) {
  168.  
  169. System.out
  170. .println("This application requires two parameters: "
  171. + "the name of a directory containing JPEG images, and a file name of a JPEG image.");
  172. return;
  173.  
  174. }
  175.  
  176. String imageDatabaseDirectoryName = args[0];
  177. String searchImageFilePath = args[1];
  178. double[] searchImageFeatureVector = getFCTHFeatureVector(searchImageFilePath);
  179.  
  180. System.out.println("Search image FCTH vector: "
  181. + Arrays.toString(searchImageFeatureVector));
  182.  
  183. ArrayList<ImageInImageDatabase> database = new ArrayList();
  184.  
  185. File directory = new File(imageDatabaseDirectoryName);
  186.  
  187. FilenameFilter filter = new FilenameFilter() {
  188. public boolean accept(File dir, String name) {
  189. return name.endsWith(".jpg") || name.endsWith(".jpeg");
  190. }
  191. };
  192.  
  193. String[] fileNames = directory.list(filter);
  194.  
  195. for (String fileName : fileNames) {
  196.  
  197. double[] fcthFeatureVector = getFCTHFeatureVector(imageDatabaseDirectoryName
  198. + "\\" + fileName);
  199. double distanceToSearchImage = calculateEuclideanDistance(
  200. fcthFeatureVector, searchImageFeatureVector);
  201.  
  202. ImageInImageDatabase imageInImageDatabase = new ImageInImageDatabase();
  203.  
  204. imageInImageDatabase.fileName = fileName;
  205. imageInImageDatabase.fcthFeatureVector = fcthFeatureVector;
  206. imageInImageDatabase.distanceToSearchImage = distanceToSearchImage;
  207.  
  208. database.add(imageInImageDatabase);
  209.  
  210. }
  211.  
  212. Collections.sort(database, new ImageComparator());
  213.  
  214. for (ImageInImageDatabase result : database) {
  215.  
  216. System.out.println("Distance "
  217. + Double.toString(result.distanceToSearchImage) + ": "
  218. + result.fileName);
  219.  
  220. }
  221.  
  222. }
  223.  
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement