直方图是图像内容的一个重要特性。如果图像的某个区域含有特定的纹理或物体,这个区域的直方图就可以看作一个函数,该函数返回某个像素属于这个特殊纹理或物体的概率。那么如何运用直方图反向投影的概念方便地检测特定的图像内容呢?
假设希望在某幅图像中检测出特定的内容,首先要做的
就是选择一个包含所需样本的感兴趣区域。
cv::Mat imageROI;
imageROI= image(cv::Rect(216,33,24,30));
接着提取该 ROI 的直方图,获得该直方图:
Histogram1D h;
cv::Mat hist= h.getHistogram(imageROI);
通过归一化直方图,我们可得到一个函数,由此可得到特定强度值的像素属于这个区域的概率:
cv::normalize(histogram,histogram,1.0);
反向投影直方图的过程包括:从归一化后的直方图中读取概率值并把输入图像中的每个像素替换成与之对应的概率值。OpenCV 中有一个函数可完成此任务:
cv::calcBackProject(&image,
1, // 一幅图像
channels, // 用到的通道,取决于直方图的维度
histogram, // 需要反向投影的直方图
result, // 反向投影得到的结果
ranges, // 值的范围
255.0 // 选用的换算系数
// 把概率值从 1 映射到 255
);
得到的结果就是概率分布图。