#include #include#include#include#include#include#include#include#include
using namespacecv;using namespacestd;//单通道图片直方图绘制
void drawHist(vectornums)
{
Mat hist= Mat::zeros(600, 800, CV_8UC3);
auto Max= max_element(nums.begin(), nums.end());//max迭代器类型,最大数目
putText(hist, "Histogram", Point(150, 100), FONT_HERSHEY_DUPLEX, 1, Scalar(255, 255, 255));//*********绘制坐标系************// Point o = Point(100, 550);
Point x= Point(700, 550);
Point y= Point(100, 150);//x轴
line(hist, o, x, Scalar(255, 255, 255), 2, 8, 0);//y轴
line(hist, o, y, Scalar(255, 255, 255), 2, 8, 0);//********绘制灰度曲线***********// Point pts[256];//生成坐标点
for (int i = 0; i < 256; i++)
{
pts[i].x= i * 2 + 100;
pts[i].y= 550 - int(nums[i]*(300.0/(*Max)));//归一化到[0, 300]//显示横坐标
if ((i + 1) % 16 == 0)
{string num = format("%d", i + 1);
putText(hist, num, Point(pts[i].x,570), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));
}
}//绘制线
for (int i = 1; i < 256; i++)
{
line(hist, pts[i- 1], pts[i], Scalar(0, 255, 0), 2);
}//显示图像
imshow("直方图",hist);
}//三通道图片直方图绘制
void drawHist(vector &r, vector &g, vector &b)
{
Mat hist= Mat::zeros(600, 800, CV_8UC3);
putText(hist,"Histogram", Point(150, 100), FONT_HERSHEY_DUPLEX, 1, Scalar(255, 255, 255));//*********绘制坐标系************// Point o = Point(100, 550);
Point x= Point(700, 550);
Point y= Point(100, 150);//x轴
line(hist, o, x, Scalar(255, 255, 255), 2, 8, 0);//y轴
line(hist, o, y, Scalar(255, 255, 255), 2, 8, 0);//********绘制灰度曲线***********// auto Max_r =max_element(r.begin(), r.end());
auto Max_g=max_element(g.begin(), g.end());
auto Max_b=max_element(b.begin(), b.end());
Point pts[3][256];//生成坐标点
for (int i = 0; i < 256; i++)
{
pts[0][i].x = i * 2 + 100;
pts[0][i].y = 550 - int(r[i] * (300.0 / (*Max_r)));//归一化到[0, 300]
pts[1][i].x = i * 2 + 100;
pts[1][i].y = 550 - int(g[i] * (300.0 / (*Max_g)));//归一化到[0, 300]
pts[2][i].x = i * 2 + 100;
pts[2][i].y = 550 - int(b[i] * (300.0 / (*Max_b)));//归一化到[0, 300]//显示横坐标
if ((i + 1) % 16 == 0)
{string num = format("%d", i + 1);
putText(hist, num, Point(pts[0][i].x, 570), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));
}
}//绘制线
for (int i = 1; i < 256; i++)
{
line(hist, pts[0][i - 1], pts[0][i], Scalar(255, 0, 0), 2);
line(hist, pts[1][i - 1], pts[1][i], Scalar(0, 255, 0), 2);
line(hist, pts[2][i - 1], pts[2][i], Scalar(0, 0, 255), 2);
}//显示图像
imshow("直方图", hist);
}//灰度直方图计算
void calHist(const stringimg)
{
Mat src, grey;//读取图象
src =imread(img);if (!src.data)
{
cout<< "Image:" + img + "读取失败" <
}//先转为灰度图
cvtColor(src, grey, COLOR_BGR2GRAY);
imshow("灰度图", grey);//计算各灰度级像素个数
vector nums(256);for (int i = 0; i < grey.rows; i++)
{
uchar* p = grey.ptr(i);for (int j = 0; j < grey.cols; j++)
{
nums[p[j]]++;
}
}
drawHist(nums);
}//多通道直方图计算
void calHist(const string img, intpattern)
{
Mat src, grey;//读取图象
src =imread(img);if (!src.data)
{
cout<< "Image:" + img + "读取失败" <
}
imshow("原图像",src);//计算各灰度级像素个数
vector r(256, 0);
vector g(256, 0);
vector b(256, 0);for (int i = 0; i < src.rows; i++)
{
uchar* p = src.ptr(i);for (int j = 0; j < src.cols; j++)
{
r[p[j* 3 + 0]]++;
g[p[j* 3 + 1]]++;
b[p[j* 3 + 2]]++;
}
}
drawHist(r, g, b);
}intmain()
{string img = "D:\\trashBox\\testIMG\\tiger.jpg";
calHist(img);//计算灰度直方图
calHist(img, 0);//计算三色直方图
waitKey(0);return 0;
}