[OpenCV学习日记-java]-16-直方图反向投影

直方图的反向投影

对一个输入图像完成直方图分布可能性替换,从而找到图像中直方图分布相似或者相同的对象区域

他的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);

在这里插入图片描述


上一篇[OpenCV学习日记-java]-15-图像直方图

下一篇[OpenCV学习日记-java]-17-模板匹配

发布了45 篇原创文章 · 获赞 42 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_18604209/article/details/104187849