您的位置:首页 > 编程语言 > Qt开发

Qt 5.3 下OpenCV 2.4.11 开发(7)单通道直方图绘制

2015-07-31 15:38 453 查看
函数中主要使用的 calcHist() 函数来统计一个直方图,直方图统计类的头文件和源文件,头文件代码如下:

#ifndef HISTOGRAM1D_H
#define HISTOGRAM1D_H

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

class Histogram1D
{
public:
Histogram1D();
MatND getHistogram(const Mat &source);
Mat getHistogramImage(const Mat &source);

private:
int histSize[1];    //直方图项数
int channels[1];    //通道数量
float histMinMax[2];    //像素最小值最大值
const float* ranges[1]; //像素值范围
};

#endif // HISTOGRAM1D_H


源文件代码如下:

#include "histogram1d.h"

Histogram1D::Histogram1D()
{
//1D参数初始化
histSize[0] = 256;
histMinMax[0] = 0.0;
histMinMax[1] = 255.0;
ranges[0] = histMinMax;
channels[0] = 0;
}

MatND Histogram1D::getHistogram(const Mat &source)
{
MatND Hist;
calcHist(&source, 1, channels, Mat(), Hist, 1, histSize, ranges);
return Hist;
}

Mat Histogram1D::getHistogramImage(const Mat &source)
{
MatND hist = getHistogram(source);//计算直方图
double maxVal = 0;
double minVal = 0;
minMaxLoc(hist, &minVal, &maxVal);//获取最大值和最小值
Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255));//用于显示直方图图像
int topPoint = static_cast<int>(0.9*histSize[0]);
for ( int i = 0; i < histSize[0]; i ++ )
{
float binVal = hist.at<float>(i);
int intensity = static_cast<int>(binVal*topPoint/maxVal);
line(histImg, Point(i, histSize[0]), Point(i, histSize[0]-intensity),
Scalar::all(0));
}
return histImg;
}


main.cpp 代码段如下:

#include <QCoreApplication>
#include <histogram1d.h>

using namespace cv;
using namespace std;

int main()
{
Mat src = imread("lena.jpg",0);
Histogram1D Hg;
Mat HistImg = Hg.getHistogramImage(src);
namedWindow("HistImg", 0);
imshow("HistImg", HistImg);
waitKey(0);
return 0;
}


函数介绍:

void calcHist(const Mat* arrays,        //输入的源图像
int narrays,            //计算直方图数量
const int* channels,    //通道数量
InputArray mask,        //掩码
OutputArray hist,       //返回的直方图
int dims,               //维数
const int* histSize,    //直方图项数
const float** ranges,   //像素值范围
bool uniform = true,//
bool accumulate = false );//
2、MatND 类型是一个通用类,可以操作N维矩阵。他也定义了一维、二维、三维矩阵的 at 方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: