OpenCV C++ 绘制直方图并做直方图均衡化

​​#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat img = imread("C:/visp-ws/opencv-4.5.1/sources/samples/data/leuvenB.jpg");
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);
    Mat hist, hist2;

    const int channels[1] = { 0 };      // 通道索引
    const int bins[1] = { 256 };        // 直方图的维度
    float inRanges[2] = { 0, 255 };
    const float* ranges[1] = { inRanges };

    calcHist(&gray, 1, channels, Mat(), hist, 1, bins, ranges);     // hist类型: cv::Mat

    // 绘制直方图
    int hist_w = 512;
    int hist_h = 400;
    int width = 2;

    Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
    Mat histImage2 = Mat::zeros(hist_h, hist_w, CV_8UC3);

    //for (int i = 1; i <= hist.rows; i++)
    //{
    //    rectangle(histImage, Point(width * (i - 1), hist_h - 1),
    //        Point(width * i, hist_h - cvRound(hist.at<float>(i - 1) / 15)),
    //        Scalar(255, 255, 255), -1);
    //}

    Mat hist_INF;
    normalize(hist, hist_INF, 1, 0, NORM_INF, -1, Mat());
    for (int i = 1; i <= hist_INF.rows; i++)
    {
        rectangle(histImage, Point(width * (i - 1), hist_h - 1),        // 矩形的一个顶点pt1(左下)
            Point(width * i, hist_h - cvRound(hist_h * hist_INF.at<float>(i - 1)) - 1),    // pt1相对的顶点
            Scalar(255, 255, 255), -1);
    }

    Mat equalizedImage;
    equalizeHist(gray, equalizedImage);
    calcHist(&equalizedImage, 1, channels, Mat(), hist2, 1, bins, ranges);

    Mat hist_INF2;
    normalize(hist2, hist_INF2, 1, 0, NORM_INF, -1, Mat());
    for (int i = 1; i <= hist_INF2.rows; i++)
    {
        rectangle(histImage2, Point(width * (i - 1), hist_h - 1),
            Point(width * i, hist_h - cvRound(hist_h * hist_INF2.at<float>(i - 1)) - 1),
            Scalar(255, 255, 255), -1);
    }

    imshow("gray", gray);
    imshow("equalizedImage", equalizedImage);
    imshow("histImage", histImage);
    imshow("histImage2", histImage2);
    waitKey(0);

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值