【opencv】教程代码 —Histograms_Matching(2)计算直方图、直方图比较、直方图均衡、模板匹配...

  • 计算直方图

  • 直方图比较

  • 图像进行直方图均衡化处理

  • 模板匹配

1. calcHist_Demo.cpp 计算直方图

b35b8b0d5f0aa4d2941ca458c3714bca.png

a13aae2be9b700449600cb849dd96af2.png

这段代码的功能是加载图像,分离图像的三个颜色通道,然后分别计算这三个通道的直方图,绘制出来并显示结果。直方图是图像中像素值分布的图形表示,可以用于图像分析或图像处理中。

// 加载OpenCV库,并用cv和std命名空间
#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;


// 主函数
int main(int argc, char** argv)
{
    // 从命令行参数中加载图像,如果不指定,则默认加载lena.jpg
    CommandLineParser parser( argc, argv, "{@input | lena.jpg | input image}" );
    Mat src = imread( samples::findFile( parser.get<String>( "@input" ) ), IMREAD_COLOR );
    // 如果图像为空,则返回退出失败
    if( src.empty() )
    {
        return EXIT_FAILURE;
    }


    // 分离图像的三个通道:蓝色、绿色和红色
    vector<Mat> bgr_planes;
    split( src, bgr_planes );


    // 确定直方图中的柱子数量(bin的数量),这里设置为256
    int histSize = 256;


    // 设置B、G、R通道的范围,由于直方图的上界是独占的,所以设置的范围是{0,256}
    float range[] = { 0, 256 };
    const float* histRange[] = { range };


    // 设置直方图参数,设置为均匀的,并且不累计
    bool uniform = true, accumulate = false;


    // 计算蓝色、绿色和红色通道的直方图
    Mat b_hist, g_hist, r_hist;
    calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, histRange, uniform, accumulate );
    calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, histRange, uniform, accumulate );
    calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, histRange, uniform, accumulate );


    // 创建一个用于绘制直方图的图像
    int hist_w = 512, hist_h = 400;
    int bin_w = cvRound( (double) hist_w/histSize );
    Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );


    // 将直方图的结果归一化到(0, histImage.rows)
    normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
    normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
    normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );


    // 为每个通道绘制直方图
    for( int i = 1; i < histSize; i++ )
    {
        line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ),
              Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
              Scalar( 255, 0, 0), 2, 8, 0  );
        line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ),
              Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
              Scalar( 0, 255, 0), 2, 8, 0  );
        line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ),
              Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
              Scalar( 0, 0, 255), 2, 8, 0  );
    }


    // 显示源图像和计算的直方图
    imshow("Source image", src );
    imshow("calcHist Demo", histImage );
    waitKey();


    return EXIT_SUCCESS;
}

81f53f3a8b7bf1240db947e8acd95fbe.png

calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, histRange, uniform, accumulate );

53e0f6dded6728d1a45a0d0e06e376df.png

normalize(b_hi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值