一些小的概念

1.直方图是图像内容的一个重要特性。

2.假设一幅图像的区域中显示的是一种独特的纹理或是一个独特的物体,那么这个区域的直方图能够看作是一个概率函数,它给出的是某个像素属于该纹理或物体的概率。

3.反投影直方图的作用是在于替换一个输入图像中每个像素值,使其变成归一化直方图中相应的概率值。

这是一个什么样的过程

名字听起来感觉非常高端,事实上这个一个非常easy的过程。

1.首先我们截取一个区域,作为目标区域。

2.然后将目标区域取直方图。并将其直方图归一化,并得到这个区域的概率。

3.利用calcBackProject函数在图像中检索。当中函数会利用区域概率,对图像中的像素点经行映射,映射到[0,1]区间,所以要扩大255倍显示。

4.这样一来由于是负图像,所以越暗的地方相似概率越大。

calcBackProject函数

其结构

cv::calcBackProject(&image,//目标图像
1, // 图像个数
channels, // 通道数量
histogram, // 进行反投影的直方图
result, // 结果图像
ranges, // 每一个维度的阈值
255.0 // 放缩因子
);

该过程的实例

我们举个样例来说明上面说到的过程,我两个小婴儿的图像中我们截取婴儿头部皮肤,来检測婴儿全身皮肤在图像中的位置。

代码

#include "cv.h"
#include "highgui.h"
#include "histogram.h"
#include <iostream>
using namespace std; #include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp> class ObjectFinder { private: float hranges[2];
const float* ranges[3];
int channels[3]; float threshold;
cv::MatND histogram;
cv::SparseMat shistogram; public: ObjectFinder() : threshold(0.1f){ ranges[0]= hranges;
ranges[1]= hranges;
ranges[2]= hranges;
} // 设置阈值
void setThreshold(float t) { threshold= t;
} // 返回阈值
float getThreshold() { return threshold;
} // 设置目标直方图,进行归一化
void setHistogram(const cv::MatND& h) {
histogram= h;
cv::normalize(histogram,histogram,1.0);
} // 查找属于目标直方图概率的像素
cv::Mat find(const cv::Mat& image) { cv::Mat result; hranges[0]= 0.0;
hranges[1]= 255.0;
channels[0]= 0;
channels[1]= 1;
channels[2]= 2; cv::calcBackProject(&image,
1,
channels,
histogram,
result,
ranges,
255.0
); // 通过阈值投影获得二值图像
if (threshold>0.0)
cv::threshold(result, result, 255*threshold, 255, cv::THRESH_BINARY); return result;
} }; int main()
{
//读取圆图像
cv::Mat initimage= cv::imread("../2.jpg");
if (!initimage.data)
return 0; //显示原图像
cv::namedWindow("原图像");
cv::imshow("原图像",initimage); //读取灰度图像
cv::Mat image= cv::imread("../2.jpg",0);
if (!image.data)
return 0; //设置目标区域
cv::Mat imageROI;
imageROI= image(cv::Rect(262,151,113,150)); // 区域为小孩的脸部区域 //显示目标区域
cv::namedWindow("目标区域图像");
cv::imshow("目标区域图像",imageROI); //计算目标区域直方图
Histogram1D h;
cv::MatND hist= h.getHistogram(imageROI);
cv::namedWindow("目标区域直方图");
cv::imshow("目标区域直方图",h.getHistogramImage(imageROI)); //创建检查类
ObjectFinder finder;
//将目标区域直方图传入检測类
finder.setHistogram(hist); //初始化阈值
finder.setThreshold(-1.0f); //进行反投影
cv::Mat result1;
result1= finder.find(image); //创建负图像并显示概率结果
cv::Mat tmp;
result1.convertTo(tmp,CV_8U,-1.0,255.0);
cv::namedWindow("负图像概率结果图像越暗概率越大");
cv::imshow("负图像概率结果图像越暗概率越大",tmp); //得到二值反投影图像
finder.setThreshold(0.01f);
result1= finder.find(image); //在图像中绘制选中区域
cv::rectangle(image,cv::Rect(262,151,113,150),cv::Scalar(0,0,0)); //显示原图像
cv::namedWindow("原图像的灰度图");
cv::imshow("原图像的灰度图",image); //二值结果图
cv::namedWindow("二值结果图");
cv::imshow("二值结果图",result1); cv::waitKey();
return 0;
}

