在实际应用场景中,我们可以根据需求调整计算的直方图区间,针对灰度直方图而言,我们可以将区间【0,255】分成以下几个区间:【0,60】,【61,120】,【121,160】,【161,220】,【221,255】。然后分别统计各个区间的灰度分布,进一步实现自定义直方图。
代码如下:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include <stdio.h>
#include <string>
using namespace std;
using namespace cv;
int main()
{
cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\RGBFlower4.jpg");
if (srcImage.empty())
{
return -1;
}
cv::imshow("原图像", srcImage);
//灰度转换
cv::Mat srcGray;
cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
cv::imshow("srcGray", srcGray);
//初始化直方图参数
const int channels[1] = {0};
const int histSize[1] = {256};
//设定区间
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;
}
本文介绍如何利用OpenCV库在Python中创建自定义的直方图。通过提供的代码示例,读者可以了解到直方图绘制的基本步骤和关键函数的用法。
3673

被折叠的 条评论
为什么被折叠?



