Java OpenCV-4.0.0 图像处理20 直方图比较

Java OpenCV-4.0.0 图像处理20 直方图比较

  • 1 代码
  • 2 图片
  • 3 结果

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 图片

Java OpenCV-4.0.0 图像处理20 直方图比较_第1张图片

3 结果

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

你可能感兴趣的:(Java,OpenCV,图形图像,直方图比较,compareHist,Java,OpenCV-4.0.0,OpenCV)