美文网首页
8. 图像直方图

8. 图像直方图

作者: 逍遥才子 | 来源:发表于2020-03-06 21:40 被阅读0次
    image.png
    image.png
    #include <opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char** argv) {
    
        Mat src = imread("D:/HUANGHAI_WORK/tools/opencv4/opencv/sources/samples/data/home.jpg");
    
    
        namedWindow("input", WINDOW_AUTOSIZE);
        imshow("input", src);
        
    
        vector<Mat> mv;
        split(src, mv);
    
        //计算直方图
        int histSize = 256;
        float range[] = { 0,255 };
        const float* histRange = { range };
        Mat b_hist, g_hist, r_hist;
        calcHist(&mv[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, true, false);
        calcHist(&mv[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, true, false);
        calcHist(&mv[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, true, false);
    
        Mat result = Mat::zeros(Size(600, 400), CV_8UC3);
        int margin = 50;
        int nm = result.rows;
        normalize(b_hist, b_hist, 0, nm,NORM_MINMAX,-1,Mat());
        normalize(g_hist, g_hist, 0, nm, NORM_MINMAX, -1, Mat());
        normalize(r_hist, r_hist, 0, nm, NORM_MINMAX, -1, Mat());
        float step = 500.0 / 256.0;
        for (int i = 0; i < 255; i++)
        {
            float f1 = b_hist.at<float>(i, 0);
            float f2 = b_hist.at<float>(i+1, 0);
            line(result, Point(step*i+50, 50 + nm - b_hist.at<float>(i, 0)),Point(step*i+50+1,50+nm- b_hist.at<float>(i + 1, 0)),Scalar(255,0,0),1,8,0);
            line(result, Point(step*i+50, 50 + nm - g_hist.at<float>(i, 0)), Point(step*i+50 + 1, 50 + nm - g_hist.at<float>(i + 1, 0)), Scalar(0, 255, 0), 1, 8, 0);
            line(result, Point(step*i+50, 50 + nm - r_hist.at<float>(i, 0)), Point(step*i+50 + 1, 50 + nm - r_hist.at<float>(i + 1, 0)), Scalar(0, 0, 255), 1, 8, 0);
    
        }
        imshow("result", result);
    
    
        waitKey(0);
        destroyAllWindows();
        return 0;
    }
    
    image.png
    image.png
    //直方图均衡化
    void test2() {
        Mat src = imread("D:/HUANGHAI_WORK/tools/opencv4/opencv/sources/samples/data/home.jpg");
    
    
        namedWindow("input", WINDOW_AUTOSIZE);
        imshow("input", src);
    
        Mat gray, dst;
        cvtColor(src, gray, COLOR_BGR2GRAY);
        imshow("gray", gray);
        equalizeHist(gray, dst);
        imshow("eq", dst);
    
        //计算直方图
        int histSize = 256;
        float range[] = { 0,255 };
        const float* histRange = { range };
        Mat b_hist, g_hist;
        calcHist(&gray, 1, 0, Mat(), b_hist, 1, &histSize, &histRange, true, false);
        calcHist(&dst, 1, 0, Mat(), g_hist, 1, &histSize, &histRange, true, false);
    
    
        Mat result = Mat::zeros(Size(600, 400), CV_8UC3);
        int margin = 50;
        int nm = result.rows;
        normalize(b_hist, b_hist, 0, nm, NORM_MINMAX, -1, Mat());
        normalize(g_hist, g_hist, 0, nm, NORM_MINMAX, -1, Mat());
        float step = 500.0 / 256.0;
        for (int i = 0; i < 255; i++)
        {
            float f1 = b_hist.at<float>(i, 0);
            float f2 = b_hist.at<float>(i + 1, 0);
            line(result, Point(step*i + 50, 50 + nm - b_hist.at<float>(i, 0)), Point(step*i + 50 + 1, 50 + nm - b_hist.at<float>(i + 1, 0)), Scalar(0, 0, 255), 1, 8, 0);
            line(result, Point(step*i + 50, 50 + nm - g_hist.at<float>(i, 0)), Point(step*i + 50 + 1, 50 + nm - g_hist.at<float>(i + 1, 0)), Scalar(0, 255, 255), 1, 8, 0);
    
        }
        imshow("result", result);
    }
    
    image.png
    image.png
    void test3() {
        Mat src1 = imread("D:/HUANGHAI_WORK/tools/opencv4/opencv/sources/samples/data/aloeL.jpg");
        Mat src2 = imread("D:/HUANGHAI_WORK/tools/opencv4/opencv/sources/samples/data/aloeR.jpg");
        
        //计算直方图
        int histSize[] = {256,256,256};
        float range[] = { 0,255 };
        float c1[] = { 0,255 };
        float c2[] = { 0,255 };
        float c3[] = { 0,255 };
        const float* histRange[] = { c1,c2,c3 };
        int channels[] = { 0,1,2 };
        Mat hist1, hist2;
        calcHist(&src1, 1, channels, Mat(), hist1, 3, histSize, histRange, true, false);
        calcHist(&src2, 1, channels, Mat(), hist2, 3, histSize, histRange, true, false);
    
        //归一化
        normalize(hist1, hist1, 0, 1.0, NORM_MINMAX, -1, Mat());
        normalize(hist2, hist2, 0, 1.0, NORM_MINMAX, -1, Mat());
    
        //巴氏距离比较
        double b12 = compareHist(hist1, hist2, HISTCMP_BHATTACHARYYA);
        double b11 = compareHist(hist1, hist1, HISTCMP_BHATTACHARYYA);
        printf("巴氏距离:%.2f,%.2f \n", b12, b11);
    
        //相关性比较
        double c12 = compareHist(hist1, hist2, HISTCMP_CORREL);
        double c11 = compareHist(hist1, hist1, HISTCMP_CORREL);
    
        printf("相关性:%.2f,%.2f \n",c12,c11);
    }
    

    相关文章

      网友评论

          本文标题:8. 图像直方图

          本文链接:https://www.haomeiwen.com/subject/jminrhtx.html