如果一幅图像的区域中显示的是一种结构纹理或者一个独特的物体,那么这个区域的直方图可以看作一个概率函数,他给的是某个像素属于该纹理或物体的概率。

所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找测试图像中存在的该特征。

利用Hue直方图解释反向投影原理:

1、获取测试图像中每个像素的hue数据 hi,j,并找到 hi,j 在hue直方图中的bin的位置。

2、查询hue直方图中对应bin的数值。

3、将该数值存储在新的图像中(BackProjection),也可以先归一化hue直方图数值到0-255范围,这样可以直接显示BackProjection图像(单通道图像)。

4、通过对测试图像每个像素采取以上步骤,可以得到最终的BackProjection图像。

代码如下:

backprojection.h

#ifndef BACKPROJECTION_H
#define BACKPROJECTION_H #include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream> //全局函数/////////////////////////////////
void hist_and_backprojection(int, void* ); #endif // BACKPROJECTION_H

backprojection.cpp

#include "backprojection.h"

extern cv::Mat src, hsv, hue;
extern int bins; void hist_and_backprojection(int, void* )
{
cv::MatND hist;
//直方图bin的数目大小
int histSize = cv::max(bins, );
float hue_range[] = {, };
const float *ranges = { hue_range }; //计算直方图并归一化
cv::calcHist(&hue,
, //图像数量
, //通道数
cv::Mat(), //不使用掩膜
hist,
, //直方图维度
&histSize, //每一维直方图bin的数目
&ranges, //每一维直方图的范围
true,
false
);
//将直方图bin的数值归一化到0-255,可方便直接显示反向投影图
cv::normalize(hist, hist, , , cv::NORM_MINMAX, -, cv::Mat()); //计算反向投影
cv::MatND backproj;
cv::calcBackProject(&hue,
, //源图像的数目
, //用于计算反向投影值的通道列表
hist, //输入直方图
backproj, //单通道反向投影图像
&ranges, //每一维直方图bin的范围
,
true); //显示反向投影图
cv::namedWindow("BackProjection");
cv::imshow("BackProjection", backproj); //显示直方图
int w = , h = ;
int bin_w = cvRound((double)w / histSize);
cv::Mat histImg = cv::Mat::zeros( w, h, CV_8UC3 ); for(int i = ; i < bins; i++)
{
cv::rectangle(histImg,
cv::Point(i*bin_w, h),
cv::Point((i+)*bin_w, h - cvRound(hist.at<float>(i) * h / 255.0) ),
cv::Scalar(, , ),
-);
}
cv::namedWindow("Histogram");
cv::imshow("Histogram", histImg);
}

main.cpp

#include <QtCore/QCoreApplication>
#include "backprojection.h" //全局变量/////////////////////////////////
cv::Mat src, hsv, hue;
int bins = ; int main(int argc, char *argv[])
{
// QCoreApplication a(argc, argv);
// return a.exec(); src = cv::imread("../image/HandIndoorColor.jpg", ); //转换到HSV
cv::cvtColor(src, hsv, cv::COLOR_RGB2HSV); cv::namedWindow("hsvImg");
cv::imshow("hsvImg", hsv); //分离Hue通道(即色相通道)
hue.create(hsv.size(), hsv.depth());
int ch[] = {, };
cv::mixChannels(&hsv, , &hue, , ch, ); //创建Trackbar来输入bin的数目
const char *window_image = "Source image";
cv::namedWindow(window_image, cv::WINDOW_AUTOSIZE);
cv::createTrackbar("* Hue bins: ",window_image, &bins, ,
hist_and_backprojection //回调函数
);
hist_and_backprojection(, ); cv::imshow(window_image, src); //等待用户反应
cv::waitKey();
return ;
}

运行结果图:

滑动条用于调节直方图bin的数目。

HSV颜色空间图像:

调节不同bin的数目对应的Hue直方图:

调节不同bin的数目对应的反向投影(BackProjection)图像:

最新文章

  1. WPF CheckBox 自定义样式
  2. java高新技术-类加载器
  3. android baseActivity
  4. linux下vim的常用指令
  5. 使用mysqlbinlog server远程备份binlog的脚本
  6. andorid源码中察看版本
  7. Mysql数据库导入命令Source详解
  8. 算术编码JM实现
  9. (转载)mysql 存在该记录则更新,不存在则插入记录的sql
  10. SVG 和字符图标
  11. 次小生成树学习+例题 poj 1679 The Unique MST
  12. java swing中Timer类的学习
  13. SVN使用教程2017.10.6
  14. 『简单积性函数和dirichlet卷积』
  15. seed实验——Set-UID Program Vulnerability实验
  16. 【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)
  17. 关于C++中Hash的应用
  18. java中path和CLASSPATH的配置和意义解析
  19. mongodb+nodejs
  20. java rsa 公钥加密

热门文章

  1. css基础--常用css属性01
  2. 解决Pytohn安装第三方库出现read timed out 问题
  3. P1993 小K的农场 &amp;&amp; 差分约束
  4. 针对《面试心得与总结—BAT、网易、蘑菇街》一文中出现的技术问题的收集与整理
  5. css overflow用法
  6. RabbitMQ消息队列里积压很多消息
  7. [Luogu 2169] 正则表达式
  8. C语言入门教程-(1)简介及搭建环境
  9. 【leetcode 简单】 第八十二题 反转字符串
  10. 13、Math类简介