1+ Mat speed_rgb2gray (Mat src) {
2+ Mat dst (src.rows , src.cols , CV_8UC1);
3+ #pragma omp parallel for num_threads(12)
4+ for (int i = 0 ; i < src.rows ; i++) {
5+ for (int j = 0 ; j < src.cols ; j++) {
6+ dst.at <uchar>(i, j) = ((src.at <Vec3b>(i, j)[0 ] << 18 ) + (src.at <Vec3b>(i, j)[0 ] << 15 ) + (src.at <Vec3b>(i, j)[0 ] << 14 ) +
7+ (src.at <Vec3b>(i, j)[0 ] << 11 ) + (src.at <Vec3b>(i, j)[0 ] << 7 ) + (src.at <Vec3b>(i, j)[0 ] << 7 ) + (src.at <Vec3b>(i, j)[0 ] << 5 ) +
8+ (src.at <Vec3b>(i, j)[0 ] << 4 ) + (src.at <Vec3b>(i, j)[0 ] << 2 ) +
9+ (src.at <Vec3b>(i, j)[1 ] << 19 ) + (src.at <Vec3b>(i, j)[1 ] << 16 ) + (src.at <Vec3b>(i, j)[1 ] << 14 ) + (src.at <Vec3b>(i, j)[1 ] << 13 ) +
10+ (src.at <Vec3b>(i, j)[1 ] << 10 ) + (src.at <Vec3b>(i, j)[1 ] << 8 ) + (src.at <Vec3b>(i, j)[1 ] << 4 ) + (src.at <Vec3b>(i, j)[1 ] << 3 ) + (src.at <Vec3b>(i, j)[1 ] << 1 ) +
11+ (src.at <Vec3b>(i, j)[2 ] << 16 ) + (src.at <Vec3b>(i, j)[2 ] << 15 ) + (src.at <Vec3b>(i, j)[2 ] << 14 ) + (src.at <Vec3b>(i, j)[2 ] << 12 ) +
12+ (src.at <Vec3b>(i, j)[2 ] << 9 ) + (src.at <Vec3b>(i, j)[2 ] << 7 ) + (src.at <Vec3b>(i, j)[2 ] << 6 ) + (src.at <Vec3b>(i, j)[2 ] << 5 ) + (src.at <Vec3b>(i, j)[2 ] << 4 ) + (src.at <Vec3b>(i, j)[2 ] << 1 ) >> 20 );
13+ }
14+ }
15+ return dst;
16+ }
17+
18+
19+ Mat unevenLightCompensate (Mat src, int block_Size) {
20+ int row = src.rows ;
21+ int col = src.cols ;
22+ Mat gray (row, col, CV_8UC1);
23+ if (src.channels () == 3 ) {
24+ gray = speed_rgb2gray (src);
25+ }
26+ else {
27+ gray = src;
28+ }
29+ float average = mean (gray)[0 ];
30+ int new_row = ceil (1.0 * row / block_Size);
31+ int new_col = ceil (1.0 * col / block_Size);
32+ Mat new_img (new_row, new_col, CV_32FC1);
33+ for (int i = 0 ; i < new_row; i++) {
34+ for (int j = 0 ; j < new_col; j++) {
35+ int rowx = i * block_Size;
36+ int rowy = (i + 1 ) * block_Size;
37+ int colx = j * block_Size;
38+ int coly = (j + 1 ) * block_Size;
39+ if (rowy > row) rowy = row;
40+ if (coly > col) coly = col;
41+ Mat ROI = src (Range (rowx, rowy), Range (colx, coly));
42+ float block_average = mean (ROI)[0 ];
43+ new_img.at <float >(i, j) = block_average;
44+ }
45+ }
46+ new_img = new_img - average;
47+ Mat new_img2;
48+ resize (new_img, new_img2, Size (row, col), (0 , 0 ), (0 , 0 ), INTER_CUBIC);
49+ Mat new_src;
50+ gray.convertTo (new_src, CV_32FC1);
51+ Mat dst = new_src - new_img2;
52+ dst.convertTo (dst, CV_8UC1);
53+ return dst;
54+ }
0 commit comments