#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;
}