opencv学习(二)计算图像的直方图和表示为柱状图

来源:互联网 发布:网络评卷系统 编辑:程序博客网 时间:2024/06/14 21:54

1.直方图:直方图是一个简单的表,它给出了一幅图像或者一组图像中拥有给定数值的像素数量,因此,灰度图像的直方图有256个条目(或称为容器),0号容器给出像素值为0的像素个数、1号容器给出……;对直方图的所有项求和会得到像素的总数;直方图也可以归一化,归一化后所有项的和为1,每一项就成为了比例。

2.

//计算图像的直方图和表示为柱状图#include<opencv2\opencv.hpp>#include<iostream>using namespace cv;using namespace std;class Histogram1D{private:    int histSize[1];     //直方图项的数量    float hranges[2];    //像素的最大值和最小值    const float* ranges[1];    int channels[1];  //仅用到一个通道public:    Histogram1D(){        //准备1D直方图的参数        histSize[0] = 256;        hranges[0] = 0.0;        hranges[1] = 255.0;        ranges[0] = hranges;        channels[0] = 0;  //默认情况考察0号通道    }    MatND getHistogram(const Mat image){        MatND hist;        calcHist(&image, 1, channels, Mat(), hist, 1, histSize, ranges);        return hist;    }    Mat getHistogramImage(const Mat &image){        MatND hist = getHistogram(image);   //首先计算直方图        double maxVal = 0;        double minVal = 0;        minMaxLoc(hist, &minVal, &maxVal, 0, 0);        Mat histImg(histSize[0], histSize[0], CV_8U, 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);            line(histImg, Point(h, histSize[0]), Point(h, histSize[0] - intensity), Scalar::all(0));        }        return histImg;    }};int main(){    /*Mat image = imread("lifehappy.png",0);    Histogram1D h;    MatND histo = h.getHistogram(image);//计算直方图    for (int i = 0; i < 256; i++){        cout << "Value" << i << "=" << histo.at<float>(i) << endl;    }    waitKey(20150901);    system("pause");    return 0;*/    Mat image = imread("lifehappy.png",0);    Histogram1D h;    namedWindow("Histogram");    imshow("Histogram",h.getHistogramImage(image));    system("pause");    return 0;}
阅读全文
0 0
原创粉丝点击