热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

opencv2对读书笔记反投影直方图以检测待定的图像内容-mysql教程

一些小概念1.直方图是图像内容的一个重要特性。2.如果一幅图像的区域中显示的是一种独特的纹理或是一个独特的物体,那么这个区域的直方图可以看作是一个概率函数,它给出的是某个像素属于该纹理或物体的概率。3.反投影直方图的作用是在于替换一个输入图像

一些小概念 1.直方图是图像内容的一个重要特性。 2.如果一幅图像的区域中显示的是一种独特的纹理或是一个独特的物体,那么这个区域的直方图可以看作是一个概率函数,它给出的是某个像素属于该纹理或物体的概率。 3.反投影直方图的作用是在于替换一个输入图像

一些小概念


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

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

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


这是一个什么样的过程


名字听起来感觉很高端,其实这个一个很简单的过程。

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 
using namespace std;

#include 
#include 

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-

推荐阅读
  • 移动端浏览器为了识别用户的双击放大操作,通常会在点击后引入300毫秒的延迟。虽然这种延迟在日常使用中可能不易察觉,但对于需要即时响应的应用(如网页游戏)来说,消除这一延迟至关重要。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文通过两个具体案例——共同好友查找和线段重叠分析,展示了如何利用Scala编程语言解决实际问题。案例一探讨了如何在社交网络中找出两个用户之间的共同好友;案例二则深入解析了如何计算多条线段之间的重叠情况。 ... [详细]
  • 基于OpenCV的小型图像检索系统开发指南
    本文详细介绍了如何利用OpenCV构建一个高效的小型图像检索系统,涵盖从图像特征提取、视觉词汇表构建到图像数据库创建及在线检索的全过程。 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • OpenCV中的霍夫圆检测技术解析
    本文详细介绍了如何使用OpenCV库中的HoughCircles函数实现霍夫圆检测,并提供了具体的代码示例及参数解释。 ... [详细]
  • 本文介绍如何通过参数化查询来防止SQL注入攻击,确保数据库的安全性。示例代码展示了在C#中使用参数化查询添加学生信息的方法。 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
author-avatar
iar2984165
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有