#ifndef HISTOGRAM_H_
#define HISTOGRAM_H_
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include<iostream>
#include <vector> using namespace std;
using namespace cv; class Histogram1D
{
private:
int histSize[1];
float hranges[2];
const float *ranges[1];
int channels[1];
public:
Histogram1D();
cv::MatND getHistogram(const cv::Mat &image);
cv::Mat getHistogramImage(const cv::Mat &image);
cv::Mat applyLookUp(const cv::Mat &image,const cv::Mat &lookup);
cv::Mat stretch(const cv::Mat &image,int minValue=0);
cv::Mat equalize(const cv::Mat &image);
cv::Mat calcBack(const cv::Mat &image,const cv::MatND hist);
cv::Mat threShold(const cv::Mat &image);
}; #endif /* HISTOGRAM_H_ */
#include"Histogram1D.h"
Histogram1D::Histogram1D()
{
histSize[0]=256;
hranges[0]=0.0;
hranges[1]=255.0;
ranges[0]=hranges;
channels[0]=0;
};
cv::MatND Histogram1D::getHistogram(const cv::Mat &image)
{
cv::MatND hist;
cv::calcHist(&image,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
};
cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image)
{
cv::MatND hist=getHistogram(image);
double maxVal=0;
double minVal=0;
cv::minMaxLoc(hist,&minVal,&maxVal,0,0);
cv::Mat histImg(histSize[0],histSize[0],CV_8U,cv::Scalar(255));
int hpt=static_cast<int>(0.9*histSize[0]);
for(int h=0;h<histSize[0];h++)
{
float binVal=hist.at<float>(h);
int intensity=static_cast<int>(binVal*hpt/maxVal);
cv::line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
}
return histImg;
};
cv::Mat Histogram1D::applyLookUp(const cv::Mat &image,const cv::Mat &lookup)
{
cv::Mat result;
cv::LUT(image,lookup,result);
return result;
}
cv::Mat Histogram1D::stretch(const cv::Mat &image,int minValue)
{
cv::MatND hist=getHistogram(image);
int imin=0;
for(;imin<histSize[0];imin++)
{
std::cout<<hist.at<float>(imin)<<std::endl;
if(hist.at<float>(imin)>minValue)
break;
}
int imax=histSize[0]-1;
for(;imax>=0;imax--)
{
if(hist.at<float>(imax)>minValue)
break;
}
int dim(256);
cv::Mat lookup(1,&dim,CV_8U);
for(int i=0;i<256;i++)
{
if(i<imin)lookup.at<uchar>(i)=0;
else if(i>imax)lookup.at<uchar>(i)=255;
else lookup.at<uchar>(i)=static_cast<uchar>(255.0*(i-imin)/(imax-imin)+0.5);
}
cv::Mat result;
result=applyLookUp(image,lookup);
return result;
}
cv::Mat Histogram1D::equalize(const cv::Mat &image)
{
cv::Mat result;
cv::equalizeHist(image,result);
return result;
}
cv::Mat Histogram1D::calcBack(const cv::Mat &image,const cv::MatND hist)
{
cv::Mat result;
cv::calcBackProject(&image,1,channels,hist,result,ranges,255.0);
return result;
}
cv::Mat Histogram1D::threShold(const cv::Mat &image)
{
cv::Mat thresholded;
cv::threshold(image,thresholded,0,255,cv::THRESH_BINARY);
return thresholded;
}
#include"Histogram1D.h" int main()
{
cv::Mat image=cv::imread("d:\\test\\opencv\\waves.jpg",0);
if( !image.data ) exit(0);
cv::Mat imageROI;
imageROI=image(cv::Rect(360,55,40,50)); cv::Mat back;
cv::Mat result; Histogram1D h;
cv::MatND hist=h.getHistogram(imageROI); namedWindow("hist");
imshow("hist",h.getHistogramImage(imageROI)); cv::normalize(hist,hist,1.0);
back=h.calcBack(image,hist);
result=h.threShold(back); namedWindow("Backprojection");
imshow("Backprojection",back); namedWindow("Detection Result");
imshow("Detection Result",result); waitKey(0);
return 0;
}

opencv2反投影直方图以检測特定的图像内容的更多相关文章

  1. 利用opencv中的级联分类器进行人脸检測-opencv学习(1)

    OpenCV支持的目标检測的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本号的C++接口除了Haar特征以外 ...

  2. Viola-Jones人脸检測

    OpenCV中有一个基于树的技术:Haar分类器,它建立了boost筛选式级联. 它能够识别出人脸和其它刚性物体. 对于检測"基本刚性"的物体(脸,汽车,自行车,人体等)这类识别任 ...

  3. OpenCV2马拉松第22圈——Hough变换直线检測原理与实现

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...

  4. OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)

    收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的 ...

  5. openCV2马拉松第19圈——Harris角点检測(自己实现)

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...

  6. OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)

    收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...

  7. OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...

  8. OpenCV特征点检測------Surf(特征点篇)

    Surf(Speed Up Robust Feature) Surf算法的原理                                                              ...

  9. 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

随机推荐

  1. 关于Linux下安装Oracle时报错:out of memory的问题分析说明

    一.说明 在Oracle安装过程中,可能遇到out of memory这种错误,这是由于系统内存不足导致!我们可以通过加内存的方式解决! 而如果是另一种情况呢: 例如我在主机上装了两个Oracle服务 ...

  2. vue.js+element-ui

    git地址:https://github.com/jerry9022/LitAdmin vue.js+element-ui 做后台管理系统 太方便了

  3. POJ-1442 Black Box,treap名次树!

                                                      Black Box 唉,一天几乎就只做了这道题,成就感颇低啊! 题意:有一系列插入查找操作,插入每次 ...

  4. 【Kubernetes】离线业务:Job与CronJob

    Deployment.StatefulSet和DaemonSet这三个编排概念编排的对象主要都是在线业务(Long Running Task,这些应用一旦运行起来,除非出错或者停止,它的容器进程会一直 ...

  5. 九度oj 题目1283:第一个只出现一次的字符

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据 每一组输入一个字符串. 输出: 输出第一个只出现一次的 ...

  6. 九度oj 题目1028:继续畅通工程

    题目描述:     省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用 ...

  7. iOS阴影

    但是如果把masksToBounds设置为yes就没有阴影了     UIButton *view = [[UIButton alloc]initWithFrame:CGRectMake(, , ,  ...

  8. Spring的@Configuration来代替xml配置

    一. Xml配置法 下面是一个典型的spring配置文件(application-config.xml): [xml] view plain copy <beans> <bean i ...

  9. Mac VMware Fusion Centos7 静态ip配置

    一直没用mac装过虚拟机,最近因为一些原因不得不装一个,但是被这个静态ip配置把头都搞痛了(这里吐槽一下百度,我前几页都看了几遍,搜索关键字就是我现在的标题,结果都是一些抄抄抄并且不管用的攻略,最后使 ...

  10. oracle怎么查看表空间里有哪些表

    select TABLE_NAME,TABLESPACE_NAME from dba_tables where TABLESPACE_NAME='表空间名'; 注意:表空间名要大写