opencv c++ BGR三通道图像分离、直方图计算、直方图均衡

 

本章内容:


1. BGR三通道图像分离
2. 直方图计算
3. 直方图均衡

 

 1. BGR三通道图像分离

输出结果:

 

2. 直方图计算

输出结果:

 

3. 直方图均衡

输出结果:

 

代码


#include <ostream>
#include <opencv.hpp>
#include <math.h>

int main(int argc, char *argv[])
{
    /*
     本章内容:
        1. BGR三通道图像分离
        2. 直方图计算
        3. 直方图均衡
    */
    cv::String fileName = "/home/wang/dev/Image/biuld.jpeg";
    cv::String fileName1 = "/home/wang/dev/Image/pingpang.jpeg";
    cv::Mat src = cv::imread(fileName);
    if(src.data == NULL){
        printf("图像读入失败\n");
        return -1;
    }
    std::vector<cv::Mat> BGRArray;
    /* 1. BGR三通道图像分离
        api接口: CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);
            @param mv output vector of arrays; // 矩阵向量容器
    */
    cv::split(src,BGRArray);
    cv::imshow("src", src);
    cv::imshow("Blue gray", BGRArray[0]);
    cv::imshow("Green gray", BGRArray[1]);
    cv::imshow("Red gray", BGRArray[2]);

    /*1.直方图计算
     api接口: CV_EXPORTS void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          OutputArray hist, int dims, const int* histSize,
                          const float** ranges, bool uniform = true, bool accumulate = false );
      注:直方图参数过于复杂,不需要进行高效统计时,直接采用官方给定统计统计灰度直方图即可
    */
    cv::Mat r_hist;
    cv::Mat g_hist;
    cv::Mat b_hist;
    int histSize = 255; // 设计Bin
    float range[] = { 0, 255 } ;  // 设定数值取值方位
    const float* histRange = { range };
    cv::calcHist( &BGRArray[0], 1, 0, cv::Mat(), b_hist, 1, &histSize, &histRange);
    cv::calcHist( &BGRArray[1], 1, 0, cv::Mat(), g_hist, 1, &histSize, &histRange);
    cv::calcHist( &BGRArray[2], 1, 0, cv::Mat(), r_hist, 1, &histSize, &histRange);
    std::cout << "r_hist.size()" << r_hist.size() << std::endl;
    std::cout << "g_hist.size()" << g_hist.size() << std::endl;
    std::cout << "b_hist.size()" << b_hist.size() << std::endl;
    //绘制直方图
    /*
            CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
                             int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
    */
    int maxV = 255;
    cv::Mat histImage(histSize,maxV,CV_8UC3);
    cv::normalize(r_hist, r_hist,  histImage.rows*2);
    cv::normalize(g_hist, g_hist,  histImage.rows*2);
    cv::normalize(b_hist, b_hist,  histImage.rows*2);

    for(int i=0; i<histSize-1; i++){
        cv::line(histImage,cv::Point(i,maxV-r_hist.at<float>(i)),cv::Point(i,maxV-r_hist.at<float>(i+1)),cv::Scalar(0,0,255),4); // 绘制红色通道
        cv::line(histImage,cv::Point(i,maxV-g_hist.at<float>(i)),cv::Point(i,maxV-g_hist.at<float>(i+1)),cv::Scalar(0,255,0),4); // 绘制绿色通道
        cv::line(histImage,cv::Point(i,maxV-b_hist.at<float>(i)),cv::Point(i,maxV-b_hist.at<float>(i+1)),cv::Scalar(255,0,0),4); // 绘制蓝色通道
    }
    cv::imshow("hist", histImage);

    /* 3.直方图均衡
        CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst );
        @param src Source 8-bit single channel image.
        @param dst Destination image of the same size and type as src .
    */
    cv::Mat dst;
    cv::Mat gray;
    cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);
    cv::equalizeHist(gray,dst); // 直方图均衡画
    cv::imshow("gray",gray);
    cv::imshow("equalizeHist",dst);

    cv::waitKey(0);     return 1; }