OpenCV使用直方图统计像素

// Image_progress_class.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

class Histogram1D
{
public:
    Histogram1D(){
        //准备1D直方图参数初始化
        histSize[0] = 256;
        hranges[0] = 0.0;
        hranges[1] = 255.0;
        ranges[0] = hranges;
        channels[0] = 0;
    }

    MatND getHistogram(const Mat &image)
    {
        MatND hist;
        //计算直方图
        calcHist(&image,
            1,        //计算单张图像的直方图
            channels, //通道数
            Mat(),    //不使用图像作为掩码
            hist,     //返回直方图
            1,        //1D直方图
            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));
        //设置最高点为nbins的90%
        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(65));
        }
        return histImg;
    }

private:
    int histSize[1];//项的数量
    float hranges[2];//像素的最大值和最小值
    const float* ranges[1];
    int channels[1];//一个通道
};

int _tmain(int argc, _TCHAR* argv[])
{
    Mat src = imread("D:\\lena.jpg");

    imshow("lena", src);

    Histogram1D h;
    MatND histo = h.getHistogramImage(src);
    imshow("HISTO", histo);
    //生成二值图像清晰显示了分段的背景与前景
    Mat thresholded;
    threshold(src, thresholded, 60, 255, THRESH_BINARY);
    imshow("thresholded", thresholded);
    waitKey();
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014801811/article/details/80342474