本文主要是介绍OpenCV学习笔记(26)灰度直方图 练习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
calcHist函数和minMaxLoc函数的参数学习与使用
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <math.h>
using namespace cv;
Mat srcImage;
Mat grayImage;
Mat histImage; //灰度直方图//画一个白色矩形作为面板在灰度直方图
void fill_white(Mat image)
{rectangle(image, Point(0, 0), Point(image.cols, image.rows), Scalar(255, 255, 255), CV_FILLED);
}void histgram()
{//定义变量,calcHist函数的参数准备Mat dstHist; //输出的结果存储的空间 int dims = 1; //1维float midRanges[] = { 0,256 }; //用于指出直方图每一维的每个bin(份)的上下界范围数组的数组const float*ranges[] = { midRanges };int size = 256; //数值一共分为256组,也就是柱条的数目int channels = 0; int nScale = 2;calcHist(&grayImage, 1, &channels, Mat(), dstHist, dims, &size, ranges);//calcHist 函数调用结束后,dstHist变量中将储存了 直方图的信息 用dstHist的模版函数 at<Type>(i)得到第i个柱条的值 //at<Type>(i, j)得到第i个并且第j个柱条的值 //因为任何一个图像的某个像素的总个数,都有可能会有很多,会超出所定义的图像的尺寸,针对这种情况,先对个数进行范围的限制 //先用 minMaxLoc函数来得到计算直方图后的像素的最大个数 double HistMaxValue;minMaxLoc(dstHist, 0, &HistMaxValue, 0, 0);histImage = Mat::zeros(Size(255*nScale, 150), CV_8UC3);//定义灰度直方图页面的大小fill_white(histImage);//白底for (int i = 0; i < 256; i++){float fHistValue = dstHist.at<float>(i);//像素为i的直方块大小int nRealHeight = cvRound((fHistValue / HistMaxValue) * 150); //要绘制的高度rectangle(histImage, Point(i*nScale, 254), Point((i + 1)*nScale - 1, 150- nRealHeight),Scalar(0,0,0),CV_FILLED);//从左往右一条一条的绘制~}imshow("灰度直方图", histImage);
}bool readImage()
{srcImage = imread("102.jpg");imshow("原图", srcImage);if (!srcImage.data){std::cout << "fail to load image" << std::endl;return 0;}
}void rgb_to_gray()
{grayImage.create(srcImage.size(), CV_8UC3);cvtColor(srcImage, grayImage, CV_BGR2GRAY);imshow("灰度图", grayImage);
}
void main()
{readImage();rgb_to_gray();histgram();waitKey();
}
这篇关于OpenCV学习笔记(26)灰度直方图 练习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!