您的位置:首页 > 运维架构

opencv2学习笔记:4.2计算图像直方图

2014-02-13 21:30 676 查看
          根据这个代码做一遍,理解一下意思,就基本能懂得原理了。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "cv.h"
#include <iostream>

using namespace std;

class HistogramiD
{
private:
int histSize[1];//项的数量
float hranges[2];//像素的最小及最大值
const float*ranges[1];
int channels[1];//仅用到一个通道
public:
HistogramiD()
{
//准备1D直方图的参数
histSize[0]=256;
hranges[0]=0.0;
hranges[1]=255.0;
ranges[0]=hranges;
channels[0]=0;//默认情况,我们考察0通道
}
cv::MatND getHistogram(const cv::Mat &image)
{
cv::MatND hist;
//计算直方图
cv::calcHist(&image,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
}

cv::Mat getHistogramImage(const cv::Mat &image)
{
//首先计算直方图
cv::MatND hist=getHistogram(image);
//计算出最大最小值
double maxVal=0;
double minVal=0;
cv::minMaxLoc(hist,&minVal,&maxVal,0,0);
//做一大小为256*256全白的图,以备下面画直方图
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);
//图形坐标是从左到右增大即:0~256;从上到下增大,即:0~256;
cv::line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
//cv::line(histImg,cv::Point(h/2,histSize[0]/2),cv::Point(h/2,0),cv::Scalar::all(100));
}
return histImg;

}
};

int main()
{
cv::Mat image=cv::imread("grayCat.png") ;
HistogramiD h;
cv::MatND histo=h.getHistogram(image);
for(int i=0;i<256;i++)
{
cout<<"Value"<<i<<"="<<histo.at<float>(i)<<endl;//显示像素的数值分布
}
cv::namedWindow("Histogram");
cv::imshow("Histogram",h.getHistogramImage(image));//像素的直方图分布
cv::waitKey(20000);
return 1;
}

注意:图像的坐标,跟平时的我们数学中的坐标是不一样的。





右边的为直方图。



这个是各个像素的值个数,根据不同的个数得到直方图,当然直方图更容易理解图中像素的大致分布情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv2 灰度直方图