Los ejemplos en este artículo comparten el código fuente de reconocimiento de huellas digitales de Java y reconocimiento de imágenes para su referencia. El contenido específico es el siguiente
Categoría principal:
import java.awt.image.bufferedImage; import java.util.arrayList; import java.util.list; clase pública similares de ElegSageSageSearch { / ** * @param args * / public static void main (string []) {list <string> hashcodes = new ArrayList <tring> (); Cadena filename = imageHelper.path + "// images //"; Cadena hashcode = null; for (int i = 0; i <6; i ++) {hashcode = productfingerprint (nombre de archivo + "ejemplo" + (i + 1) + ".jpg"); hashcodes.add (hashcode); } System.out.println ("recursos:"); System.out.println (hashcodes); System.out.println (); String SourceHashCode = productFingerPrint (nombre de archivo + "fuente.jpg"); System.out.println ("fuente:"); System.out.println (fuentehashCode); System.out.println (); for (int i = 0; i <hashcodes.size (); i ++) {int diferencia = hammingdistance (fuentehashcode, hashcodes.get (i)); System.out.print ("Distancia de hamming:"+diferencia+""); if (diferencia == 0) {system.out.println ("fuente.jpg La imagen es la misma que el ejemplo"+(i+1)+". Jpg"); } else if (diferencia <= 5) {system.out.println ("fuente.jpg La imagen es muy similar al ejemplo"+(i+1)+". jpg"); } else if (diferencia <= 10) {System.out.println ("Source.jpg La imagen es algo similar al ejemplo"+(i+1)+". Jpg"); } else if (diferencia> 10) {System.out.println ("Source.jpg La imagen es completamente diferente del ejemplo"+(i+1)+". jpg"); }}} /*** Calcule "Distancia de hamming". * Si los bits de datos de diferentes no exceden 5, significa que las dos imágenes son muy similares; Si tienen más de 10, significa que estas son dos imágenes diferentes. * @param SourceHashCode Fuente hashcode * @param hashcode comparación hashcode */ public static int hammingDistance (String SourceHashCode, String HashCode) {int diferencia = 0; int len = fuentehashCode.Length (); for (int i = 0; i <len; i ++) {if (fuentehashCode.Charat (i)! = HashCode.Charat (i)) {Difference ++; }} Diferencia de retorno; }/ *** Generar la huella digital de imagen* @param FileName FileName* @return Image dactingprint*/ public static string producsfingerprint (string filename) {bufferedImage fuente = imageHelper.readpngimage (nombre de archivo); // leer el archivo int width = 8; int altura = 8; // El primer paso es reducir el tamaño. // encoge la imagen al tamaño de 8x8, con un total de 64 píxeles. El propósito de este paso es eliminar los detalles de la imagen, retener solo información básica como estructura, luz y oscura, y abandonar las diferencias en la imagen causadas por diferentes tamaños y proporciones. BufferedImage Thumb = ImageHelper.Phumb (fuente, ancho, altura, falso); // El segundo paso es simplificar el color. // Gire la imagen reducida a la escala de grises 64. Es decir, solo hay 64 colores en todos los píxeles. int [] píxeles = new int [width * altura]; for (int i = 0; i <width; i ++) {for (int j = 0; j <height; j ++) {píxeles [i * altura+j] = imageHelper.rgbTogray (thumb.getrgb (i, j)); }} // El tercer paso es calcular el promedio. // Calcule el promedio de la escala de grises de los 64 píxeles. int avgpixel = imageHelper.average (píxeles); // Paso 4, compare la escala de grises de los píxeles. // Compare la escala de grises de cada píxel con el valor promedio. Si es mayor o igual al valor promedio, se denota como 1; Si es menor que el valor promedio, se denota como 0. int [] comps = new int [width * altura]; for (int i = 0; i <comps.length; i ++) {if (pixels [i]> = avgpixel) {comps [i] = 1; } else {comps [i] = 0; }} // Paso 5, calcule el valor hash. // Combine los resultados de comparación del paso anterior juntos para formar un entero de 64 bits, que es la huella digital de esta imagen. El orden de las combinaciones no es importante, solo asegúrese de que todas las imágenes estén en el mismo orden. 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.append (binarytoHex (resultado)); } // Después de obtener la huella digital, puede comparar diferentes imágenes para ver cuántos bits son diferentes en los 64 bits. return HashCode.ToString (); } / ** * Convierta binario a hex * @param int binary * @return char hex * / private static char binaryTox (int binary) {char ch = ''; switch (binario) {caso 0: ch = '0'; romper; Caso 1: CH = '1'; romper; Caso 2: CH = '2'; romper; Caso 3: CH = '3'; romper; Caso 4: CH = '4'; romper; Caso 5: CH = '5'; romper; Caso 6: CH = '6'; romper; Caso 7: CH = '7'; romper; Caso 8: CH = '8'; romper; Caso 9: CH = '9'; romper; Caso 10: CH = 'A'; romper; Caso 11: CH = 'B'; romper; Caso 12: CH = 'C'; romper; Caso 13: CH = 'D'; romper; Caso 14: CH = 'E'; romper; Caso 15: CH = 'F'; romper; predeterminado: ch = '' '; } return ch; }} Herramientas:
import java.awt.alphacomposition; import java.awt.color; import java.awt.font; import java.awt.graphics2d; import java.awt.image; import java.awt.renderinghints; import java.awt.geom.affinetransform; import java.awt.image.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.fileOutputStream; import java.io.io.ioexception; import java.io.io.io. javax.imageio.imageio; import com.sun.image.codec.jpeg.imageformatexception; import com.sun.image.codec.jpeg.jpegcodec; import com.sun.image.codec.jpegegimagegeder; import com.sun.image.codec.jpeg.jpegimageDer; Clase, principalmente para el procesamiento de marcas de agua de imagen * * @author 025079 * @version [número de versión, 2011-11-28] * @see [clase/método relacionado] * @since [Product/Module Version] */public class ImageHelper {// Project Root Directory Path Public Static String Path = System.getPreperty ("User.dir"); /** * Genere miniaturas <br/> * Guardar: imageio.write (bufferedImage, imgtype [jpg/png/...], archivo); * * @param Fuente * Imagen original * @param Ancho * Ancho de miniatura * Altura de la miniatura * Altura de la miniatura * @param B * ¿está igualmente escalado * */ public static bufferedimage Thumb (bufferedimage fuente, intdth, int altura, boolean b) {// Targetw, Targeth indica la longitud de Target de Target en respectivamente? BufferedImage Target = NULL; doble sx = (doble) ancho / fuente.getWidth (); doble sy = (doble) altura / fuente.getheight (); if (b) {if (sx> sy) {sx = sy; width = (int) (sx * fuente.getWidth ()); } else {sy = sx; altura = (int) (sy * source.getheight ()); }} if (type == BufferedImage.Type_Custom) {// COLORMODEL HAYMADO CM = Source.getColormodel (); WRITABLERASTER RASTER = CM.CreateCompatibleWritableBlaster (ancho, altura); boolean alphapremultiplied = cm.isalphapremultiplied (); Target = new BufferedImage (CM, Raster, Alphapremultiplied, NULL); } else Target = new BufferedImage (ancho, altura, tipo); Graphics2d g = Target.CreateGraphics (); // más suave que Exlax: G.SetRenderingHint (renderinghints.key_rendering, renderinghints.value_render_quality); G.DrawrenderedImage (fuente, Affinetransform.getScaleInstance (SX, SY)); G.Dispose (); objetivo de retorno; } / ** * Imagen Watermark * * @param imgpath * Imagen pendiente * @param MarkPath * Watermark Image * @param x * Watermark está en la esquina superior izquierda de la imagen el valor de coordenadas x de la marca de agua @param y * está en la esquina superior izquierda de la imagen del valor coordinado y de la cena de @param Alpha * watrak transparencia 0.1f ~ 1.0f * * / pública static watermark (string iMgpath (string iMgpath (rizina @param String MarkPath, int x, int y, float alfa) {try {// Cargue la imagen del archivo de imagen pendiente img = imageio.read (nuevo archivo (imgpath)); BufferedImage Image = New BufferedImage (img.getWidth (nulo), img.getheight (null), bufferedImage.type_int_rgb); Graphics2d g = image.createGraphics (); G.DrawImage (img, 0, 0, nulo); // Cargar la imagen del archivo de imagen de la marca de agua src_biao = imageio.read (nuevo archivo (markpath)); G.SetComposite (alphacomposis.getInstance (alphacomposis.src_atop, alfa)); G.DrawImage (src_biao, x, y, nulo); G.Dispose (); // Guardar el archivo procesado fileOutputStream out = new FileOutputStream (IMGPATH); JpegimageEncoder coder = jpegcodec.createjpegencoder (out); encoder.encode (imagen); out.close (); } catch (Exception e) {E.PrintStackTrace (); }} /** * TEXT WATERMARK * * @param imgpath * Imagen pendiente * @param text * watermark text * @param Font * Watermark Font Information * @param Color * Watermark Font Color * @param X * Watermark X Coordinate Value en la esquina superior izquierda de la imagen * @param y * Watermark está en el valor de la coordenada en la esquina superior izquierda de la imagen de la imagen * @Param alfe * 1.0f */ public static void Textmark (String imgpath, texto de cadena, fuente de fuente, color color, int x, int y, float alfa) {try {font dfont = (font == null)? nueva fuente ("宋体", 20, 13): fuente; Imagen img = imageIO.read (nuevo archivo (imgpath)); BufferedImage Image = New BufferedImage (img.getWidth (nulo), img.getheight (null), bufferedImage.type_int_rgb); Graphics2d g = image.createGraphics (); G.DrawImage (img, 0, 0, nulo); G.SetColor (color); G.SetFont (DFONT); G.SetComposite (alphacomposis.getInstance (alphacomposis.src_atop, alfa)); G.DrawString (texto, x, y); G.Dispose (); FileOutputStream out = new FileOutputStream (imgpath); JpegimageEncoder coder = jpegcodec.createjpegencoder (out); encoder.encode (imagen); out.close (); } catch (Exception e) {System.out.println (e); }} / *** Read JPEG Imagen* @param FileName FileName* @return BufferedImage Image Object* / public static BufferedImage readJpegimage (string fileName) {try {inputStream imageIn = new FileInputStream (nuevo archivo (FileName)); // Obtenga el codificador de entrada y codifica la secuencia de archivos en formato jpg jpegimageDecoder decoder = jpegcodec.createjpegdecoder (imageIn); // Obtenga el objeto de imagen codificado BufferedImage SourceImage = decoder.DecodeasbufferedImage (); devolver SourceImage; } catch (FileNotFoundException e) {E.PrintStackTrace (); } catch (ImageFormateException e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); } return null; } / *** Read JPEG IMAGEN* @Param FileName FileName* @return BufferedImage Image Object* / public static BufferedImage readPnGImage (String FileName) {try {archivo InputFile = nuevo archivo (nombre de archivo); BufferedImage SourceImage = ImageIO.Read (InputFile); devolver SourceImage; } catch (FileNotFoundException e) {E.PrintStackTrace (); } catch (ImageFormateException e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); } return null; } / *** Cálculo de valor de escala de grises* @param píxeles píxeles* @return int grisscale valor* / public static int rgbTogray (int píxeles) {// int _alpha = (píxeles >> 24) y 0xff; int _red = (píxeles >> 16) y 0xff; int _green = (píxeles >> 8) y 0xff; int _blue = (píxeles) y 0xff; return (int) (0.3 * _red + 0.59 * _green + 0.11 * _blue); } / *** Calcule el promedio de la matriz* @param Pixels Array* @return int promedio* / public static int promedio (int [] píxeles) {float m = 0; for (int i = 0; i <pixels.length; ++ i) {m += pixels [i]; } m = m / pixels.length; return (int) m; }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.