Java OpenCV 图像处理21 直方图反向投影
Java OpenCV-4.0.0 直方图反向投影
反向投影是反映直方图模型在目标图像中的分布情况。
简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型。
1.建立直方图模型
2.计算待测图像直方图并映射到模型中
3.从模型反向计算生成图像
加载图片imread
将图像从RGB色彩空间转换到HSV色彩空间cvtColor
计算直方图和归一化calcHist与normalize
计算反向投影图像 - calcBackProject
package com.xu.opencv;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
/**
*
* @Title: Image.java
* @Description: OpenCV-4.0.0 测试文件
* @Package com.xu.test
* @author: xuhyacinth
* @date: 2019年5月7日12:04:04
* @version: V-1.0.0
* @Copyright: 2019 xuhyacinth
*
*/
public class Image {
static {
// Java 在使用 OpenCV 前必须加载 Core.NATIVE_LIBRARY_NAME 类,否则会报错
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) throws Exception {
calcBackProject();
}
/**
* OpenCV-4.0.0 直方图反向投影
* @return: void
* @date: 2019年5月7日12:04:04
*/
public static void calcBackProject() {
Mat src = Imgcodecs.imread("C:\\Users\\Administrator\\Pictures\\111.png");
Mat hsv = new Mat();
//1 图片转HSV
Imgproc.cvtColor(src, hsv, Imgproc.COLOR_BGR2HSV);
//2 计算直方图
List<Mat> listmat = new ArrayList<>();
listmat.add(hsv);
Mat histimage = new Mat();
Imgproc.calcHist(listmat, new MatOfInt(0), new Mat(), histimage, new MatOfInt(255), new MatOfFloat(0, 255));
//3 归一化
Core.normalize(histimage, histimage, 1, histimage.rows(), Core.NORM_MINMAX, -1, new Mat());
//4 直方图反向投影
Mat backimage = new Mat();
Imgproc.calcBackProject(listmat, new MatOfInt(0), histimage, backimage, new MatOfFloat(0, 255), 2.0);
HighGui.imshow("直方图反向投影", backimage);
HighGui.waitKey(0);
}
}