反向投影(BackProjection)
如果一幅图像的区域中显示的是一种结构纹理或者一个独特的物体,那么这个区域的直方图可以看作一个概率函数,他给的是某个像素属于该纹理或物体的概率。
所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找测试图像中存在的该特征。
利用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)图像:
反向投影(BackProjection)的更多相关文章
- OpenCV——反向投影(定位模板图像在输入图像中的位置)
反向投影: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namesp ...
- OpenCV---直方图反向投影
一:直方图反向投影的方法 二:二维直方图的表示 (一)直接显示 def hist2D_demo(image): hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) hi ...
- OpenCV2马拉松第10圈——直方图反向投影(back project)
收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影 ...
- opencv——图像直方图与反向投影
引言 在图像处理中,对于直方图这个概念,肯定不会陌生.但是其原理真的可以信手拈来吗? 本文篇幅有点长,在此列个目录,大家可以跳着看: 分析图像直方图的概念,以及opencv函数calcHist()对于 ...
- 墨卡托投影、高斯-克吕格投影、UTM投影及我国分带方法
转自原文 墨卡托投影.高斯-克吕格投影.UTM投影及我国分带方法 一.墨卡托投影.高斯-克吕格投影.UTM投影 1. 墨卡托(Mercator)投影 墨卡托(Mercator)投影,是一种" ...
- opencv6.4-imgproc图像处理模块之直方图与模板
接opencv6.3-imgproc图像处理模块之边缘检测 九.直方图的相关操作 直方图是图像中像素强度分布的图形表达方式:它统计了每一个强度值所具有的像素个数 上图是一个灰色图像,通过对图像的每个不 ...
- CamShift算法
拟采用的方法,CamShift算法,即"Continuously Apative Mean-Shift"算法,是一种运动跟踪算法.它主要通过视频图像中运动物体的颜色信息来达到跟踪的 ...
- opencv学习之旅_绘制跟踪轨迹
如何将运动物体的轨迹画出来 我的想法是先:用CAMSHIFT跟踪物体,这个函数会返回一个track_box,将box的中心提取出来,然后以这个中心在另外的图像上画出来,然后将这张图像处理,提取轮廓,提 ...
- [OpenCV-Python] OpenCV 中的图像处理 部分 IV (五)
部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 22 直方图 22.1 直方图的计算,绘制与分析目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • ...
随机推荐
- css--display属性中inline-block与inline的区别
inline-block 与 inline 的区别: inline-block 与inline 效果类似,但是inline-block是可以设定宽度和高度的!!而行内元素(也就是inline)是无法设 ...
- python线程进程
多道技术: 多道程序设计技术 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬.软件资源.当一道程序因I/O请 ...
- 深入浅出CSS(三):隐藏BOSS大盘点之默认属性小总结
写在前面 严重警告,本文包含大量文字,且无配图,请做好充分心理准备后,再进行阅读! 严重警告,本文包含大量文字,且无配图,请做好充分心理准备后,再进行阅读! 严重警告,本文包含大量文字,且无配图,请做 ...
- eclipse插件之Findbugs、Checkstyle、PMD安装及使用
eclipse插件之Findbugs.Checkstyle.PMD安装及使用 一.什么是Findbugs.checkstyle.PMD Findbugs.checkstyle和PMD都可以作为插件插入 ...
- SQL on Hadoop中用到的主要技术——MPP vs Runtime Framework
转载声明 本文转载自盘点SQL on Hadoop中用到的主要技术,个人觉得该文章对于诸如Impala这样的MPP架构的SQL引擎和Runtime Framework架构的Hive/Spark SQL ...
- Mockserver -MOCO的使用
转自: http://blog.csdn.net/shensky711/article/details/52770686
- @Resource,@Autowired,@Inject3种注入方式
概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ANNOTATION PACKAGE SOURCE @Resource javax ...
- 通过微信公众号ID生成公众号的二维码
username为公众号id http://open.weixin.qq.com/qr/code/?username=wyjiaolian
- Kissy && Require
KISSY add(name?,factory?,deps) 函数挂载在全局对象KISSY上,用来定义模块. 一个 JS 文件包含一个add()(这时路径+文件名可以用作模块名),如果一个文件包 ...
- C#中HttpWebRequest的GetRequestStream执行的效率太低,甚至偶尔死掉
为了提高httpwebrequest的执行效率,查到了一些如下设置 request.ServicePoint.Expect100Continue = false; request.ServicePoi ...