Os exemplos deste artigo compartilham o código -fonte de reconhecimento de impressão digital Java e reconhecimento de imagem para sua referência. O conteúdo específico é o seguinte
Categoria Principal:
importar java.awt.image.bufferiMage; importar java.util.ArrayList; importar java.util.list; public class similarimagesearch { / ** * @param args * / public static void main (string [] args) {list <string> hashcodes = new ArrayList <> (); String filename = imageHelper.path + "// imagens //"; String hashcode = null; para (int i = 0; i <6; i ++) {hashCode = ProduceFingerPrint (nome do arquivo + "Exemplo" + (i + 1) + ".jpg"); hashcodes.add (hashcode); } System.out.println ("Recursos:"); System.out.println (hashcodes); System.out.println (); String fonteHashCode = ProduceFingerPrint (nome do arquivo + "fonte.jpg"); System.out.println ("fonte:"); System.out.println (fonteHashCode); System.out.println (); for (int i = 0; i <hashcodes.size (); i ++) {int diferença = hammingDistance (fontehashcode, hashcodes.get (i)); System.out.print ("Distância de Hamming:"+diferença+""); if (diferença == 0) {System.out.println ("Fonte.jpg Picture é o mesmo que exemplo"+(i+1)+". jpg"); } else if (diferença <= 5) {System.out.println ("Fonte.jpg A imagem é muito semelhante ao exemplo"+(i+1)+". jpg"); } else if (diferença <= 10) {System.out.println ("Fonte.jpg A imagem é um pouco semelhante ao exemplo"+(i+1)+". jpg"); } else if (diferença> 10) {System.out.println ("Fonte.jpg A imagem é completamente diferente do exemplo"+(i+1)+". jpg"); }}} /*** Calcule "Distância de Hamming". * Se os bits de dados de diferentes não excederem 5, significa que as duas imagens são muito semelhantes; Se eles são maiores que 10, significa que essas são duas imagens diferentes. * @param fontehashcode fonte hashcode * @param hashcode comparação hashcode */ public static int hammingDistance (string fontehashcode, string hashcode) {int diferença = 0; int len = fontehashcode.length (); for (int i = 0; i <len; i ++) {if (fontehashcode.charat (i)! = hashcode.charat (i)) {diferença ++; }} diferença de retorno; }/ *** Gere impressão digital @param nome do arquivo de nome* @return imagem impressão digital*/ public static string ProducerfingerPrint (string filename) {bufferedimage fonte = imageHelper.readpngimage (nome do arquivo); leia o arquivo int width = 8; int altura = 8; // O primeiro passo é reduzir o tamanho. // encolher a imagem para o tamanho 8x8, com um total de 64 pixels. O objetivo desta etapa é remover os detalhes da imagem, reter apenas informações básicas, como estrutura, luz e escura e abandonar as diferenças de imagem causadas por diferentes tamanhos e proporções. Polegar bufferiMage = imageHelper.thumb (fonte, largura, altura, false); // O segundo passo é simplificar a cor. // Vire a imagem reduzida para a escala de cinza de nível 64. Ou seja, existem apenas 64 cores em todos os pixels. int [] pixels = new int [largura * altura]; for (int i = 0; i <largura; i ++) {for (int j = 0; j <altura; j ++) {pixels [i * altura+j] = imageHelper.rgbtoGray (thumb.getRgb (i, j)); }} // O terceiro passo é calcular a média. // Calcule a média de escala de cinza de todos os 64 pixels. int avgpixel = imageHelper.average (pixels); // Etapa 4, compare a escala de cinza dos pixels. // Compare a escala de cinza de cada pixel com o valor médio. Se for maior ou igual ao valor médio, será indicado como 1; Se for menor que o valor médio, será denotado como 0. int [] comps = new int [largura * altura]; for (int i = 0; i <comps.length; i ++) {if (pixels [i]> = avgpixel) {comps [i] = 1; } else {comps [i] = 0; }} // Etapa 5, calcule o valor do hash. // Combine os resultados da comparação da etapa anterior para formar um número inteiro de 64 bits, que é a impressão digital dessa imagem. A ordem das combinações não é importante, apenas certifique -se de que todas as imagens estejam na mesma ordem. StringBuffer hashCode = new StringBuffer (); para (int i = 0; i <comps.Length; i + = 4) {int resultado = 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)); } // Depois de obter a impressão digital, você pode comparar imagens diferentes para ver quantos bits são diferentes nos 64 bits. retornar hashcode.toString (); } / ** * converta binário para hexadecimal * @param int binário * @return char hex * / private estático char binarytohex (int binário) {char ch = ''; switch (binário) {case 0: ch = '0'; quebrar; Caso 1: ch = '1'; quebrar; caso 2: ch = '2'; quebrar; Caso 3: CH = '3'; quebrar; Caso 4: CH = '4'; quebrar; caso 5: ch = '5'; quebrar; caso 6: ch = '6'; quebrar; Caso 7: CH = '7'; quebrar; caso 8: ch = '8'; quebrar; caso 9: ch = '9'; quebrar; caso 10: ch = 'a'; quebrar; caso 11: ch = 'b'; quebrar; caso 12: ch = 'c'; quebrar; caso 13: ch = 'd'; quebrar; caso 14: ch = 'e'; quebrar; Caso 15: ch = 'f'; quebrar; padrão: ch = ''; } retornar ch; }} Ferramentas:
importar java.awt.alphacomposite; importar java.awt.color; importar java.awt.font; importar java.awt.graphics2d; importar java.awt.image; importansformed; import.renderhints; java.awt.geom.finTranseed; importawt Javan; importansformed; importawt.renderhints; java.awt.image.colormodel; importar java.awt.image.writableSaster; importar java.io.file; importar java.io.fileInputStream; import java.io.filenotfoundException; importação java.io.fileOutstream; import.Ilmio.io.io.io.io.io.io.io.io.io.io.io.ioException; importar; javax.imageio.imageio; importação com.sun.image.codec.jpeg.imageFormatexception; importação com.sun.image.codec.jpeg.jpegCodec; import com.sun.image.codec.jpeg.jpegimagedecoder; com com.sun.image.codec.jpeg.jpegimagedecoder; com com.sun.image.codec.jpeg.jpegimagedecoder; com com.sun.image.codec.jpeg.jpegImagedecoder; classe, principalmente para o processamento da marca de água de imagem * * @Author 025079 * @Version [Número da versão, 2011-11-28] * @see [classe relacionada/métodos] * @since [versão do produto/módulo] */public class ImageHelper {// Projeto ROOT PATH PATH PACH PUBLIC STATY String Path = System.GetProperty ("User.Dir"; /** * Gere miniaturas <br/> * Salvar: imageio.write (bufferImage, imgtype [jpg/png/...], arquivo); * * @param fonte * Imagem original * @param largura * largura da miniatura * altura da miniatura * altura do miniatura * @param b * é igualmente escalado * */ public static bufferedimage polegar (fonte bufferedimage), como altura, int, int altura, altura booleana b) {// alvow, Targeth); Target -bufferImage = NULL; duplo sx = (duplo) largura / fonte.getWidth (); duplo sy = (duplo) altura / fonte.getHeight (); if (b) {if (sx> sy) {sx = sy; largura = (int) (sx * fonte.getwidth ()); } else {sy = sx; altura = (int) (sy * fonte.getHeight ()); }} if (type == bufferImage.type_custom) {// colormodel handmade cm = fonte.getColormodel (); WritablerSter Raster = CM.CreateCompatibleWritablerSter (largura, altura); boolean alphaPremultiplied = cm.isalphaPremultiplied (); Target = new bufferImage (cm, raster, alphaPremultiplied, null); } else Target = new BufferImage (largura, altura, tipo); Graphics2d g = Target.CreateGraphics (); // mais suave que o exlax: g.setRanderinghint (renderinghints.key_rendering, renderinghints.value_render_quality); G.DrawRenderEdImage (Fonte, AffineTransform.getScaleInstance (SX, SY)); G.Dispose (); alvo de retorno; } / * * MarkPath, int x, int y, float alpha) {tente {// carrega a imagem da imagem pendente img = imageio.read (novo arquivo (imgpath)); BufferImage imagem = new bufferImage (img.getwidth (null), img.getheight (null), bufferiMage.type_int_rgb); Graphics2d g = image.creategraphics (); G.Drawimage (IMG, 0, 0, NULL); // Carregar a imagem da imagem da marca d'água imagem src_biao = imageio.read (novo arquivo (markpath)); g.SetComPosite (alphacomposite.getInstance (alphacomposite.src_atop, alfa)); G.Drawimage (src_biao, x, y, null); G.Dispose (); // Salvar o arquivo FileOutputStream processado OUT = new FileOutputStream (IMGPath); JpegImageEncoder coder = jpegCodec.createjpegencoder (out); coder.Encode (imagem); out.Close (); } catch (Exceção e) {e.printStackTrace (); }} /** * Texto marca d'água * * @param imgpath * imagem pendente * @param texto * Texto da marca d'água * @param font * Informações sobre a fonte da marca d'água * @param cor * marca de água de cor * @param x * marca aquática x valor de coordenada na canto superior esquerda da foto * @param y * Amarca aquática é no valor coordenado na coordenada no valor da coordenada no valor da coordenada no valor da coordenada na parte superior esquerda da foto *, a figura @param y * aquáticas de água na alface do Y. 1.0f */ public static void textmark (string imgpath, text de string, fonte de fonte, cor cor, int x, int y, alfa float) {tente {font dfont = (font == null)? nova fonte ("宋体", 20, 13): fonte; Imagem img = imageio.read (novo arquivo (imgpath)); BufferImage imagem = new bufferImage (img.getwidth (null), img.getheight (null), bufferiMage.type_int_rgb); Graphics2d g = image.creategraphics (); G.Drawimage (IMG, 0, 0, NULL); g.setColor (cor); g.setFont (DFont); g.SetComPosite (alphacomposite.getInstance (alphacomposite.src_atop, alfa)); G.DrawString (texto, x, y); G.Dispose (); FileOutputStream Out = new FileOutputStream (imgPath); JpegImageEncoder coder = jpegCodec.createjpegencoder (out); coder.Encode (imagem); out.Close (); } catch (Exceção e) {System.out.println (e); }} / *** Leia a imagem JPEG* @param fileName FileName* @return bufferedimage objeto* / public static bufferedImage readjpegImage (string filename) {try {inputStream imagein = new FileInpTream (new FileName)); // Obtenha o codificador de entrada e codifique o fluxo de arquivo no formato jpg jpegimagedecoder decodificador = jpegCodec.createjpegDecoder (imagein); // Obtenha o objeto de imagem codificado bufferImage fonte (decodificador.DecodeasBufferImage (); return fonteImage; } catch (filenotfoundException e) {e.printStackTrace (); } catch (imageformatexception e) {e.printStackTrace (); } catch (ioexception e) {e.printStackTrace (); } retornar nulo; } / *** Leia a imagem JPEG* @param fileName FileName* @return bufferImage Objeto de imagem* / public static bufferImage readpngImage (string filename) {try {arquivo inputFile = new File (fileName); BufferImage fonteImage = imageio.read (inputFile); return fonteImage; } catch (filenotfoundException e) {e.printStackTrace (); } catch (imageformatexception e) {e.printStackTrace (); } catch (ioexception e) {e.printStackTrace (); } retornar nulo; } / *** cálculo do valor da escala de cinza* @param pixels pixels* @return int valor da escala de cinza* / public static int rgbtoGray (int pixels) {// int _alpha = (pixels >> 24) & 0xff; int _red = (pixels >> 16) & 0xff; int _green = (pixels >> 8) & 0xff; int _blue = (pixels) e 0xff; return (int) (0,3 * _red + 0,59 * _green + 0,11 * _blue); } / *** Calcule a média da matriz* @param pixels Array* @return int média* / public static int média (int [] pixels) {float m = 0; for (int i = 0; i <pixels.length; ++ i) {m += pixels [i]; } m = m / pixels.length; retornar (int) m; }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.