1 #include "iostream"
2 #include "opencv2/opencv.hpp"
3 #include "vector"
4
5 using namespace std;
6 using namespace cv;
7
8 /*计算真彩色图像的直方图*/
9 void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB);
10 void calImgHistPro(vector<Mat> imgrgb, vector<vector<int>>& histData);
11 void showImgHistPro(vector<vector<int>>& histD);
12 void rotateImgPro(Mat& img, float angle);
13 int main()
14 {
15 Mat imgSrc = imread("E:\\VideoPlateRecog\\ETC\\1008\\SRC\\144.bmp");
16 /*色彩空间分离*/
17 vector<Mat> imgRGB;
18 splitRgbImgPro(imgSrc, imgRGB);
19 /*计算三通道直方图*/
20 vector<vector<int>> histData;
21 calImgHistPro(imgRGB, histData);
22 /*绘制三通道直方图*/
23 showImgHistPro(histData);
24
25 system("pause");
26 return 0;
27 }
28
29 void calImgHistPro(vector<Mat> imgrgb,vector<vector<int>>& histData)
30 {
31 vector<Mat> imgrgbSrc = imgrgb;
32 int width = imgrgb[0].cols;
33 int height = imgrgb[0].rows;
34 for (int n = 0; n < imgrgb.size(); n++)
35 {
36 Mat imgSrc = imgrgbSrc[n].clone();
37 int img_sum = -1;
38 vector<int> p(256);
39 for (int m = 0; m <p.size() ; m++)
40 {
41 p[m] = 0;
42 }
43 for (int i = 0; i < height; i++)
44 {
45 uchar* ptr = imgSrc.ptr<uchar>(i);
46 for (int j = 0; j < width; j++)
47 {
48 int k = ptr[j];
49 p[k]++;
50 }
51 }
52 /*find max element of vector*/
53 for (auto it = p.begin(); it != p.end(); it++)
54 {
55 if (*it > img_sum)
56 {
57 img_sum = *it;
58 }
59 }
60 for (int m = 0; m < 256; m++)
61 {
62 p[m] = p[m]*255 / img_sum;
63 }
64 histData.push_back(p);
65 }
66 }
67
68 void showImgHistPro(vector<vector<int>>& histD)
69 {
70 vector<vector<int>> histSrc=histD;
71 int cols = histD[0].size();
72 int rows = -1;
73 Mat histRGB(cols , cols * 3, CV_8UC1, Scalar(0));
74 for (int n = 0; n < histD.size(); n++)
75 {
76 vector<int> hist = histD[n];
77 Mat histImg(cols, cols, CV_8UC1, Scalar(0));
78 for (int i = 0; i < cols; i++)
79 {
80 uchar* ptr = histImg.ptr(i);
81 for (int j = 0; j < hist[i]; j++)
82 {
83 ptr[j] = 255;
84 }
85 }
86 /*旋转90°*/
87 Mat histImg1(cols, cols, CV_8UC1, Scalar(0));
88 for (int l = 0; l < cols; l++)
89 {
90 for (int k = 0; k < cols; k++)
91 {
92 histImg1.at<uchar>(l, k) = histImg.at<uchar>(k, cols-l-1);
93 }
94 }
95 histImg1.copyTo(histRGB(Rect(cols*n,0, cols, cols)));
96 }
97 imshow("Img_R_G_B", histRGB);
98 waitKey(0);
99 }
100
101 void rotateImgPro(Mat& img,float angle)
102 {
103 Mat retMat(img.cols, img.rows, CV_8UC1, Scalar(0));
104 float anglePI = (float)(angle*CV_PI / 180);
105 int xSm, ySm;
106 for (int i = 0; i < retMat.rows; i++)
107 {
108 for (int j = 0; j < retMat.cols; j++)
109 {
110 xSm = (int)((i - retMat.rows / 2)*cos(anglePI) -
111 (j - retMat.cols / 2)*sin(anglePI) + 0.5);
112 ySm = (int)((i - retMat.rows / 2)*sin(anglePI) +
113 (j - retMat.cols / 2)*cos(anglePI) + 0.5);
114 retMat.at<uchar>(i, j) = img.at<uchar>(xSm, ySm);
115
116 }
117 }
118 }
119
120
121
122
123 void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB)
124 {
125 Mat imgSrc = img.clone();
126 int width = imgSrc.rows;
127 int height = imgSrc.cols;
128 Mat imgR(width, height, CV_8UC1);
129 Mat imgG(width, height, CV_8UC1);
130 Mat imgB(width, height, CV_8UC1);
131 for (int i = 0; i < width; i++)
132 {
133 Vec3b* imgPtr = imgSrc.ptr<Vec3b>(i);
134 uchar* imgSPtr = imgSrc.ptr<uchar>(i);
135 uchar* imgRPtr = imgR.ptr<uchar>(i);
136 uchar* imgGPtr = imgG.ptr<uchar>(i);
137 uchar* imgBPtr = imgB.ptr<uchar>(i);
138 for (int j = 0; j < height; j++)
139 {
140 imgRPtr[j] = imgSPtr[0];
141 imgGPtr[j] = imgSPtr[1];
142 imgBPtr[j] = imgSPtr[2];
143 imgSPtr += 3;
144 }
145 }
146 imgRGB.push_back(imgR);
147 imgRGB.push_back(imgG);
148 imgRGB.push_back(imgB);
149 }