直方图是图像十分重要的特征,,是对数据进行统计的一种方法!直方图处理在数字图像处理中占着举足轻重的地位。
首先,我们利用calcHist()函数计算灰度图像的直方图,即统计灰度图中像素的灰度值0到255出现的次数。
然后绘制一维直方图,观察直方图我们可以得到很多关于图像特征的信息。
API函数:
void calcHist(const Mat* images,//输入图像
int nimages,//输入图像个数
const int* channels,//需要统计的通道的索引
InputArray mask,//可选的操作掩码
OutputArray hist,//输出的目标直方图
int dims,//直方图的维度
const int* histSize,//每个维度中,直方图数组的长度,量化成histSize个等级,即直条个数
const float** ranges,//数组的数组,数据(像素的灰度值)的取值范围
bool uniform = true, bool accumulate = false);//默认
一、c++示例代码
//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分
//主函数
int main()
{
//【1】载入图像
Mat image = imread("G:\\opencvtest\\testImage\\airplane.jpg", 0);
//【2】检查是否载入成功
if (image.empty())
{
printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
return 0;
}
//【3】计算灰度图像一维直方图
const int nimages = 1;
int channels[] = {0};
MatND hist;
int dims = 1;
int histSize[] = {256};
float hranges[] = {0.0, 255.0};
const float* ranges[] = {hranges};//一定要有const
calcHist(&image, nimages, channels, Mat(), hist, dims, histSize, ranges);
//【4】获取最大最小值
double minValue = 0;
double maxValue = 0;
minMaxLoc(hist, &minValue, &maxValue);
//【5】绘制灰度图像一维直方图
Mat dstImage(histSize[0], histSize[0], CV_8U, Scalar(0));//256*256的黑色底板
int hpt = saturate_cast<int>(0.9 * histSize[0]);
for (int i = 0; i < 256; i++)
{
float binValue = hist.at<float>(i);
//统计数值的缩放,增强直方图的可视化
int realValue = saturate_cast<int>(binValue * hpt / maxValue);
//在256*256的黑色底板上画矩形
rectangle(dstImage, Point(i, histSize[0]-1), Point(i+1, histSize[0]-realValue), Scalar(255));
}
//【6】显示图像
imshow("21-灰度原图", image);
imshow("21-一维直方图", dstImage);
//【7】保持窗口显示
waitKey(0);
return 0;
}
二、运行截图
1.灰度原图
2.一维直方图