java指纹识别以及谷歌图片识别技术源码
本文实例为大家分享了java指纹识别和图片识别源代码,供大家参考,具体内容如下
主类:
importjava.awt.image.BufferedImage; importjava.util.ArrayList; importjava.util.List; publicclassSimilarImageSearch{ /** *@paramargs */ publicstaticvoidmain(String[]args){ List<String>hashCodes=newArrayList<String>(); Stringfilename=ImageHelper.path+"\\images\\"; StringhashCode=null; for(inti=0;i<6;i++) { hashCode=produceFingerPrint(filename+"example"+(i+1)+".jpg"); hashCodes.add(hashCode); } System.out.println("Resources:"); System.out.println(hashCodes); System.out.println(); StringsourceHashCode=produceFingerPrint(filename+"source.jpg"); System.out.println("Source:"); System.out.println(sourceHashCode); System.out.println(); for(inti=0;i<hashCodes.size();i++) { intdifference=hammingDistance(sourceHashCode,hashCodes.get(i)); System.out.print("汉明距离:"+difference+""); if(difference==0){ System.out.println("source.jpg图片跟example"+(i+1)+".jpg一样"); }elseif(difference<=5){ System.out.println("source.jpg图片跟example"+(i+1)+".jpg非常相似"); }elseif(difference<=10){ System.out.println("source.jpg图片跟example"+(i+1)+".jpg有点相似"); }elseif(difference>10){ System.out.println("source.jpg图片跟example"+(i+1)+".jpg完全不一样"); } } } /** *计算"汉明距离"(Hammingdistance)。 *如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。 *@paramsourceHashCode源hashCode *@paramhashCode与之比较的hashCode */ publicstaticinthammingDistance(StringsourceHashCode,StringhashCode){ intdifference=0; intlen=sourceHashCode.length(); for(inti=0;i<len;i++){ if(sourceHashCode.charAt(i)!=hashCode.charAt(i)){ difference++; } } returndifference; } /** *生成图片指纹 *@paramfilename文件名 *@return图片指纹 */ publicstaticStringproduceFingerPrint(Stringfilename){ BufferedImagesource=ImageHelper.readPNGImage(filename);//读取文件 intwidth=8; intheight=8; //第一步,缩小尺寸。 //将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。 BufferedImagethumb=ImageHelper.thumb(source,width,height,false); //第二步,简化色彩。 //将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。 int[]pixels=newint[width*height]; for(inti=0;i<width;i++){ for(intj=0;j<height;j++){ pixels[i*height+j]=ImageHelper.rgbToGray(thumb.getRGB(i,j)); } } //第三步,计算平均值。 //计算所有64个像素的灰度平均值。 intavgPixel=ImageHelper.average(pixels); //第四步,比较像素的灰度。 //将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。 int[]comps=newint[width*height]; for(inti=0;i<comps.length;i++){ if(pixels[i]>=avgPixel){ comps[i]=1; }else{ comps[i]=0; } } //第五步,计算哈希值。 //将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。 StringBufferhashCode=newStringBuffer(); for(inti=0;i<comps.length;i+=4){ intresult=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(result)); } //得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。 returnhashCode.toString(); } /** *二进制转为十六进制 *@paramintbinary *@returncharhex */ privatestaticcharbinaryToHex(intbinary){ charch=''; switch(binary) { case0: ch='0'; break; case1: ch='1'; break; case2: ch='2'; break; case3: ch='3'; break; case4: ch='4'; break; case5: ch='5'; break; case6: ch='6'; break; case7: ch='7'; break; case8: ch='8'; break; case9: ch='9'; break; case10: ch='a'; break; case11: ch='b'; break; case12: ch='c'; break; case13: ch='d'; break; case14: ch='e'; break; case15: ch='f'; break; default: ch=''; } returnch; } }
工具类:
importjava.awt.AlphaComposite; importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics2D; importjava.awt.Image; importjava.awt.RenderingHints; importjava.awt.geom.AffineTransform; importjava.awt.image.BufferedImage; importjava.awt.image.ColorModel; importjava.awt.image.WritableRaster; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjavax.imageio.ImageIO; importcom.sun.image.codec.jpeg.ImageFormatException; importcom.sun.image.codec.jpeg.JPEGCodec; importcom.sun.image.codec.jpeg.JPEGImageDecoder; importcom.sun.image.codec.jpeg.JPEGImageEncoder; /** *图片工具类,主要针对图片水印处理 * *@author025079 *@version[版本号,2011-11-28] *@see[相关类/方法] *@since[产品/模块版本] */ publicclassImageHelper{ //项目根目录路径 publicstaticfinalStringpath=System.getProperty("user.dir"); /** *生成缩略图<br/> *保存:ImageIO.write(BufferedImage,imgType[jpg/png/...],File); * *@paramsource *原图片 *@paramwidth *缩略图宽 *@paramheight *缩略图高 *@paramb *是否等比缩放 **/ publicstaticBufferedImagethumb(BufferedImagesource,intwidth, intheight,booleanb){ //targetW,targetH分别表示目标长和宽 inttype=source.getType(); BufferedImagetarget=null; doublesx=(double)width/source.getWidth(); doublesy=(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 ColorModelcm=source.getColorModel(); WritableRasterraster=cm.createCompatibleWritableRaster(width, height); booleanalphaPremultiplied=cm.isAlphaPremultiplied(); target=newBufferedImage(cm,raster,alphaPremultiplied,null); }else target=newBufferedImage(width,height,type); Graphics2Dg=target.createGraphics(); //smootherthanexlax: g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.drawRenderedImage(source,AffineTransform.getScaleInstance(sx,sy)); g.dispose(); returntarget; } /** *图片水印 * *@paramimgPath *待处理图片 *@parammarkPath *水印图片 *@paramx *水印位于图片左上角的x坐标值 *@paramy *水印位于图片左上角的y坐标值 *@paramalpha *水印透明度0.1f~1.0f **/ publicstaticvoidwaterMark(StringimgPath,StringmarkPath,intx,inty, floatalpha){ try{ //加载待处理图片文件 Imageimg=ImageIO.read(newFile(imgPath)); BufferedImageimage=newBufferedImage(img.getWidth(null), img.getHeight(null),BufferedImage.TYPE_INT_RGB); Graphics2Dg=image.createGraphics(); g.drawImage(img,0,0,null); //加载水印图片文件 Imagesrc_biao=ImageIO.read(newFile(markPath)); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); g.drawImage(src_biao,x,y,null); g.dispose(); //保存处理后的文件 FileOutputStreamout=newFileOutputStream(imgPath); JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); }catch(Exceptione){ e.printStackTrace(); } } /** *文字水印 * *@paramimgPath *待处理图片 *@paramtext *水印文字 *@paramfont *水印字体信息 *@paramcolor *水印字体颜色 *@paramx *水印位于图片左上角的x坐标值 *@paramy *水印位于图片左上角的y坐标值 *@paramalpha *水印透明度0.1f~1.0f */ publicstaticvoidtextMark(StringimgPath,Stringtext,Fontfont, Colorcolor,intx,inty,floatalpha){ try{ FontDfont=(font==null)?newFont("宋体",20,13):font; Imageimg=ImageIO.read(newFile(imgPath)); BufferedImageimage=newBufferedImage(img.getWidth(null), img.getHeight(null),BufferedImage.TYPE_INT_RGB); Graphics2Dg=image.createGraphics(); g.drawImage(img,0,0,null); g.setColor(color); g.setFont(Dfont); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); g.drawString(text,x,y); g.dispose(); FileOutputStreamout=newFileOutputStream(imgPath); JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); }catch(Exceptione){ System.out.println(e); } } /** *读取JPEG图片 *@paramfilename文件名 *@returnBufferedImage图片对象 */ publicstaticBufferedImagereadJPEGImage(Stringfilename) { try{ InputStreamimageIn=newFileInputStream(newFile(filename)); //得到输入的编码器,将文件流进行jpg格式编码 JPEGImageDecoderdecoder=JPEGCodec.createJPEGDecoder(imageIn); //得到编码后的图片对象 BufferedImagesourceImage=decoder.decodeAsBufferedImage(); returnsourceImage; }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(ImageFormatExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } returnnull; } /** *读取JPEG图片 *@paramfilename文件名 *@returnBufferedImage图片对象 */ publicstaticBufferedImagereadPNGImage(Stringfilename) { try{ FileinputFile=newFile(filename); BufferedImagesourceImage=ImageIO.read(inputFile); returnsourceImage; }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(ImageFormatExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } returnnull; } /** *灰度值计算 *@parampixels像素 *@returnint灰度值 */ publicstaticintrgbToGray(intpixels){ //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); } /** *计算数组的平均值 *@parampixels数组 *@returnint平均值 */ publicstaticintaverage(int[]pixels){ floatm=0; for(inti=0;i<pixels.length;++i){ m+=pixels[i]; } m=m/pixels.length; return(int)m; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。