您的位置:首页 > 运维架构

OpenCV计算反向投影

2016-04-12 15:30 435 查看
反向投影概念的理解:



首先,对上图红色方框的imgROI区域,计算灰度直方图并进行归一化,

为了好解释,这里假设直方图有5个bin(实际上我的程序为256个bin),归一化范围为0.0-255.0(实际上我的程序为0.0-1.0)

像素值的取值范围是0-51, 51-102, 102-153, 153-204, 204-255

如下图所示:



然后再来一幅的灰度图



遍历该图像的每个像素点的灰度值。

比如点(x, y)的灰度值为120,则它在上图的第三个bin中,该bin的值为255,那么我们就修改点(x, y)的灰度值为255

按照这个做法遍历完所有的像素点之后就得到了一幅新的图像,该图像即为反向投影图,如下图所示:



程序如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

Mat c_srcImg;
Mat g_srcImg;
Mat imgROI;
Mat dstHist;
Mat backprojection;

int main()
{
c_srcImg = imread("1.jpg");

int histSize[1] = {256};
float hranges[2] = {0, 255};
const float* ranges[1] = {hranges};
int channels[1] = {0};

cvtColor(c_srcImg, g_srcImg, COLOR_RGB2GRAY);
imgROI = g_srcImg(Rect(360, 55, 40, 50));
rectangle(c_srcImg, Rect(360, 55, 40, 50), Scalar(0, 0, 255));
imshow("c_srcImage", c_srcImg);

calcHist(&imgROI, 1, channels, Mat(), dstHist, 1, histSize, ranges);
//通过归一化该直方图,我们得到一个函数,它给出了一个给定强度的像素属于imgROI区域的概率
normalize(dstHist,	//输入直方图
dstHist,		//输出直方图(可以原地址计算)
0.0,			//缩放的最小值
1.0,			//缩放的最大值
NORM_MINMAX		//缩放类型
);
//反向投影的作用是替换输入图像中的每个像素值,使其变成归一化直方图中对应的概率值
calcBackProject(&g_srcImg,
1,					//一幅图像
channels,			//通道数量
dstHist,			//进行反射投影的直方图
backprojection,		//生成的反射投影图像
ranges,				//每个维度的值域
255.0				//缩放因子
);
imshow("backprojection", backprojection);

waitKey(0);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: