美文网首页
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. 图像直方图

  • Metal图像处理——直方图均衡化

    Metal图像处理——直方图均衡化 Metal图像处理——直方图均衡化

  • exp1-空间域图像增强

    图像灰度变换 计算显示图像直方图、直方图均衡化 空间域图像平滑、锐化

  • 第 4 章 用直方图统计像素

    本章包括以下内容: 计算图像直方图; 利用查找表修改图像外观; 直方图均衡化; 反向投影直方图检测特定图像内容; ...

  • 2019-04-10 OpenCV学习

    11边缘保留滤波(EPF) 美化图片 12图像直方图 13直方图应用 直方图均衡化:图像增强的一个手段 直方图比较...

  • 遥感数字图像处理方法

    1.直方图法 对于每幅图像都可作出其灰度直方图。根据直方图的形态可大致推断图像的质量。由于图像包含有大量的像元...

  • 直方图均衡化

    直方图均衡化的介绍 直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用...

  • 基本图像操作

    基本图像操作 1.直方图(histograms) 定义 直方图是对图像在某个指标的不同值的数量的统计,如亮度直方图...

  • OpenCV 之ios 直方图均衡化

    OpenCV 之ios 直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 ...

  • 图像直方图与直方图均衡化

    图像直方图(英语:Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像...

网友评论

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

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