1
+ Mat PerfectReflectionAlgorithm (Mat src) {
2
+ int row = src.rows ;
3
+ int col = src.cols ;
4
+ Mat dst (row, col, CV_8UC3);
5
+ int HistRGB[767 ] = { 0 };
6
+ int MaxVal = 0 ;
7
+ for (int i = 0 ; i < row; i++) {
8
+ for (int j = 0 ; j < col; j++) {
9
+ MaxVal = max (MaxVal, (int )src.at <Vec3b>(i, j)[0 ]);
10
+ MaxVal = max (MaxVal, (int )src.at <Vec3b>(i, j)[1 ]);
11
+ MaxVal = max (MaxVal, (int )src.at <Vec3b>(i, j)[2 ]);
12
+ int sum = src.at <Vec3b>(i, j)[0 ] + src.at <Vec3b>(i, j)[1 ] + src.at <Vec3b>(i, j)[2 ];
13
+ HistRGB[sum]++;
14
+ }
15
+ }
16
+ int Threshold = 0 ;
17
+ int sum = 0 ;
18
+ for (int i = 766 ; i >= 0 ; i--) {
19
+ sum += HistRGB[i];
20
+ if (sum > row * col * 0.1 ) {
21
+ Threshold = i;
22
+ break ;
23
+ }
24
+ }
25
+ int AvgB = 0 ;
26
+ int AvgG = 0 ;
27
+ int AvgR = 0 ;
28
+ int cnt = 0 ;
29
+ for (int i = 0 ; i < row; i++) {
30
+ for (int j = 0 ; j < col; j++) {
31
+ int sumP = src.at <Vec3b>(i, j)[0 ] + src.at <Vec3b>(i, j)[1 ] + src.at <Vec3b>(i, j)[2 ];
32
+ if (sumP > Threshold) {
33
+ AvgB += src.at <Vec3b>(i, j)[0 ];
34
+ AvgG += src.at <Vec3b>(i, j)[1 ];
35
+ AvgR += src.at <Vec3b>(i, j)[2 ];
36
+ cnt++;
37
+ }
38
+ }
39
+ }
40
+ AvgB /= cnt;
41
+ AvgG /= cnt;
42
+ AvgR /= cnt;
43
+ for (int i = 0 ; i < row; i++) {
44
+ for (int j = 0 ; j < col; j++) {
45
+ int Blue = src.at <Vec3b>(i, j)[0 ] * MaxVal / AvgB;
46
+ int Green = src.at <Vec3b>(i, j)[1 ] * MaxVal / AvgG;
47
+ int Red = src.at <Vec3b>(i, j)[2 ] * MaxVal / AvgR;
48
+ if (Red > 255 ) {
49
+ Red = 255 ;
50
+ }
51
+ else if (Red < 0 ) {
52
+ Red = 0 ;
53
+ }
54
+ if (Green > 255 ) {
55
+ Green = 255 ;
56
+ }
57
+ else if (Green < 0 ) {
58
+ Green = 0 ;
59
+ }
60
+ if (Blue > 255 ) {
61
+ Blue = 255 ;
62
+ }
63
+ else if (Blue < 0 ) {
64
+ Blue = 0 ;
65
+ }
66
+ dst.at <Vec3b>(i, j)[0 ] = Blue;
67
+ dst.at <Vec3b>(i, j)[1 ] = Green;
68
+ dst.at <Vec3b>(i, j)[2 ] = Red;
69
+ }
70
+ }
71
+ return dst;
72
+ }
0 commit comments