OpenCV4入门教程087:自定义图像直方图

索引地址:系列索引

所谓的自定义直方图,就是不使用别人已经实现的方法,自己实现流程生成直方图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// 功能:代码 3-9 自定义直方图实现
// 作者:朱伟 zhu1988wei@163.com
// 来源:《OpenCV图像处理编程实例》
// 博客:http://blog.csdn.net/zhuwei1988
// 更新:2016-8-1
// 说明:版权所有,引用或摘录请联系作者,并按照上面格式注明出处,谢谢。//
#include <opencv2/opencv.hpp>
int main()
{
// 图像获取及判断
cv::Mat srcImage = cv::imread("circles.jpg");
if( !srcImage.data )
return 1;
cv::imshow("srcImage",srcImage);
// 灰度转换
cv::Mat srcGray;
cv::cvtColor(srcImage,srcGray,cv::COLOR_BGR2GRAY);
// 初始化直方图计算参数
const int channels[1]={0};
const int histSize[1]={256};
// 设定区间[0 60],[61 120],[121 160],[161 220],[221 255]
float hranges[6]={0, 60, 120, 160, 220, 255};
const float* ranges[1] = {hranges};
cv::MatND hist;
// 计算直方图
cv::calcHist( &srcGray, 1,
channels, cv::Mat(),
hist, 1, histSize,
ranges );
// 求直方图中最大值
double maxHist=0;
cv::minMaxLoc(hist, 0, &maxHist, 0 ,0);
// 设置直方图绘图参数
int hist_Size = hist.rows;
cv::Mat histImg(hist_Size, hist_Size,
CV_8U, cv::Scalar(255));
// 直方图绘制
for(int h = 0; h < hist_Size; h++)
{
float binVal = hist.at<float>(h);
//归一化 根据最大值计算变换范围
int intensity = static_cast<int>(binVal *
hist_Size / maxHist);
// 绘图直方图信息
cv::line(histImg, cv::Point(h, hist_Size),
cv::Point(h, hist_Size - intensity),
cv::Scalar::all(0));
}
cv::imshow("histImg", histImg);
cv::waitKey(0);
return 0;
}

效果

custom


OpenCV4入门教程087:自定义图像直方图
https://feater.top/opencv/opnecv-image-custom-histogram/
作者
JackeyLea
发布于
2020年9月12日
许可协议