反向投影(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 函数计算直方图 • ...
随机推荐
- nginx反向代理下载文件失败处理
最近遇到了客户在从我们的服务器下载文件失败时的情况.然后把解决方案一并整理一下以备后续.需要说明的是,我们前端都是使用nginx来做反向代理,后面的逻辑处理采用php的方式. 1.缓存目录不可写 ng ...
- Djang下载虚拟环境设置
下载安装 教程地址 https://docs.djangoproject.com/en/1.11/howto/windows/ 有一个步骤是创建虚拟环境 创建环境 mkvirtualenv env1 ...
- P1077 摆花
P1077 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花, ...
- SQL Server 2008定期的备份数据库--差异+完整
https://www.cnblogs.com/l1pe1/p/7885207.html https://www.cnblogs.com/tylerflyn/p/8051398.html https: ...
- Struts2 01---环境搭配
开发工具:Eclipse Struts版本:2.3.24 最近在学SSH框架,SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架. ...
- CentOS安装Confluence Wiki步骤
参考:http://supernetwork.blog.51cto.com/2304163/1187066 参考:http://yjiang.tk/?p=1085 需要的文件 CentOS-6.5 ...
- HDU 3032 multi-sg 打表找规律
普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...
- 回溯算法——解决n皇后问题
所谓回溯(backtracking)是通过系统地搜索求解问题的方法.这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易. 不多说,放上n皇后的回溯问题代码 ...
- 【Linux 命令】sed 命令
文章转载自:https://www.jianshu.com/p/779f40985b20 文本分隔:------ # 在每一行后面增加一空行. sed G # 在每一行后面增加两行空行. sed &q ...
- 如何在python的字符串中输入纯粹的{}
python的format函数通过{}来格式化字符串 >>> a='{0}'.format(123) >>> a ' 如果需要在文本中包含{}字符,这样使用就会报错 ...