工业互联网---人工智能----直方图原理实现图像内容相似度比较算法,用于模拟实现图片搜索功能

2021-12-02 00:00:00 互联网 工业
使用直方图原理实现图像内容相似度比较算法,用于模拟实现图片搜索功能
import com.datac.opencv.utils.MyFile;

import javax.imageio.*;



import java.awt.image.*;
import java.awt.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 直方图原理实现图像内容相似度比较算法:
 * @author lili
 *
 */
public class PhotoDigest {
    public static void main(String[] args) throws Exception {
//        float percent = compare(getData("C:\\img2\\2_FaceDetect_cut0.png"),
//                getData("C:\\img2\\3_FaceDetect_cut0.png"));
       
       String savepath ="C:\\var\\uploaded_files\\ckimg\\faces";//要查找的图片文件夹
       
       String ckimg = "C:\\var\\uploaded_files\\ckimg\\faces\\DA319CF4BCAC46C39988FCDDEC26ED26.png";//需要匹配的图片
       
       List<String> names = new ArrayList<String>();
       MyFile.getFile(savepath,names);///獲得該
       
        System.out.println("-------------直方图原理实现图像内容相似度比较算法-----------开始");
        //去该文件夹下获得图片数据,然后生成:生成图片指纹
        for (String namepath : names) {
            if(namepath.contains("cut")){//只比脸
             float percent = compare(getData(ckimg),
                      getData(namepath));
             
              if (percent == 0) {
                  System.out.println(namepath+"---无法比较");
              } else {
                  System.out.println(namepath+"---两张图片的相似度为:" + percent + "%");
              }
            }
        }
        
    }
 
    public static int[] getData(String name) {
        try {
            BufferedImage img = ImageIO.read(new File(name));
            BufferedImage slt = new BufferedImage(100, 100,
                    BufferedImage.TYPE_INT_RGB);
            slt.getGraphics().drawImage(img, 0, 0, 100, 100, null);
            // ImageIO.write(slt,"jpeg",new File("slt.jpg"));
            int[] data = new int[256];
            for (int x = 0; x < slt.getWidth(); x++) {
                for (int y = 0; y < slt.getHeight(); y++) {
                    int rgb = slt.getRGB(x, y);
                    Color myColor = new Color(rgb);
                    int r = myColor.getRed();
                    int g = myColor.getGreen();
                    int b = myColor.getBlue();
                    data[(r + g + b) / 3]++;
                }
            }
            // data 就是所谓图形学当中的直方图的概念
            return data;
        } catch (Exception exception) {
            System.out.println("有文件没有找到,请检查文件是否存在或路径是否正确");
            return null;
        }
    }
 
    public static float compare(int[] s, int[] t) {
        try {
            float result = 0F;
            for (int i = 0; i < 256; i++) {
                int abs = Math.abs(s[i] - t[i]);
                int max = Math.max(s[i], t[i]);
                result += (1 - ((float) abs / (max == 0 ? 1 : max)));
            }
            return (result / 256) * 100;
        } catch (Exception exception) {
            return 0;
        }
    }
}

————————————————- // 获得该文件夹内的所有文件图片

public class MyFile {
   /**
     * 獲得路徑
     * @param path
     * @param names
     */
    public static void getFile(String path,List<String> names){   
        // 获得指定文件对象  
        File file = new File(path);   
        // 获得该文件夹内的所有文件   
        File[] array = file.listFiles();   

        for(int i=0;i<array.length;i++)
        {   
            if(array[i].isFile())//如果是文件
            {   
               names.add(array[i].getPath());
//             names.add(array[i].getPath()+"\\"+array[i].getName());
            }
            else if(array[i].isDirectory())//如果是文件夹
            {  
                    //文件夹需要调用递归 ,深度+1
                getFile(array[i].getPath(),names);  
            }   
        }   
    }  
}

    原文作者:力908925859
    原文地址: https://blog.csdn.net/mr_lili_1986/article/details/123915611
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章