OpenCV直方图反向投影,直方图是图像内容的一个重要特性。如果图像的某个区域含有特定的纹理或物体,这个区域的直方图就可以看作一个函数,该函数返回某个像素属于这个特殊纹理或物体的概率。本文将介绍如何运用直方图反向投影的概念方便地检测特定的图像内容。
如何实现
假设你希望在某幅图像中检测出特定的内容(例如检测出下图中天上的云彩),首先要做的就是选择一个包含所需样本的感兴趣区域。下图中的该区域就在矩形内部。
在程序中用下面的方法可以得到这个感兴趣区域:
cv::Mat imageROI;
imageROI= image(cv::Rect(216,33,24,30)); // 云彩区域
接着提取该ROI的直方图。使用计算图像直方图的Histogram1D类,能轻松获得该直方图:
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
);
得到的结果就是下面的概率分布图。为提高可读性,对图像做了反色处理,属于该区域的概
率从亮(低概率)到暗(高概率),如下所示。
如果对此图做阈值化处理,就能得到最有可能是“云彩”的像素:
cv::threshold(result, result, threshold, 255, cv::THRESH_BINARY);
得到的结果如下所示。
酷客网相关文章:
评论前必须登录!
注册