Skip to content

Commit 36f0e62

Browse files
committedMar 9, 2020
Add MedianSideWindowFilter.cpp
1 parent 6a70563 commit 36f0e62

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed
 

‎MedianSideWindowFilter.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ Mat MedianSideWindowFilter(Mat src, int radius = 1) {
6060
int channels = src.channels();
6161
InitFilter(radius);
6262
//针对灰度图
63+
vector <int> now;
6364
if (channels == 1) {
6465
Mat dst(row, col, CV_8UC1);
6566
for (int i = 0; i < row; i++) {
@@ -73,33 +74,35 @@ Mat MedianSideWindowFilter(Mat src, int radius = 1) {
7374
for (int k = 0; k < 8; k++) {
7475
int val = 0;
7576
int id = 0;
76-
vector <int> now;
77+
now.clear();
7778
for (int x = -radius; x <= radius; x++) {
7879
for (int y = -radius; y <= radius; y++) {
7980
//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++]);
8182
//val += src.at<uchar>(i + x, j + y) * filter[k][id++];
8283
}
8384
}
8485
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];
8688
if (abs(val - src.at<uchar>(i, j)) < minn) {
8789
minn = abs(val - src.at<uchar>(i, j));
8890
pos = k;
8991
}
9092
}
9193
int val = 0;
9294
int id = 0;
93-
vector <int> now;
95+
now.clear();
9496
for (int x = -radius; x <= radius; x++) {
9597
for (int y = -radius; y <= radius; y++) {
9698
//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++]);
98100
//val += src.at<uchar>(i + x, j + y) * filter[k][id++];
99101
}
100102
}
101103
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];
103106
dst.at<uchar>(i, j) = val;
104107
}
105108
}
@@ -119,31 +122,35 @@ Mat MedianSideWindowFilter(Mat src, int radius = 1) {
119122
for (int k = 0; k < 8; k++) {
120123
int val = 0;
121124
int id = 0;
122-
vector <int> now;
125+
now.clear();
123126
for (int x = -radius; x <= radius; x++) {
124127
for (int y = -radius; y <= radius; y++) {
125128
//if (x == 0 && y == 0) continue;
126129
//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++]);
128131
}
129132
}
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];
131136
if (abs(val - src.at<Vec3b>(i, j)[c]) < minn) {
132137
minn = abs(val - src.at<Vec3b>(i, j)[c]);
133138
pos = k;
134139
}
135140
}
136141
int val = 0;
137142
int id = 0;
138-
vector <int> now;
143+
now.clear();
139144
for (int x = -radius; x <= radius; x++) {
140145
for (int y = -radius; y <= radius; y++) {
141146
//if (x == 0 && y == 0) continue;
142147
//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++]);
144149
}
145150
}
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];
147154
dst.at<Vec3b>(i, j)[c] = val;
148155
}
149156
}

0 commit comments

Comments
 (0)