感知哈希算法实现简单图片搜索

来源:互联网 发布:火箭爵士季后赛数据 编辑:程序博客网 时间:2024/05/18 23:28

一、我先声明一下,本文中的源代码是来自网上资源,我这里演示一下如何在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;

图片搜索的基本原理就是这样,源代码中注释都是有的,看懂并不难,推荐各位去看下。

0 0