一、反向投影原理
参考博客原址: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);