一、我先声明一下,本文中的源代码是来自网上资源,我这里演示一下如何在Java Web中使用该算法。
资源地址:http://download.csdn.net/detail/haigenwong/4412334
二、
1:servlet部分代码:
List<String> resultPic = SimilarImageSearch.search(filenametest+"."+prefix);
List<Work> Indexsearchworks = new dao.WorkDAO().queryOneWorkByPic(resultPic);
这里SimilarImageSearch是负责图片搜索的类,利用search方法搜寻图片,实参部分是用户上传的图片的图片名,resultPic为搜索到的图片名称
2:search方法(里面用到的其他方法在源代码同类名下)
List<String> hashCodes = new ArrayList<String>();
String t1 = System.getProperty("user.dir").substring(0,
System.getProperty("user.dir").length() - 4);
//本地的图库目录
String filename = t1 + "\\webapps\\media1\\work\\allworks\\";
//存放用户上传的图片目录
String filename2 = t1 + "\\webapps\\media1\\work\\searchPic\\";
String hashCode = null;
//存放本地图库的所有图片名称
List<String> fileNames = new ArrayList<String>();
//存放图片搜寻结果
List<String> results = new ArrayList<String>();
//利用FileName类的get方法获取所有图片的名称
fileNames = new FileName().get();
Iterator<String> iter = fileNames.iterator();
//获取每张图片的hash值
while(iter.hasNext())
{
String filen = (String) iter.next();
hashCode = produceFingerPrint(filename + filen);
hashCodes.add(hashCode);//获取图片的hash值
}
//获取用户上传的图片的hash值
String sourceHashCode = produceFingerPrint(filename2+picName);
//比较原图与本地图片的汉明距离
for (int i = 0; i < hashCodes.size(); i++)
{
int difference = hammingDistance(sourceHashCode, hashCodes.get(i));
System.out.print("汉明距离:"+difference+" ");
if(difference==0){
System.out.print("一样:");
String name = fileNames.get(i);
System.out.println(name);
results.add(name);
}else if(difference<=5){
System.out.print("非常相似:");
String name = fileNames.get(i);
System.out.println(name);
results.add(name);
}else if(difference<=10){
System.out.print("有点相似:");
String name = fileNames.get(i);
System.out.println(name);
results.add(name);
}else if(difference>10){
System.out.print("完全不一样");
String name = fileNames.get(i);
System.out.println(name);
}
}
return results;
}
FileName类的get方法(里面用到的其他方法在源代码同类名下):
List<String> filterName = new ArrayList<String>();
filterName.add("jpeg");
filterName.add("jpg");
filterName.add("png");
filterName.add("bmp");
filterName.add("gif");// 自己可以定义
/*
* System.out.println(getFileList(ImageHelper.path + "\\allworks\\",
* filterName));
*/
// 获取本地目录下的图片名称
String t1 = System.getProperty("user.dir").substring(0,
System.getProperty("user.dir").length() - 4);
List<String> filenames = getFileList(t1
+ "/webapps/media1/work/allworks/", filterName);
return filenames;
图片搜索的基本原理就是这样,源代码中注释都是有的,看懂并不难,推荐各位去看下。