Die Beispiele in diesem Artikel teilen den Quellcode der Erkennung von Java -Fingerabdruck und Bildkennung für Ihre Referenz. Der spezifische Inhalt ist wie folgt
Hauptkategorie:
importieren java.awt.image.buffeedImage; import Java.util.ArrayList; importieren java.util.list; public class ähnlichsearch { / ** * @param args * / public static void main (String [] args) {list <string> HashCodes = new Arraylist <string> (); String Dateiname = ImageHelper.Path + "// Bilder //"; String hashcode = null; für (int i = 0; i <6; i ++) {HashCode = processFingerprint (Dateiname + "Beispiel" + (i + 1) + ".jpg"); Hashcodes.Add (HashCode); } System.out.println ("Ressourcen:"); System.out.println (Hashcodes); System.out.println (); String SourceHashCode = processFingerprint (Dateiname + "source.jpg"); System.out.println ("Quelle:"); System.out.println (SourceHashCode); System.out.println (); für (int i = 0; i <hashcodes.size (); i ++) {int differenz = hammingDistance (SourceHashCode, Hashcodes.get (i)); System.out.print ("Hamming -Distanz:"+Differenz+""); if (Differenz == 0) {System.out.println ("source.jpg -Bild ist das gleiche wie beispielsweise"+(i+1)+". JPG"); } else if (Differenz <= 5) {System.out.println ("source.jpg -Bild ist sehr ähnlich wie"+(i+1)+". JPG"); } else if (Differenz <= 10) {System.out.println ("source.jpg -Bild ist etwas ähnlich wie"+(i+1)+". JPG"); } else if (Differenz> 10) {System.out.println ("source.jpg -Bild unterscheidet sich vollständig von Beispiel"+(i+1)+". JPG"); }}} /*** Berechnen Sie "Hamming Distanz". * Wenn die Datenbits verschiedener 5 nicht überschreiten, bedeutet dies, dass die beiden Bilder sehr ähnlich sind. Wenn sie größer als 10 sind, bedeutet dies, dass dies zwei verschiedene Bilder sind. * @param SourceHashCode Source HashCode * @param Hashcode Vergleich HashCode */ public static int hammingDistance (String SourceHashCode, String HashCode) {int differenz = 0; int len = sourceHashCode.length (); für (int i = 0; i <len; i ++) {if (SourceHashCode.charat (i)! = HashCode.Charat (i)) {Differenz ++; }} Rückgabedifferenz; }/ *** Bildfingerabdruck generieren* @param Dateiname Dateiname* @return Bild Fingerabdruck*/ public static String processFingerprint (String -Dateiname) {bufferedImage Source = ImageHelper.readPngimage (Dateiname); // Lesen Sie die Datei int width = 8; int Höhe = 8; // Der erste Schritt besteht darin, die Größe zu reduzieren. // das Bild mit insgesamt 64 Pixel auf 8x8 Größe verkleinern. Der Zweck dieses Schritts ist es, die Details des Bildes zu entfernen, nur grundlegende Informationen wie Struktur, Hell und Dunkel zu behalten und die Unterschiede im Bild aufzugeben, die durch verschiedene Größen und Proportionen verursacht werden. Bufferedimage thumb = imageHelper.dumb (Quelle, Breite, Höhe, Falsch); // Der zweite Schritt besteht darin, die Farbe zu vereinfachen. // das reduzierte Bild auf Stufe 64 Graustufen umwandeln. Das heißt, es gibt nur 64 Farben in allen Pixeln. int [] pixels = new int [width * Höhe]; für (int i = 0; i <width; i ++) {für (int j = 0; j <Höhe; j ++) {pixels [i * height+j] = imageHelper.rgbtogray (thumb.getRgb (i, j)); }} // Der dritte Schritt besteht darin, den Durchschnitt zu berechnen. // Berechnen Sie den Graustufendurchschnitt aller 64 Pixel. int avgpixel = imageHelper. Durchschnitt (Pixel); // Schritt 4, vergleichen Sie den Graustufen der Pixel. // Vergleichen Sie den Graustufen jedes Pixels mit dem Durchschnittswert. Wenn es größer oder gleich dem Durchschnittswert ist, wird es als 1 bezeichnet; Wenn es geringer ist als der Durchschnittswert, wird es als 0. Int [] comps = new int [Breite * Höhe] bezeichnet; für (int i = 0; i <comps.length; i ++) {if (pixel [i]> = avgpixel) {comps [i] = 1; } else {comps [i] = 0; }} // Schritt 5 berechnen Sie den Hash -Wert. // Kombinieren Sie die Vergleichsergebnisse des vorherigen Schritts zusammen, um eine 64-Bit-Ganzzahl zu bilden, die der Fingerabdruck dieses Bildes ist. Die Reihenfolge der Kombinationen ist nicht wichtig. Stellen Sie einfach sicher, dass alle Bilder in der gleichen Reihenfolge sind. StringBuffer HashCode = new StringBuffer (); für (int i = 0; i <comps.length; i + = 4) {int result = comps [i] * (int) math.pow (2, 3) + comps [i + 1] * (int) math.pow (2, 2) + comps [i + 2] * (int) math.pow (2, 1) + comps [i + 2]; HashCode.Append (BinaryTohex (Ergebnis)); } // Nach dem Erhalten des Fingerabdrucks können Sie verschiedene Bilder vergleichen, um zu sehen, wie viele Bits im 64-Bit unterschiedlich sind. return HashCode.toString (); } / ** * binär in hex * @param int binär konvertieren Switch (binär) {Fall 0: ch = '0'; brechen; Fall 1: Ch = '1'; brechen; Fall 2: Ch = '2'; brechen; Fall 3: Ch = '3'; brechen; Fall 4: Ch = '4'; brechen; Fall 5: Ch = '5'; brechen; Fall 6: Ch = '6'; brechen; Fall 7: Ch = '7'; brechen; Fall 8: Ch = '8'; brechen; Fall 9: Ch = '9'; brechen; Fall 10: ch = 'a'; brechen; Fall 11: Ch = 'B'; brechen; Fall 12: Ch = 'C'; brechen; Fall 13: Ch = 'D'; brechen; Fall 14: ch = 'e'; brechen; Fall 15: ch = 'f'; brechen; Standard: ch = ''; } return ch; }} Werkzeuge:
Import Java.awt.Alphacomposite; Import Java.awt.Color; Import Java.awt.font; Import Java.awt.graphics2d; Import Java.awt.image; java.awt.image.colormodel; import java.awt.image.writableraster; import Java.io.file; import Java.io.fileInputStream; Import Java.io.filenotfoundException; Import Java.io.fileSputstream; javax.imageo.imageo; import com.sun.image.codec.jpeg.imageformatexception; import com.sun.image.codec.jpeg.jpegcodec; import com.sun.image.codec.jpeg.jpegimagedecoder; Klasse, hauptsächlich für die Verarbeitung von Image Watermark * * @Author 025079 * @Version [Versionsnummer, 2011-11-28] * @see [verwandte Klasse/Methode] * @Since [Produkt/Modulversion] */public class ImageHelper {// Project Root verzeichnis Pfad public static endgültige String Path = System.getProperty ("user.dir"); /** * generieren Sie Miniaturansichten <br/> * speichern: imageio.write (bufferedImage, imgType [jpg/png/...], Datei); * * @Param Source * Originalbild * @param Breite * Thumbnail Breite * Miniaturhöhe * Thumbnail Height * @param b * Ist es gleich skaliert * */ public static bufferedImage thumb (bufferedimage Source, int breite, intheigh, boolean b) {// Targetw, tareth, tareth, tareth, tareth, tareth, tareth (targhth). Bufferedimage target = null; double sx = (doppelt) width / source.getWidth (); double sy = (doppelte) Höhe / Quelle.Getheight (); if (b) {if (sx> sy) {sx = sy; width = (int) (sx * source.getWidth ()); } else {sy = sx; Höhe = (int) (sy * source.getheight ()); }} if (type == bufferedimage.type_custom) {// handgefertigt colorModel cm = source.getColormodel (); Writableraster Raster = CM.CreateCompatibleWritableraster (Breite, Höhe); boolean alphapremultiplied = cm.isalphapremultiplied (); target = new bufferedImage (cm, raster, alphapremultiplied, null); } else target = new bufferedImage (Breite, Höhe, Typ); Graphics2d g = Ziel.CreateGraphics (); // glatter als Exlax: G.SetrenderingHint (renderingHints.key_rendering, renderingHints.value_render_Quality); G.Drawrenderedimage (Quelle, Affinetransform.GetScaleinstance (SX, SY)); g.disponse (); Ziel zurückgeben; } / ** * Bild Wasserzeichen * * @param imgpath * anhängiges Bild * @param markpath * Wasserzeichen Bild * @param x * Wasserzeichen befindet sich in der oberen linken Ecke des Bildes Der x -Koordinatenwert des @param y * Wasserzeichens befindet sich in der oberen linken Ecke des Bildes. x, int y, float alpha) {try {// laden Sie das anstehende Bilddatei Bild img = imageio.read (neue Datei (IMGPath)); Bufferedimage image = new bufferedimage (img.getwidth (null), img.getheight (null), bufferedimage.type_int_rgb); Graphics2d g = Bild.CreateGraphics (); G.Drawimage (IMG, 0, 0, NULL); // Laden Sie die Wassermark -Bilddatei Bild src_biao = imageio.read (neue Datei (MarkPath)); G.SetComposite (Alphacomposite.getInstance (Alphacomposite.src_atop, Alpha)); g.drawimage (src_biao, x, y, null); g.disponse (); // Speichern Sie den verarbeiteten DateidateiOutputStream out = new FileOutputStream (IMGPath); JpegimageCoder cccoder = jpegcodec.createjpeGenCoder (out); ccoder.encode (Bild); out.close (); } catch (Ausnahme e) {e.printstacktrace (); }} /** * Text Wasserzeichen * * @param imgpath * anhängiges Bild * @param text * Watermark Text * @param font * Watermark -Schriftinformationen * @param color * Wasserzeichen -Schriftart */ public static void textmark (String imgPath, Stringtext, Schriftart, Farbfarbe, int x, int y, float alpha) {try {font dfont = (font == null)? Neue Schriftart ("宋体", 20, 13): Schriftart; Bild img = imageio.read (neue Datei (IMGPath)); Bufferedimage image = new bufferedimage (img.getwidth (null), img.getheight (null), bufferedimage.type_int_rgb); Graphics2d g = Bild.CreateGraphics (); G.Drawimage (IMG, 0, 0, NULL); G.SetColor (Farbe); G.SetFont (DFONT); G.SetComposite (Alphacomposite.getInstance (Alphacomposite.src_atop, Alpha)); G.Drawstring (Text, x, y); g.disponse (); FileOutputStream out = new FileOutputStream (IMGPath); JpegimageCoder cccoder = jpegcodec.createjpeGenCoder (out); ccoder.encode (Bild); out.close (); } catch (Ausnahme e) {System.out.println (e); }} / *** Lesen Sie JPEG Image* @param Dateiname Dateiname* @return bufferedImage Bildobjekt* / public static bufferedImage readjpegimage (String -Dateiname) {try {inputStream ImageIn = new FileInputStream (neue Datei (neuer Datei)); // den Eingabebodierer abrufen und den Dateistrom im JPG -Format jpegimagedCoder decoder = jpegcodec.createjpegDecoder (ImageIn) codieren; // das codierte Bildobjekt BufferedImage screcImage = decoder.decodeasBuffenedImage () abrufen; Return SourceImage; } catch (FilenotFoundException e) {e.printstacktrace (); } catch (ImageFormatexception e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } return null; } / *** Lesen Sie JPEG Bild* @param Dateiname Dateiname* @Return BufferedImage Bildobjekt* / public static bufferedImage ReadPngImage (String -Dateiname) {try {DateieingangsFile = new Datei (Dateiname); BufferedImage screeImage = imageio.read (InputFile); Return SourceImage; } catch (FilenotFoundException e) {e.printstacktrace (); } catch (ImageFormatexception e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } return null; } / *** GrayScale Value -Berechnung* @param pixels pixels* @return int grayscale value* / public static int rgBtogray (int pixels) {// int _alpha = (pixels >> 24) & 0xff; int _red = (pixel >> 16) & 0xff; int _green = (pixel >> 8) & 0xff; int _blue = (pixel) & 0xff; return (int) (0,3 * _red + 0,59 * _green + 0,11 * _blue); } / *** Berechnen Sie den Durchschnitt des Arrays* @param pixels array* @return int Durchschnitt* / public static int Durchschnitt (int [] pixels) {float m = 0; für (int i = 0; i <pixels.length; ++ i) {m += pixels [i]; } m = m / pixel.length; return (int) m; }}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.