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越相識度越高\n比較結果:"+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("同一張圖片\t比較結果(相識度):"+a);
        System.out.println("不同圖片\t比較結果(相識度):"+b);
    }
    
}

2 圖片

 



在這里插入圖片描述
3 結果

越接近1越相識度越高
同一張圖片    比較結果(相識度):1.0
不同圖片        比較結果(相識度):0.9995354866663728


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM