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

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

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

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

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

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

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

代码如下:

backprojection.h

  1. #ifndef BACKPROJECTION_H
  2. #define BACKPROJECTION_H
  3.  
  4. #include <opencv2/imgproc/imgproc.hpp>
  5. #include <opencv2/highgui/highgui.hpp>
  6. #include <iostream>
  7.  
  8. //全局函数/////////////////////////////////
  9. void hist_and_backprojection(int, void* );
  10.  
  11. #endif // BACKPROJECTION_H

backprojection.cpp

  1. #include "backprojection.h"
  2.  
  3. extern cv::Mat src, hsv, hue;
  4. extern int bins;
  5.  
  6. void hist_and_backprojection(int, void* )
  7. {
  8. cv::MatND hist;
  9. //直方图bin的数目大小
  10. int histSize = cv::max(bins, );
  11. float hue_range[] = {, };
  12. const float *ranges = { hue_range };
  13.  
  14. //计算直方图并归一化
  15. cv::calcHist(&hue,
  16. , //图像数量
  17. , //通道数
  18. cv::Mat(), //不使用掩膜
  19. hist,
  20. , //直方图维度
  21. &histSize, //每一维直方图bin的数目
  22. &ranges, //每一维直方图的范围
  23. true,
  24. false
  25. );
  26. //将直方图bin的数值归一化到0-255,可方便直接显示反向投影图
  27. cv::normalize(hist, hist, , , cv::NORM_MINMAX, -, cv::Mat());
  28.  
  29. //计算反向投影
  30. cv::MatND backproj;
  31. cv::calcBackProject(&hue,
  32. , //源图像的数目
  33. , //用于计算反向投影值的通道列表
  34. hist, //输入直方图
  35. backproj, //单通道反向投影图像
  36. &ranges, //每一维直方图bin的范围
  37. ,
  38. true);
  39.  
  40. //显示反向投影图
  41. cv::namedWindow("BackProjection");
  42. cv::imshow("BackProjection", backproj);
  43.  
  44. //显示直方图
  45. int w = , h = ;
  46. int bin_w = cvRound((double)w / histSize);
  47. cv::Mat histImg = cv::Mat::zeros( w, h, CV_8UC3 );
  48.  
  49. for(int i = ; i < bins; i++)
  50. {
  51. cv::rectangle(histImg,
  52. cv::Point(i*bin_w, h),
  53. cv::Point((i+)*bin_w, h - cvRound(hist.at<float>(i) * h / 255.0) ),
  54. cv::Scalar(, , ),
  55. -);
  56. }
  57. cv::namedWindow("Histogram");
  58. cv::imshow("Histogram", histImg);
  59. }

main.cpp

  1. #include <QtCore/QCoreApplication>
  2. #include "backprojection.h"
  3.  
  4. //全局变量/////////////////////////////////
  5. cv::Mat src, hsv, hue;
  6. int bins = ;
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10. // QCoreApplication a(argc, argv);
  11. // return a.exec();
  12.  
  13. src = cv::imread("../image/HandIndoorColor.jpg", );
  14.  
  15. //转换到HSV
  16. cv::cvtColor(src, hsv, cv::COLOR_RGB2HSV);
  17.  
  18. cv::namedWindow("hsvImg");
  19. cv::imshow("hsvImg", hsv);
  20.  
  21. //分离Hue通道(即色相通道)
  22. hue.create(hsv.size(), hsv.depth());
  23. int ch[] = {, };
  24. cv::mixChannels(&hsv, , &hue, , ch, );
  25.  
  26. //创建Trackbar来输入bin的数目
  27. const char *window_image = "Source image";
  28. cv::namedWindow(window_image, cv::WINDOW_AUTOSIZE);
  29. cv::createTrackbar("* Hue bins: ",window_image, &bins, ,
  30. hist_and_backprojection //回调函数
  31. );
  32. hist_and_backprojection(, );
  33.  
  34. cv::imshow(window_image, src);
  35.  
  36. //等待用户反应
  37. cv::waitKey();
  38. return ;
  39. }

运行结果图:

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

HSV颜色空间图像:

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

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

反向投影(BackProjection)的更多相关文章

  1. OpenCV——反向投影(定位模板图像在输入图像中的位置)

    反向投影: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namesp ...

  2. OpenCV---直方图反向投影

    一:直方图反向投影的方法 二:二维直方图的表示 (一)直接显示 def hist2D_demo(image): hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) hi ...

  3. OpenCV2马拉松第10圈——直方图反向投影(back project)

    收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影 ...

  4. opencv——图像直方图与反向投影

    引言 在图像处理中,对于直方图这个概念,肯定不会陌生.但是其原理真的可以信手拈来吗? 本文篇幅有点长,在此列个目录,大家可以跳着看: 分析图像直方图的概念,以及opencv函数calcHist()对于 ...

  5. 墨卡托投影、高斯-克吕格投影、UTM投影及我国分带方法

    转自原文 墨卡托投影.高斯-克吕格投影.UTM投影及我国分带方法 一.墨卡托投影.高斯-克吕格投影.UTM投影 1. 墨卡托(Mercator)投影 墨卡托(Mercator)投影,是一种" ...

  6. opencv6.4-imgproc图像处理模块之直方图与模板

    接opencv6.3-imgproc图像处理模块之边缘检测 九.直方图的相关操作 直方图是图像中像素强度分布的图形表达方式:它统计了每一个强度值所具有的像素个数 上图是一个灰色图像,通过对图像的每个不 ...

  7. CamShift算法

    拟采用的方法,CamShift算法,即"Continuously Apative Mean-Shift"算法,是一种运动跟踪算法.它主要通过视频图像中运动物体的颜色信息来达到跟踪的 ...

  8. opencv学习之旅_绘制跟踪轨迹

    如何将运动物体的轨迹画出来 我的想法是先:用CAMSHIFT跟踪物体,这个函数会返回一个track_box,将box的中心提取出来,然后以这个中心在另外的图像上画出来,然后将这张图像处理,提取轮廓,提 ...

  9. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (五)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 22 直方图 22.1 直方图的计算,绘制与分析目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • ...

随机推荐

  1. nginx反向代理下载文件失败处理

    最近遇到了客户在从我们的服务器下载文件失败时的情况.然后把解决方案一并整理一下以备后续.需要说明的是,我们前端都是使用nginx来做反向代理,后面的逻辑处理采用php的方式. 1.缓存目录不可写 ng ...

  2. Djang下载虚拟环境设置

    下载安装 教程地址 https://docs.djangoproject.com/en/1.11/howto/windows/ 有一个步骤是创建虚拟环境 创建环境 mkvirtualenv env1 ...

  3. P1077 摆花

    P1077 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花, ...

  4. SQL Server 2008定期的备份数据库--差异+完整

    https://www.cnblogs.com/l1pe1/p/7885207.html https://www.cnblogs.com/tylerflyn/p/8051398.html https: ...

  5. Struts2 01---环境搭配

    开发工具:Eclipse   Struts版本:2.3.24  最近在学SSH框架,SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架. ...

  6. CentOS安装Confluence Wiki步骤

    参考:http://supernetwork.blog.51cto.com/2304163/1187066 参考:http://yjiang.tk/?p=1085   需要的文件 CentOS-6.5 ...

  7. HDU 3032 multi-sg 打表找规律

    普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...

  8. 回溯算法——解决n皇后问题

    所谓回溯(backtracking)是通过系统地搜索求解问题的方法.这种方法适用于类似于八皇后这样的问题:求得问题的一个解比较困难,但是检查一个棋局是否构成解很容易. 不多说,放上n皇后的回溯问题代码 ...

  9. 【Linux 命令】sed 命令

    文章转载自:https://www.jianshu.com/p/779f40985b20 文本分隔:------ # 在每一行后面增加一空行. sed G # 在每一行后面增加两行空行. sed &q ...

  10. 如何在python的字符串中输入纯粹的{}

    python的format函数通过{}来格式化字符串 >>> a='{0}'.format(123) >>> a ' 如果需要在文本中包含{}字符,这样使用就会报错 ...