OpenCv绘制图像直方图

该代码示例展示了如何使用OpenCV库来计算和绘制图像的直方图,特别是RGB通道的直方图。通过将图像拆分为R、G、B三个通道,并对每个通道计算256个区间的直方图,然后进行归一化处理,最终绘制出彩色直方图。这段代码包含了从加载图像到计算和显示直方图的完整流程。
摘要由CSDN通过智能技术生成

一、具体代码表示

ps:代码中有详细注释

/**
 * 绘制直方图:直方图是变量分布的统计图形表示,它让我们能够理解数据的密度估计和概率分布。
 * 直方图通过将整个变量值范围划分为小的值范围,然后计算每个间隔中落入多少个值来创建
 * @param inputImagePath 绘制直方图的原图路径
 */
void showCalcHist(char *inputImagePath) {
    //加载原图
    Mat src = imread(inputImagePath);
    if (src.empty()) {
        cout << "图像数据不存在" << endl;
        return;
    }
    //将原图进行拆分,并存入向量集合中
    vector<Mat> bgr;
    //将输入图像划分为三个通道R、G、B
    split(src, bgr);
    //设置直方图有256个区间,因为图像的灰度值变化为0~255
    int numbers = 256;
    //定义变量范围,并定义三个矩阵来存储每个直方图
    float range[] = {0, 256};
    const float *histRange = {range};
    Mat b_hist, g_hist, r_hist;
    /*
     * calcHist用来计算图像直方图:
     * 参数详解:
        const Mat* images:输入图像
         int nimages:输入图像的个数
        const int* channels:需要统计直方图的第几通道
        InputArray mask:掩膜,,计算掩膜内的直方图  ...Mat()
        OutputArray hist:输出的直方图数组
        int dims:需要统计直方图通道的个数
        const int* histSize:指的是直方图分成多少个区间,就是 bin的个数
        const float** ranges: 统计像素值得区间
        bool uniform=true::是否对得到的直方图数组进行归一化处理
        bool accumulate=false:在多个图像时,是否累计计算像素值得个数
     */
    calcHist(&bgr[0], 1, 0, Mat(), b_hist, 1, &numbers, &histRange);
    calcHist(&bgr[1], 1, 0, Mat(), g_hist, 1, &numbers, &histRange);
    calcHist(&bgr[2], 1, 0, Mat(), r_hist, 1, &numbers, &histRange);
    //计算出每个通道的直方图后绘制直方图,并显示给用户
    int width = 512;
    int height = 320;
    //创建一个灰度图像
    Mat histImage(height, width, CV_8UC3, Scalar(20, 20, 20));
    //
    normalize(b_hist, b_hist, 0, height, NORM_MINMAX);
    normalize(g_hist, g_hist, 0, height, NORM_MINMAX);
    normalize(r_hist, r_hist, 0, height, NORM_MINMAX);

    int binStep = cvRound((float )width/(float )numbers);
    for(int i=0;i<numbers;i++){
        try {
            line(
                    histImage,
                    Point(binStep*(i-1),height- cvRound(b_hist.at<float>(i-1))),
                    Point(binStep*(i),height- cvRound(b_hist.at<float>(i))),
                    Scalar(255,0,0)
            );
            line(
                    histImage,
                    Point(binStep*(i-1),height- cvRound(g_hist.at<float>(i-1))),
                    Point(binStep*(i),height- cvRound(g_hist.at<float>(i))),
                    Scalar(0,255,0)
            );
            line(
                    histImage,
                    Point(binStep*(i-1),height- cvRound(r_hist.at<float>(i-1))),
                    Point(binStep*(i),height- cvRound(r_hist.at<float>(i))),
                    Scalar(0,0,255)
            );
        }catch (Exception exception){
            cout << exception.err <<endl;
        }


    }
    //展示原图
    imshow("src",src);
    //展示直方图
    imshow("histWindow",histImage);
    //销毁原始图像
    src.release();
    waitKey(0);
    //销毁原图和直方图的两个窗口
    destroyWindow("src");
    destroyWindow("histWindow");

}

二、图片效果展示

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值