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

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV中的直方图算子是一组用于计算图像直方图的函数。在给定图像的情况下,可以使用这些函数计算一维或多维直方图。其中,最常用的函数是calcHist,它可以计算一维直方图。 下面是一个示例代码,展示了如何使用OpenCV直方图算子来计算一幅图像的一维直方图: // 计算一维直方图 cv::Mat getHistogram(const cv::Mat &image) { cv::Mat hist; cv::calcHist(&image, 1, channels, cv::Mat(), hist, 1, histSize, ranges); return hist; } 在上述代码中,输入参数image是需要计算直方图图像。函数返回一个cv::Mat对象,表示计算得到的直方图。 需要注意的是,calcHist函数还有其他参数,如通道数(channels)、箱子数量(histSize)和像素值范围(ranges)。这些参数可以根据具体需求进行设置。 除了计算直方图OpenCV还提供了一些方法来可视化直方图,如使用柱状图。下面是一个创建直方图柱状图的示例代码: // 创建表示直方图图像 cv::Mat getImageOfHistogram(const cv::Mat &hist, int zoom) { double maxVal = 0; double minVal = 0; cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0); int histSize = hist.rows; cv::Mat histImg(histSize*zoom, histSize*zoom, CV_8U, cv::Scalar(255)); int hpt = static_cast<int>(0.9*histSize); for (int h = 0; h < histSize; h++) { float binVal = hist.at<float>(h); if (binVal > 0) { int intensity = static_cast<int>(binVal*hpt / maxVal); cv::line(histImg, cv::Point(h*zoom, histSize*zoom), cv::Point(h*zoom, (histSize - intensity)*zoom), cv::Scalar(0), zoom); } } return histImg; } 在上述代码中,输入参数hist是计算得到的直方图。函数返回一个cv::Mat对象,表示可视化的直方图图像。 这只是OpenCV直方图算子的一部分,还有其他更多的函数和方法可以用于直方图计算和可视化。具体使用哪些函数取决于具体的需求和情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值