热门标签 | 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-

推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • 开发笔记:由数据库某字段存数组引发的json_encode/serialize思考
    开发笔记:由数据库某字段存数组引发的json_encode/serialize思考 ... [详细]
  • 深入解析:OpenShift Origin环境下的Kubernetes Spark Operator
    本文探讨了如何在OpenShift Origin平台上利用Kubernetes Spark Operator来管理和部署Apache Spark集群与应用。作为Radanalytics.io项目的一部分,这一开源工具为大数据处理提供了强大的支持。 ... [详细]
  • 掌握Mosek矩阵运算,轻松应对优化挑战
    本篇文章继续深入探讨Mosek学习笔记系列,特别是矩阵运算部分,这对于优化问题的解决至关重要。通过本文,您将了解到如何高效地使用Mosek进行矩阵初始化、线性代数运算及约束域的设定。 ... [详细]
  • 递归编程不仅是一种优雅的技术,还能让复杂的算法变得简洁高效。尤其在使用如Scala等支持函数式编程的语言时,递归更是不可或缺。本文将通过一个具体的例子,探讨递归的深层魅力。 ... [详细]
  • 当面临数据库清理任务时,若无删除或重建数据库的权限,可以通过编写SQL脚本来实现批量删除用户自定义的数据表和存储过程。本文将详细介绍如何构造这样的SQL脚本。 ... [详细]
  • 本文介绍了一款基于Spark和Scala开发的应用程序,该应用通过配置单元作为输入,经过Spark处理层进行批处理操作,最终数据存储于Cassandra数据库中。文章探讨了如何实现该应用的测试自动化,包括业务逻辑测试、集成测试、用户验收测试(UAT)及回归测试。 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • PySpark实战:高效使用DataFrame超越RDD
    本文深入探讨了PySpark中DataFrame的使用方法及其相对于传统RDD的优势,旨在帮助开发者更好地理解和利用这一强大工具。 ... [详细]
  • 本文深入探讨了Scala中的隐式转换机制,包括其在类扩展、隐式解析规则以及隐式参数和上下文绑定等方面的应用。通过具体示例,详细解释了如何利用隐式转换增强类的功能。 ... [详细]
  • 本文详细介绍了如何配置Apache Flume与Spark Streaming,实现高效的数据传输。文中提供了两种集成方案,旨在帮助用户根据具体需求选择最合适的配置方法。 ... [详细]
  • 本文详细介绍了在使用EmguCV进行图像处理时常用的函数及其应用场景,旨在帮助开发者更好地理解和利用这些工具。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
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社区 版权所有