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

来源:互联网 发布:淘宝美工详情页 编辑:程序博客网 时间:2024/05/22 03:06

函数中主要使用的 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 方法。


0 0
原创粉丝点击