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

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

利用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)的更多相关文章

  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. python基础之01数据类型-变量-运算浅解

    python的数据类型 1  数字 数字分为整型(int),长整型(long),浮点型(float),复数(complex) 整型较为常用的功能: >>> a=-4 >> ...

  2. 解决body设置height:100%无效问题

    1. 解决html设置height:100%无效问题 通常我们需要让自己的网页内容能够更好的适配各种屏幕大小,会采用height:100%,但是我们发现问题出来了,height:100%无效,其实解决 ...

  3. Java并发编程原理与实战三十七:线程池的原理与使用

    一.简介 线程池在我们的高并发环境下,实际应用是非常多的!!适用频率非常高! 有过使用过Executors框架的朋友,可能不太知道底层的实现,这里就是讲Executors是由ThreadPoolExe ...

  4. java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别

    java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别 一.java.lang.System.arraycopy() 该方法的声明: /* ...

  5. 最佳的MongoDB客户端管理工具

    <最佳的MongoDB客户端管理工具> 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一个好的MongoD ...

  6. redis 批量删除keys

    “mf*” 为你的key  redis-cli -h 127.0.0.1 -p 6379 -a yourpassword keys “mf*” |xargs  redis-cli -h 127.0.0 ...

  7. <转>Android开发使输入框点击弹出日期选择对话框的方法

    非常简单直接上代码: 转自:http://blog.sina.com.cn/s/blog_4ac1b5f60102vgnx.html final EditText et1=(EditText)find ...

  8. SMTP——MIME

    MIME 基础知识 MIME 表示多用途 Internet 邮件扩允协议.MIME 扩允了基本的面向文本的 Internet 邮件系统,以便可以在消息中包含二进制附件. MIME 信息由正常的 Int ...

  9. 【方法】纯jQuery实现星巴克官网导航栏效果

    前言 大冬天的没得玩,只能和代码玩. 所以就无聊研究了一下星巴克官网,在我看来应该是基本还原吧~ 请各位大神指教! 官网效果图 要写的就是最上方的会闪现的白色条条 效果分析 1.在滚动条往下拉到一定距 ...

  10. APScheduler API -- apscheduler.triggers.date

    apscheduler.triggers.date API Trigger alias for add_job(): date class apscheduler.triggers.date.Date ...