Les exemples de cet article partagent le code source de la reconnaissance des empreintes digitales Java et de la reconnaissance d'image pour votre référence. Le contenu spécifique est le suivant
Catégorie principale:
Importer java.awt.image.bufferedImage; import java.util.arraylist; import java.util.list; public class similmagesearch {/ ** * @param args * / public static void main (String [] args) {list <string> hashcodes = new ArrayList <string> (); String filename = imagehelper.path + "// images //"; String hashcode = null; for (int i = 0; i <6; i ++) {hashcode = produceFingerPrint (nom de fichier + "exemple" + (i + 1) + ".jpg"); hashcodes.add (hashcode); } System.out.println ("Ressources:"); System.out.println (HashCodes); System.out.println (); String sourceHashCode = produceFingerPrint (nom de fichier + "source.jpg"); System.out.println ("Source:"); System.out.println (sourceHashCode); System.out.println (); for (int i = 0; i <hashcodes.size (); i ++) {int différence = hammingDistance (sourcehashcode, hashcodes.get (i)); System.out.print ("Hamming Distance:" + Difference + ""); if (Difference == 0) {System.out.println ("Source.jpg L'image est la même que l'exemple" + (i + 1) + ". jpg"); } else if (différence <= 5) {System.out.println ("Source.jpg L'image est très similaire à l'exemple" + (i + 1) + ". jpg"); } else if (différence <= 10) {System.out.println ("Source.jpg L'image est quelque peu similaire à l'exemple" + (i + 1) + ". jpg"); } else if (différence> 10) {System.out.println ("Source.jpg L'image est complètement différente de l'exemple" + (i + 1) + ". jpg"); }}} / ** * Calculer "Distance de Hamming". * Si les bits de données différents ne dépassent pas 5, cela signifie que les deux images sont très similaires; S'ils sont supérieurs à 10, cela signifie que ce sont deux images différentes. * @param sourcehashcode source hashcode * @param hashcode comparaison hashcode * / public static int hammingDistance (chaîne sourcehashcode, string hashcode) {int différence = 0; int len = sourcehashcode.length (); pour (int i = 0; i <len; i ++) {if (sourcehashcode.charat (i)! = hashcode.charat (i)) {différence ++; }} différence de retour; } / ** * Générer l'empreinte digitale de l'image * @param nom de fichier nom de fichier * @return Image Imprimée * / public static String procedFingerPrint (String filename) {bufferedImage Source = ImageHelper.readpNGImage (nom de fichier); // Lire le fichier int width = 8; int hauteur = 8; // La première étape consiste à réduire la taille. // rétrécir l'image à la taille 8x8, avec un total de 64 pixels. Le but de cette étape est de supprimer les détails de l'image, de conserver uniquement des informations de base telles que la structure, la lumière et l'obscurité, et d'abandonner les différences d'image causées par différentes tailles et proportions. BufferedImage Thumb = ImageHelper.Thumb (source, largeur, hauteur, false); // La deuxième étape consiste à simplifier la couleur. // Tournez l'image réduite au niveau de gris de niveau 64. C'est-à-dire qu'il n'y a que 64 couleurs dans tous les pixels. int [] pixels = new int [largeur * hauteur]; for (int i = 0; i <width; i ++) {for (int j = 0; j <height; j ++) {pixels [i * height + j] = imagehelper.rgbtogray (thumb.getrgb (i, j)); }} // La troisième étape consiste à calculer la moyenne. // Calculez la moyenne des niveaux de gris de 64 pixels. int avgPixel = ImageHelper.Every (Pixels); // Étape 4, comparez l'échelle de gris des pixels. // Comparez l'échelle de gris de chaque pixel avec la valeur moyenne. S'il est supérieur ou égal à la valeur moyenne, il est désigné 1; S'il est inférieur à la valeur moyenne, il est indiqué comme 0. int [] comps = new int [largeur * hauteur]; for (int i = 0; i <comps.length; i ++) {if (pixels [i]> = avgPixel) {comps [i] = 1; } else {comps [i] = 0; }} // Étape 5, calculez la valeur de hachage. // Combinez les résultats de comparaison de l'étape précédente pour former un entier 64 bits, qui est l'empreinte digitale de cette image. L'ordre des combinaisons n'est pas important, assurez-vous simplement que toutes les images sont dans le même ordre. StringBuffer hashcode = new StringBuffer (); for (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.Apend (BinaryToHex (résultat)); } // Après avoir obtenu l'empreinte digitale, vous pouvez comparer différentes images pour voir combien de bits sont différents dans le 64 bits. return hashcode.toString (); } / ** * Convertir binaire en hex * @param int binary * @return char hex * / private static char binarytohex (int binary) {char ch = ''; commutateur (binaire) {cas 0: ch = '0'; casser; cas 1: ch = '1'; casser; Cas 2: ch = '2'; casser; Cas 3: ch = '3'; casser; Cas 4: ch = '4'; casser; Cas 5: Ch = '5'; casser; Cas 6: Ch = '6'; casser; Cas 7: Ch = '7'; casser; Cas 8: ch = '8'; casser; Cas 9: Ch = '9'; casser; Cas 10: ch = 'a'; casser; Cas 11: ch = 'b'; casser; Cas 12: ch = 'c'; casser; Cas 13: ch = 'd'; casser; Cas 14: ch = 'e'; casser; Cas 15: ch = 'f'; casser; par défaut: ch = ''; } return ch; }} Outils:
import java.awt.alphacomposite; import java.awt.color; import java.awt.font; import java.awt.graphics2d; import java.awt.image; import java.awt.Renderinghints; java.awt.image.colormodel; import java.awt.image.writableaster; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundException; import java.io.fileoutStream; import java.ioexception; import java.io.ile.inputstream; import javax.imageio.imageio; import com.sun.image.codec.jpeg.imageFormatexception; import com.sun.image.codec.jpeg.jpegcodeccoder; Classe, principalement pour le traitement du filigrane d'image * * @author 025079 * @version [Numéro de version, 2011-11-28] * @See [Classe / méthode associée] * @Since [Product / Module version] * / public class ImageHelper {// Project Root Directory Public Static String String STRATH Path = System.getProperty ("user.Dir"); / ** * générer des miniatures <br/> * Enregistrer: imageo.write (bufferedImage, imgType [jpg / png / ...], fichier); * * @param source * Image d'origine * @param largeur * Largeur de la ceinture * Hauteur de la miniature * Hauteur de la ceinture * @param b * est-il également à l'échelle * * / Boolean statique publique Thumb (Targetw, TARGETH INT LA LA LIGNE ET LA LA LEAUX REVORT INT TYPE = SOURCE.GITTYPE (); BufferedImage Target = null; double sx = (double) largeur / source.getWidth (); double sy = (double) height / source.getheight (); if (b) {if (sx> sy) {sx = sy; width = (int) (sx * source.getWidth ()); } else {sy = sx; height = (int) (sy * source.getheight ()); }} if (type == BufferedImage.Type_Custom) {// Handmade Colormodel CM = Source.getColorModel (); WriteBeraster raster = cm.CreateCompatibleWritableRaster (largeur, hauteur); booléen alphapremultiplied = cm.IsalphapreMultiplied (); Target = new BufferedImage (cm, raster, alphapremultiplied, null); } else cible = new BufferedImage (largeur, hauteur, type); Graphics2d g = target.creategraphics (); // plus lisse que Exlax: g.setRenderingHint (RenderingHint.key_redering, rederingHint.value_render_quality); G.DrawRendeReDImage (source, affinetRansform.getScaleInstance (SX, SY)); g.dispose (); cible de retour; } / ** * Image Watermark * * @param imgpath * Image en attente * @param markpath * Image de filigrane * @param x * Le filigrane est dans le coin supérieur gauche de l'image La valeur de coordonnée X de @param y * Watermark est dans le coin supérieur gauche de l'image la valeur des coordonnées y * / Public ALPHA * WaterMark Transparency, 0,1f ~ 1.0f * * String MarkPath, int x, int y, float alpha) {try {// Chargez l'image d'image en attente img Img = imageo.read (new File (imgPath)); BufferedImage Image = new BufferedImage (img.getWidth (null), img.getheight (null), bufferedImage.type_int_rgb); Graphics2d g = image.creategraphics (); G.DrawImage (img, 0, 0, null); // Chargez l'image de fichier image de filigrane src_biao = imageo.read (nouveau fichier (markpath)); g.setComposite (alphacomposite.getInstance (alphacomposite.src_atop, alpha)); G.DrawImage (src_biao, x, y, null); g.dispose (); // Enregistrer le fichier traité FileOutputStream out = new FileOutputStream (IMGPATH); JpegImageEncoder Encoder = jPegCodec.CreateJPegenCoder (Out); Encoder.encode (image); out.close (); } catch (exception e) {e.printStackTrace (); }} / ** * Text Watermark * * @param imgpath * Image en attente * @param text * watermark text * @param font * watermark Informations de police * @param couleur * Watermark Font Color * @param x * watermark x coordonnée Valeur dans le coin supérieur gauche de l'image * @param y * watermark est dans la valeur de la coordonnée Y1. 1.0f * / public static void textmark (chaîne imgpath, texte de chaîne, police de police, couleur couleur, int x, int y, float alpha) {try {font dfont = (font == null)? Nouvelle police ("宋体", 20, 13): police; Image img = imageo.read (nouveau fichier (imgpath)); BufferedImage Image = new BufferedImage (img.getWidth (null), img.getheight (null), bufferedImage.type_int_rgb); Graphics2d g = image.creategraphics (); G.DrawImage (img, 0, 0, null); g.setColor (couleur); g.setfont (dfont); g.setComposite (alphacomposite.getInstance (alphacomposite.src_atop, alpha)); G.Drawstring (texte, x, y); g.dispose (); FileoutputStream out = new FileOutputStream (imgPath); JpegImageEncoder Encoder = jPegCodec.CreateJPegenCoder (Out); Encoder.encode (image); out.close (); } catch (exception e) {System.out.println (e); }} / ** * Lire JPEG Image * @param FileName FileName * @return BufferedImage Image Object * / public static BufferedImage ReadJPeGImage (String FileName) {try {InputStream ImageIn = new FileInputStream (nouveau fichier (FileName)); // Obtenez l'encodeur d'entrée et encodez le flux de fichiers au format JPG jPegImageDecoder decoder = jPegCodec.CreateJPeGDecOder (imageIn); // Obtenez l'objet d'image codé BufferedImage SourceImage = Decoder.DecodeaSBufferedImage (); return sourceImage; } catch (filenotFoundException e) {e.printStackTrace (); } catch (imageFormatexception e) {e.printStackTrace (); } catch (ioException e) {e.printStackTrace (); } return null; } / ** * Lire jpeg image * @param nom de fichier filename * @return BufferedImage Image Object * / public static bufferedImage readPNGImage (String filename) {try {file inputFile = new File (fileName); BufferedImage SourceImage = ImageIo.Read (InputFile); return sourceImage; } catch (filenotFoundException e) {e.printStackTrace (); } catch (imageFormatexception e) {e.printStackTrace (); } catch (ioException e) {e.printStackTrace (); } return null; } / ** * Calcul de la valeur GrayScale * @param pixels pixels * @return int graycale valeur * / public static int rgBtOGRAY (int pixels) {// int _alpha = (pixels >> 24) & 0xff; int _red = (pixels >> 16) & 0xff; int _green = (pixels >> 8) & 0xff; int _Blue = (pixels) & 0xff; return (int) (0,3 * _red + 0,59 * _Green + 0.11 * _Blue); } / ** * Calculez la moyenne du tableau * @param pixels array * @return int moyen * / public static int moyen (int [] pixels) {float m = 0; for (int i = 0; i <pixels.length; ++ i) {m + = pixels [i]; } m = m / pixels.length; retour (int) m; }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.