自定义直方图,opencv

来源:互联网 发布:什么叫网络编程 编辑:程序博客网 时间:2024/05/13 23:41
在实际应用场景中,我们可以根据需求调整计算的直方图区间,针对灰度直方图而言,我们可以将区间【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;}


原创粉丝点击