直方图反向投影从零开始实现

本文详细介绍了直方图反向投影的原理和算法流程,通过实例展示了如何从零开始实现这一过程。内容包括:图像特征区域选取、直方图计算与归一化、反向投影及代码实现。最后,对比了自编代码和OpenCV API的处理效果,讨论了组距和图像清晰度对结果的影响。
摘要由CSDN通过智能技术生成

一、反向投影原理
参考博客原址:https://blog.csdn.net/shuiyixin/article/details/80331839
二、算法流程
1、截取输入图像的特征区域。
2、计算图像特征区域的直方图,并归一化,亦即将直方图中的所有值限定在0至255的范围内。
3、将输入图像转换为灰度图像。
4、遍历输入图像的所有像素,并获得所有像素的灰度值,利用灰度值作为图像特征区域的直方图的索引,得到对应的值,最后将该值作为新的灰度值生成新的图像
三、代码主函数部分
1、加载输入图像及其特征区域

	//加载输入图像及其特征区域
	Mat src, gray_src, model, gray_model;
	model = imread("model.jpg");//输入图像的特征区域
	src = imread("target.jpg");//输入图像
	namedWindow("图像特征区域", WINDOW_AUTOSIZE);
	imshow("图像特征区域", model);
	namedWindow("输入图像", WINDOW_AUTOSIZE);
	imshow("输入图像", src);

2、将输入图像及其特征区域转换为灰度图像

	//将图像及其特征区域从RGB色彩空间转换至Gray色彩空间
	cvtColor(src, gray_src, COLOR_BGR2GRAY);
	cvtColor(model, gray_model, COLOR_BGR2GRAY);

3、获取图像特征区域的直方图,并将其归一化至0到255的范围内

	Mat h_hist;
	float hranges[] = {
    0,255 };
	const float *ranges[1] = {
    hranges };
	int bin_w = 1;//组距
	int group_num = 256 / bin_w + 256 % bin_w;//组数
	h_hist = calculate_histogram(gray_model, bin_w);
	h_hist = Normalize(h_hist, 0, 255);

4、绘制特征区域的直方图

	int hist_w = 512;
	int hist_h = 400;
	Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC1);
	for (int i = 1; i < group_num; i++)
	{
   
		line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(h_hist.at<float>(i - 1))),
			Point(bin_w*(i), hist_h - cvRound(h_hist.at<float>(i))), Scalar(255, 255, 255), 2, 8, 0);
	}
	imshow("图像特征区域的直方图", histImage);

5、将特征区域的直方图反向投影

	Mat dst = Back_Project(gray_src, h_hist, bin_w);
	imshow("结果", dst);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值