直方图的反向投影
对一个输入图像完成直方图分布可能性替换,从而找到图像中直方图分布相似或者相同的对象区域
他的Api函数如下
calcBackProject(List<Mat> images, MatOfInt channels, Mat hist, Mat dst, MatOfFloat ranges, double scale)
- images:表示输入图像
- channels:参与计算的图像的通道数据
- hist:预先知道的直方图模型数据
- dst:实处的直方图反向投影结果
- ranges:图像像素对应通道的取值范围
- scale:缩放 默认取1
HSV色彩空间
hsv色彩空间的取值范围
代码演示
//原图片
Mat src = Imgcodecs.imread("C:\\test\\tx.jpg",Imgcodecs.IMREAD_REDUCED_COLOR_2);
//模板图片
Mat simple = Imgcodecs.imread("C:\\test\\hand_simple.png");
//展示
HighGui.imshow("原图",src);
HighGui.imshow("模板图片",simple);
//把模板转换到hsv色彩空间
Mat hsv_temp = new Mat();
Imgproc.cvtColor(simple,hsv_temp, Imgproc.COLOR_BGR2HSV);
//计算模板的直方图
MatOfInt channels =new MatOfInt(0,1);//要计算的通道数,只需要计算H和S通道就行
MatOfInt hitsSize = new MatOfInt(30,32);//bin大小
MatOfFloat ranges = new MatOfFloat(0,179,0,255);//通道的取值范围
Mat hist_temp = new Mat();//输出的直方图
List<Mat> images = new ArrayList<>(Arrays.asList(hsv_temp));//创建要计算的图像
Imgproc.calcHist(images,channels,new Mat(),hist_temp,hitsSize,ranges);//计算直方图
//数据归一化区间[0,255]
Core.normalize(hist_temp,hist_temp,0,255,Core.NORM_MINMAX);
//反向投影
Mat src_hsv = new Mat();
Mat dst = new Mat();
Imgproc.cvtColor(src,src_hsv,Imgproc.COLOR_BGR2HSV);//将原图转换为HSV图像
Imgproc.calcBackProject(Arrays.asList(src_hsv),channels,hist_temp,dst,ranges,1);
HighGui.imshow("反向投影",dst);