计算直方图
直方图比较
图像进行直方图均衡化处理
模板匹配
1. calcHist_Demo.cpp 计算直方图
这段代码的功能是加载图像,分离图像的三个颜色通道,然后分别计算这三个通道的直方图,绘制出来并显示结果。直方图是图像中像素值分布的图形表示,可以用于图像分析或图像处理中。
// 加载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;
}
calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, histRange, uniform, accumulate );
normalize(b_hi