zoukankan      html  css  js  c++  java
  • Java OpenCV-4.0.0 比较两个图片的相似度

    Java OpenCV-4.0.0 直方图比较

    对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间
    然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进
    而比较图像本身的相似程度。Opencv提供的比较方法有四种:
    Correlation 相关性比较
    Chi-Square 卡方比较
    Intersection 十字交叉性
    Bhattacharyya distance 巴氏距离

    1 首先把图像从RGB色彩空间转换到HSV色彩空间cvtColor
    2 计算图像的直方图,然后归一化到[0~1]之间calcHist和normalize;
    3 使用上述四种比较方法之一进行比较compareHist
    1 代码

    package com.xu.test;

    import java.util.stream.Collectors;
    import java.util.stream.Stream;

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.core.MatOfFloat;
    import org.opencv.core.MatOfInt;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;


    /**  
     *
     * @Title: OpenCV.java   
     * @Package com.xu.opencv   
     * @Description: TODO   
     * @author: xuhyacinth     
     * @date: 2020年1月14日20:15:39   
     * @version V-1.0
     * @Copyright: 2019 xuhyacinth
     *
     */
    public class Test {

        static {
            //在使用OpenCV前必须加载Core.NATIVE_LIBRARY_NAME类,否则会报错
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        }

        public static void main(String[] args) {
            compareHist_2();
        }

        /**
         * OpenCV-4.0.0 直方图比较
         *    
         * @return: void  
         * @date: 2020年1月14日20:15:39
         */
        public static void compareHist_1() {
            Mat src = Imgcodecs.imread("C:\Users\Administrator\Pictures\3.jpeg");
            
            Mat hsv = new Mat();
            
            //图片转HSV
            Imgproc.cvtColor(src, hsv,Imgproc.COLOR_BGR2HSV);

            Mat hist = new Mat();
            //直方图计算
            Imgproc.calcHist(Stream.of(hsv).collect(Collectors.toList()),new MatOfInt(0),new Mat(),hist,new MatOfInt(255) ,new MatOfFloat(0,256));
            //图片归一化
            Core.normalize(hist, hist, 1, hist.rows() , Core.NORM_MINMAX, -1, new Mat() );
            //直方图比较
            double a = Imgproc.compareHist(hist,hist,Imgproc.CV_COMP_CORREL);
            System.out.println("越接近1越相识度越高 比较结果:"+a);
        }

        /**
         * OpenCV-4.0.0 直方图比较
         *    
         * @return: void  
         * @date: 2020年1月14日20:15:39
         */
        public static void compareHist_2() {
            Mat src_1 = Imgcodecs.imread("C:\Users\Administrator\Pictures\3_1.jpeg");// 图片 1
            Mat src_2 = Imgcodecs.imread("C:\Users\Administrator\Pictures\3_2.jpeg");// 图片 2

            Mat hvs_1 = new Mat();
            Mat hvs_2 = new Mat();
            //图片转HSV
            Imgproc.cvtColor(src_1, hvs_1,Imgproc.COLOR_BGR2HSV);
            Imgproc.cvtColor(src_2, hvs_2,Imgproc.COLOR_BGR2HSV);

            Mat hist_1 = new Mat();
            Mat hist_2 = new Mat();

            //直方图计算
            Imgproc.calcHist(Stream.of(hvs_1).collect(Collectors.toList()),new MatOfInt(0),new Mat(),hist_1,new MatOfInt(255) ,new MatOfFloat(0,256));
            Imgproc.calcHist(Stream.of(hvs_2).collect(Collectors.toList()),new MatOfInt(0),new Mat(),hist_2,new MatOfInt(255) ,new MatOfFloat(0,256));

            //图片归一化
            Core.normalize(hist_1, hist_1, 1, hist_1.rows() , Core.NORM_MINMAX, -1, new Mat() );
            Core.normalize(hist_2, hist_2, 1, hist_2.rows() , Core.NORM_MINMAX, -1, new Mat() );

            //直方图比较
            double a = Imgproc.compareHist(hist_1,hist_1,Imgproc.CV_COMP_CORREL);
            double b = Imgproc.compareHist(hist_1,hist_2,Imgproc.CV_COMP_CORREL);
            System.out.println("越接近1越相识度越高");
            System.out.println("同一张图片 比较结果(相识度):"+a);
            System.out.println("不同图片 比较结果(相识度):"+b);
        }
        
    }

    2 图片

     



    在这里插入图片描述
    3 结果

    越接近1越相识度越高
    同一张图片    比较结果(相识度):1.0
    不同图片        比较结果(相识度):0.9995354866663728

  • 相关阅读:
    Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
    Android:异步处理之AsyncTask的应用(二)
    Android:异步处理之Handler+Thread的应用(一)
    Android:剖析源码,随心所欲控制Toast显示
    Android:谈一谈安卓应用中的Toast情节(基础)
    Android:一个高效的UI才是一个拉风的UI(二)
    Android:一个高效的UI才是一个拉风的UI(一)
    Intent的那些事儿
    解析BroadcastReceiver之你需要了解的一些东东
    解析Service之你需要了解的一些东东
  • 原文地址:https://www.cnblogs.com/interdrp/p/15434591.html
Copyright © 2011-2022 走看看