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

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

利用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. 视音频数据处理入门:RGB、YUV像素数据处理

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  2. Codeforces Round #476 (Div. 2) [Thanks, Telegram!] C

    http://codeforces.com/contest/965/problem/C 题目大意:n个糖,k个人,每次最多只能拿M个糖,从第一个人开始拿,可以循环D次.问Arkady最多可以拿几块糖? ...

  3. SQL语句(十八_补充)——存储过程

    一. 变量 1. 形式: @x (局部), @@x(全局) 2. 定义: declare @x 3. 赋值:Set @x = ? 4. 作用: 通用化 存储在服务器 5. 存储过程(预编译过的T-SQ ...

  4. Java时间格式转换工具类

    把当前时间修改成指定时间 //把当前时间修改成指定时间 public String dateUtil(Integer seconds, String dateFormatPattern){ Date ...

  5. Java并发编程原理与实战四:线程如何中断

    如果你使用过杀毒软件,可能会发现全盘杀毒太耗时间了,这时你如果点击取消杀毒按钮,那么此时你正在中断一个运行的线程. java为我们提供了一种调用interrupt()方法来请求终止线程的方法,下面我们 ...

  6. [转载]RSA算法详解

    原文:http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

  7. 【BZOJ】3453: tyvj 1858 XLkxc 拉格朗日插值(自然数幂和)

    [题意]给定k<=123,a,n,d<=10^9,求: $$f(n)=\sum_{i=0}^{n}\sum_{j=1}^{a+id}\sum_{x=1}^{j}x^k$$ [算法]拉格朗日 ...

  8. 外卖(food) & 洛谷4040宅男计划 三分套二分&贪心

    food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久.    外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 Si ...

  9. git 配置 SSH密钥

    1.登录用户 $ git config --global user.name "geekfeier" $ git config --global user.email " ...

  10. Tslib移植与分析【转】

    转自:http://blog.csdn.net/water_cow/article/details/7215308 目标平台:LOONGSON-1B开发板(mips32指令集)编译平台:x86PC-- ...