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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值