输出结果

               -END-

版权声明:本文博主原创文章。博客,未经同意不得转载。

opencv2对于读书笔记——背投影图像的直方图来检测待处理的内容的更多相关文章

  1. opencv2对读书笔记——使用均值漂移算法查找物体

    一些小概念 1.反投影直方图的结果是一个概率映射,体现了已知图像内容出如今图像中特定位置的概率. 2.概率映射能够找到最初的位置,从最初的位置開始而且迭代移动,便能够找到精确的位置,这就是均值漂移算法 ...

  2. opencv2对于读书笔记——二值化——thresholded功能

    opencv二进制图象值功能threshold功能 其结构 double cv::threshold( //二值化函数 const CvArr* src, //原始图像 CvArr* dst, //输 ...

  3. 【python下使用OpenCV实现计算机视觉读书笔记2】图像与字节的变换

    import cv2 import numpy import os # Make an array of 120,000 random bytes. randomByteArray = bytearr ...

  4. 《Effective Java中文版第二版》读书笔记

    说明 这里是阅读<Effective Java中文版第二版>的读书笔记,这里会记录一些个人感觉稍微有些重要的内容,方便以后查阅,可能会因为个人实力原因导致理解有误,若有发现欢迎指出.一些个 ...

  5. ES6读书笔记(二)

    前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,现在为第二篇,本篇内容包括: 一.数组扩展 二.对象扩展 三.函数扩展 四.Set和Map数据结构 五.Reflect 本文 ...

  6. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  7. 《3D Math Primer for Graphics and Game Development》读书笔记2

    <3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...

  8. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  9. 《如何在大学里脱颖而出(How to Win at College)》读书笔记

    <如何在大学里脱颖而出(How to Win at College)>读书笔记 图书简介 中文版: 英文版: 作者卡尔·纽波特(Cal Newport)于 2004 年6月以优等生荣誉学会 ...

随机推荐

  1. 【iOS】文件下载小记

    下载文件到NSURLConnection与NSURLSession两种,一种有恨悠久的历史了. 使用相对麻烦,后者是新出来的,添加了一些额外的功能. 一.NSURLConnection实现下载 TIP ...

  2. Swift编程语言学习10—— 枚举属性监视器

    属性监视器 属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器.甚至新的值和如今的值同样的时候也不例外. 能够为除了延迟存储属性之外的其它存储属性加入属性监视器,也能够通过重载 ...

  3. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  4. Java并发编程(您不知道的线程池操作)

    Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...

  5. Json,Gson,FastJson解析笔记

    Json,Gson,FastJson解析笔记 1.将JavaBean转换成Json对象: public static String CreatJsonFromObject(Object key,Obj ...

  6. HDU 1828 Picture(长方形的周长和)

    HDU 1828 Picture 题目链接 题意:给定n个矩形,输出矩形周长并 思路:利用线段树去维护,分别从4个方向扫一次,每次多一段的时候,就查询该段未被覆盖的区间长度,然后周长就加上这个长度,4 ...

  7. iOS开展-Xcode技巧总结(持续更新)

    1. <LLDB调试命令初探> 2. <Xcode LLDB Debug教程> 3. <iOS开发准备篇-(5)Xcode调试技巧_1> 4. <iOS开发准 ...

  8. Docker创建支持ssh服务的容器和镜像

    原文链接:Docker创建支持ssh服务的容器和镜像 1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后执行 ...

  9. 原创游戏,金庸群侠传X 0.5公布

    首先说一下背景,我个人从小特别爱玩游戏,对小时候一款游戏<金庸群侠传>DOS版更是情有独钟,自己工作以后,利用业余时间自己整了一个原创的改编版丢网上(找图片.音乐.写剧情更是虐心之极,耗时 ...

  10. Java多线程的wait(),notify(),notifyAll()

    在多线程的情况下.因为多个线程与存储空间共享相同的过程,同时带来的便利.它也带来了访问冲突这个严重的问题. Java语言提供了一种特殊的机制来解决这类冲突,避免同一数据对象由多个线程在同一时间访问. ...