opencv2对读书笔记计算图像的直方图
程序员文章站
2022-05-31 10:39:37
...
1.一些小概念: (1) 像素在图像中的分布情况是这幅图像的一个重要特征。 (2) 直方图是一个简单的表,它给出了一幅图像或一组图像中用于给定数的像素数量。 2.calcHist 函数 calHist 是opencv 中可以计算直方图。 private:int histSize[1];//色度变换宽度floa
1.一些小概念:
(1) 像素值在图像中的分布情况是这幅图像的一个重要特征。
(2) 直方图是一个简单的表,它给出了一幅图像或一组图像中用于给定数值的像素数量。
2.calcHist 函数
calHist 是opencv 中可以计算直方图。
private: int histSize[1];//色度变换宽度 float hranges[2];//像素的最小值及最大值 const float * ranges[1];// int channels[1];//使用的通道 public: Histogram1D(){ histSize[0] = 256; hranges[0] = 0.0; hranges[1] = 255.0; ranges[0] = hranges; channels[0] = 0; } cv::MatND getHistogram(const cv::Mat &image){ cv::MatND hist; cv::calcHist(&image,1,channels,cv::Mat(),hist,1,histSize,ranges); return hist; }
下面给出对一个具体图像求出直方图的例子
#include#include #include "cv.h" #include "highgui.h" #include using namespace std; class Histogram1D { private: int histSize[1]; float hranges[2]; const float* ranges[1]; int channels[1]; public: Histogram1D() { histSize[0]= 256; hranges[0]= 0.0; hranges[1]= 255.0; ranges[0]= hranges; channels[0]= 0; } cv::MatND getHistogram(const cv::Mat &image) { cv::MatND hist; cv::calcHist(&image, //目标图像 1, // 计算一张直方图 channels, // 使用的通道数量 cv::Mat(), // 图像开关 hist, // 返回的直方图 1, // 1D直方图 histSize, // 色图宽度 ranges // 像素值的范围 ); return hist; } cv::Mat getHistogramImage(const cv::Mat &image){ cv::MatND hist= getHistogram(image); double maxVal=0; double minVal=0; cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0); cv::Mat histImg(histSize[0], histSize[0], CV_8U,cv::Scalar(255)); int hpt = static_cast (0.9*histSize[0]); for( int h = 0; h (h); int intensity = static_cast (binVal*hpt/maxVal); cv::line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0)); } return histImg; } }; int main() { cv::Mat image= cv::imread("group.jpg",0); if (!image.data) return 0; cv::namedWindow("Image"); cv::imshow("Image",image); Histogram1D h; cv::MatND histo= h.getHistogram(image); for (int i=0; i(i)
输出结果