图像的直方图

Posted jack-elvis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像的直方图相关的知识,希望对你有一定的参考价值。

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 代码:

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace std;
using namespace cv;

int main(int argc, char** argv) 
    Mat src = imread("L:/4.jpg");
    if (!src.data) 
        printf("could not load image...\\n");
        return -1;
    
    char INPUT_T[] = "input image";
    char OUTPUT_T[] = "histogram demo";
    namedWindow(INPUT_T, CV_WINDOW_AUTOSIZE);
    namedWindow(OUTPUT_T, CV_WINDOW_AUTOSIZE);
    imshow(INPUT_T, src);

    // 分通道显示
    vector<Mat> bgr_planes;
    split(src, bgr_planes);              //把多通道图像分为多个单通道图像
    //imshow("single channel demo", bgr_planes[0]);

    // 计算直方图 
    int histSize = 256;                      //直方图的级数
    float range[] =  0, 256 ;              //直方图的范围
    const float *histRanges =  range ;     //范围指针 
    Mat b_hist, g_hist, r_hist;
    calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRanges, true, false);
    calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRanges, true, false);
    calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRanges, true, false);

    // 归一化
    int hist_h = 400;
    int hist_w = 512;
    int bin_w = hist_w / histSize;
    Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));
    normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
    normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
    normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());

    // render histogram chart
    for (int i = 1; i < histSize; i++) 
        line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(b_hist.at<float>(i - 1))),
            Point((i)*bin_w, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, LINE_AA);

        line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(g_hist.at<float>(i - 1))),
            Point((i)*bin_w, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, LINE_AA);

        line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(r_hist.at<float>(i - 1))),
            Point((i)*bin_w, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, LINE_AA);
    
    imshow(OUTPUT_T, histImage);

    waitKey(0);
    return 0;

 

结果:

技术图片

 

以上是关于图像的直方图的主要内容,如果未能解决你的问题,请参考以下文章

图像直方图均衡化

OpenCV图像处理10图像直方图

数字图像处理:直方图均衡化

24 [图像直方图

计算绘制图像灰度直方图

图像的灰度直方图