opencv2对读书笔记——反投影直方图以检测待定的图像内容
来源:互联网 发布:保健品网络推广方案 编辑:程序博客网 时间:2024/06/12 22:54
一些小概念
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 <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-
33 0
- opencv2对读书笔记——反投影直方图以检测待定的图像内容
- opencv2反投影直方图以检测特定的图像内容
- 反射投影直方图以检测待定的图像内容
- OpenCV2编程手册笔记之 4.5反投影直方图以检测特定图像内容
- opencv2利用直方图对图像的反投影算法
- OpenCV【5】---通过反投影直方图以检测特定的图像内容
- opencv2对读书笔记——计算图像的直方图
- opencv2 反向投影直方图检测特定图像内容
- OpenCV—反向投影直方图检测特定图像内容
- 【计算机视觉】反向投影直方图检测特定的图像内容
- Opencv直方图反投影检测颜色
- OpenCV2:图像的直方图
- 图像直方图和反向投影的肤色检测
- opencv2—(7)计算图像的直方图
- opencv2在直方图反投影算法中使用颜色信息
- opencv2对读书笔记——操作图像1
- opencv2 伸展直方图以提高图像对比度
- 图像直方图的反向投影的计算
- server服务配置
- 世界大学学术排名
- 在EXCEL中将数字转换为文本时单元格前边自动加0
- C语言中结构体参数变量的传递
- 为什么会有servlet?
- opencv2对读书笔记——反投影直方图以检测待定的图像内容
- float与double的范围和精度
- TFS配置NameServer
- 黑马程序员_面向对象 封装、继承、多态
- 简单播放音乐
- 代理方法关键字Action与Fun的使用
- All factors of a given number
- leetcode: Wildcard Matching
- Build WebKit on Mac OS X 10.9