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;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。