【 OpenCV】——灰度直方图
前言
本文介绍了灰度直方图的基础内容。
对函数参数的解释
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,//表示是否进行归一化,默认为true
bool accumulate=false //累计标识符(默认为false),主要是允许多从个阵列中计算单个直方图
//或者用于在特定的时间更新直方图
}
使用步骤
##1.引入库
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2\imgproc\types_c.h>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat img;
img = imread("F:\\专高CV2\\图片\\520.jpg");
imshow("原图", img);
Mat hui;
cvtColor(img, hui, CV_BGR2GRAY);
int bins = 256;
int hist_size[] = { bins };
float range[] = { 0,256 };
const float *ranges[] = { range };
MatND hist;
int channels[] = { 0 };
//计算出灰度直方图
calcHist(&hui, 1, channels, Mat(), hist, 1, hist_size, ranges);
//画出直方图
double max_val;
minMaxLoc(hist, 0, &max_val, 0, 0);//定位矩阵中最小值、最大值的位置
int scale = 2;
int hist_height = 256;
Mat hist_img = Mat::zeros(hist_height, bins*scale, CV_8UC3);//创建一个全0的特殊矩阵
for (int i = 0; i < bins; i++)
{
float bin_val = hist.at<float>(i);
int inten = cvRound(bin_val*hist_height / max_val);//要绘制高度
//画矩形
rectangle(hist_img, Point(scale*i, hist_height - 1), Point((i + 1)*scale - 1, hist_height - inten), CV_RGB(255, 255, 255));
}
imshow("灰度直方图", hist_img);
waitKey(0);
}
效果图展示
总结
以上是一个简单的灰度直方图展示。