#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
class Histogram1D
{
private:
int histSize[1];
int channels[1];
const float* ranges[1];
float hrang[2];
public:
Histogram1D()
{
histSize[0]=256;
channels[0]=0;
ranges[0]=hrang;
hrang[0]=0.0;
hrang[1]=255.0;
}
//得到的是统计数据矩阵
cv::Mat getHistogram(const cv::Mat &img)
{
cv::Mat hist;
cv::calcHist(&img,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
}
//统计矩阵变为直方图(统计数据为各个灰阶的图元数量,而直方图是他们的比例0~1
cv::Mat getHistogramImage(const cv::Mat &image)
{
cv::Mat histImage(histSize[0],histSize[0],CV_8U);
cv::Mat histMat=getHistogram(image);
double minV=0;
double maxV=0;
cv::minMaxLoc(histMat,&minV,&maxV);
double hpt=0.9*histSize[0]; //0~1的比例在具体图片的表现高度
for(int h=0; h<histSize[0];h++)
{
float binVal=histMat.at<float>(h);
float intensity=cv::saturate_cast<int>(binVal*hpt/maxV);
cv::line(histImage,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar(120,0,0));
}
return histImage;
}
};
int main()
{
Mat model=imread("C:\\Users\\Administrator\\Desktop\\1.jpg");
Histogram1D h;
cv::namedWindow("a",0);
imshow("a",h.getHistogramImage(model));
cv::waitKey(0);
return 0;
}
#include <opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
class Histogram1D
{
private:
int histSize[1];
int channels[1];
const float* ranges[1];
float hrang[2];
public:
Histogram1D()
{
histSize[0]=256;
channels[0]=0;
ranges[0]=hrang;
hrang[0]=0.0;
hrang[1]=255.0;
}
//得到的是统计数据矩阵
cv::Mat getHistogram(const cv::Mat &img)
{
cv::Mat hist;
cv::calcHist(&img,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
}
//统计矩阵变为直方图(统计数据为各个灰阶的图元数量,而直方图是他们的比例0~1
cv::Mat getHistogramImage(const cv::Mat &image)
{
cv::Mat histImage(histSize[0],histSize[0],CV_8U);
cv::Mat histMat=getHistogram(image);
double minV=0;
double maxV=0;
cv::minMaxLoc(histMat,&minV,&maxV);
double hpt=0.9*histSize[0]; //0~1的比例在具体图片的表现高度
for(int h=0; h<histSize[0];h++)
{
float binVal=histMat.at<float>(h);
float intensity=cv::saturate_cast<int>(binVal*hpt/maxV);
cv::line(histImage,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar(120,0,0));
}
return histImage;
}
};
int main()
{
Mat model=imread("C:\\Users\\Administrator\\Desktop\\1.jpg");
Histogram1D h;
cv::namedWindow("a",0);
imshow("a",h.getHistogramImage(model));
cv::waitKey(0);
return 0;
}