@@ -60,6 +60,7 @@ Mat MedianSideWindowFilter(Mat src, int radius = 1) {
60
60
int channels = src.channels ();
61
61
InitFilter (radius);
62
62
// 针对灰度图
63
+ vector <int > now;
63
64
if (channels == 1 ) {
64
65
Mat dst (row, col, CV_8UC1);
65
66
for (int i = 0 ; i < row; i++) {
@@ -73,33 +74,35 @@ Mat MedianSideWindowFilter(Mat src, int radius = 1) {
73
74
for (int k = 0 ; k < 8 ; k++) {
74
75
int val = 0 ;
75
76
int id = 0 ;
76
- vector < int > now;
77
+ now. clear () ;
77
78
for (int x = -radius; x <= radius; x++) {
78
79
for (int y = -radius; y <= radius; y++) {
79
80
// if (x == 0 && y == 0) continue;
80
- now.push_back (src.at <uchar>(i + x, j + y) * filter[k][id++]);
81
+ if (filter[k][id]) now.push_back (src.at <uchar>(i + x, j + y) * filter[k][id++]);
81
82
// val += src.at<uchar>(i + x, j + y) * filter[k][id++];
82
83
}
83
84
}
84
85
sort (now.begin (), now.end ());
85
- val = now[(2 * radius + 1 )*(2 * radius + 1 ) / 2 ];
86
+ int mid = (int )(now.size ());
87
+ val = now[mid / 2 ];
86
88
if (abs (val - src.at <uchar>(i, j)) < minn) {
87
89
minn = abs (val - src.at <uchar>(i, j));
88
90
pos = k;
89
91
}
90
92
}
91
93
int val = 0 ;
92
94
int id = 0 ;
93
- vector < int > now;
95
+ now. clear () ;
94
96
for (int x = -radius; x <= radius; x++) {
95
97
for (int y = -radius; y <= radius; y++) {
96
98
// if (x == 0 && y == 0) continue;
97
- now.push_back (src.at <uchar>(i + x, j + y) * filter[pos][id++]);
99
+ if (filter[pos][id]) now.push_back (src.at <uchar>(i + x, j + y) * filter[pos][id++]);
98
100
// val += src.at<uchar>(i + x, j + y) * filter[k][id++];
99
101
}
100
102
}
101
103
sort (now.begin (), now.end ());
102
- val = now[(2 * radius + 1 )*(2 * radius + 1 ) / 2 ];
104
+ int mid = (int )(now.size ());
105
+ val = now[mid / 2 ];
103
106
dst.at <uchar>(i, j) = val;
104
107
}
105
108
}
@@ -119,31 +122,35 @@ Mat MedianSideWindowFilter(Mat src, int radius = 1) {
119
122
for (int k = 0 ; k < 8 ; k++) {
120
123
int val = 0 ;
121
124
int id = 0 ;
122
- vector < int > now;
125
+ now. clear () ;
123
126
for (int x = -radius; x <= radius; x++) {
124
127
for (int y = -radius; y <= radius; y++) {
125
128
// if (x == 0 && y == 0) continue;
126
129
// val += src.at<Vec3b>(i + x, j + y)[c] * filter[k][id++];
127
- now.push_back (src.at <Vec3b>(i + x, j + y)[c] * filter[k][id++]);
130
+ if (filter[k][id]) now.push_back (src.at <Vec3b>(i + x, j + y)[c] * filter[k][id++]);
128
131
}
129
132
}
130
- val = now[(2 * radius + 1 )*(2 * radius + 1 ) / 2 ];
133
+ sort (now.begin (), now.end ());
134
+ int mid = (int )(now.size ());
135
+ val = now[mid / 2 ];
131
136
if (abs (val - src.at <Vec3b>(i, j)[c]) < minn) {
132
137
minn = abs (val - src.at <Vec3b>(i, j)[c]);
133
138
pos = k;
134
139
}
135
140
}
136
141
int val = 0 ;
137
142
int id = 0 ;
138
- vector < int > now;
143
+ now. clear () ;
139
144
for (int x = -radius; x <= radius; x++) {
140
145
for (int y = -radius; y <= radius; y++) {
141
146
// if (x == 0 && y == 0) continue;
142
147
// val += src.at<Vec3b>(i + x, j + y)[c] * filter[k][id++];
143
- now.push_back (src.at <Vec3b>(i + x, j + y)[c] * filter[pos][id++]);
148
+ if (filter[pos][id]) now.push_back (src.at <Vec3b>(i + x, j + y)[c] * filter[pos][id++]);
144
149
}
145
150
}
146
- val = now[(2 * radius + 1 )*(2 * radius + 1 ) / 2 ];
151
+ sort (now.begin (), now.end ());
152
+ int mid = (int )(now.size ());
153
+ val = now[mid / 2 ];
147
154
dst.at <Vec3b>(i, j)[c] = val;
148
155
}
149
156
}
0 commit comments