Skip to content

Commit 5649dd9

Browse files
committed
Fix speed_medianFilter_in_gray_image.cpp BUG
1 parent fa2cea6 commit 5649dd9

File tree

1 file changed

+83
-66
lines changed

1 file changed

+83
-66
lines changed

Algorithm optimization/speed_medianFilter_in_gray_image.cpp

Lines changed: 83 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,45 +6,53 @@ using namespace cv;
66
using namespace std;
77
//所有代码针对灰度图,RGB分为3个通道处理
88
//中值滤波串行代码
9-
Mat speed_MedianFilter(Mat src) {
10-
int row = src.rows;
11-
int col = src.cols;
12-
Mat dst(row, col, CV_8UC1);
13-
for (int i = 1; i < row - 1; i++) {
14-
for (int j = 1; j < col - 1; j++) {
9+
void meanFilter(int height, int width, unsigned char * __restrict src, unsigned char * __restrict dst) {
10+
for (int i = 1; i < height - 1; i++) {
11+
for (int j = 1; j < width - 1; j++) {
1512
unsigned char a[9];
16-
a[0] = src.at<uchar>(i, j);
17-
a[1] = src.at<uchar>(i, j + 1);
18-
a[2] = src.at<uchar>(i, j - 1);
13+
a[0] = src[i * width + j];
14+
a[1] = src[i * width + j + 1];
15+
a[2] = src[i * width + j - 1];
1916

20-
a[3] = src.at<uchar>(i + 1, j);
21-
a[4] = src.at<uchar>(i + 1, j + 1);
22-
a[5] = src.at<uchar>(i + 1, j - 1);
17+
a[3] = src[(i + 1) * width + j];
18+
a[4] = src[(i + 1) * width + j + 1];
19+
a[5] = src[(i + 1) * width + j - 1];
2320

24-
a[6] = src.at<uchar>(i - 1, j);
25-
a[7] = src.at<uchar>(i - 1, j + 1);
26-
a[8] = src.at<uchar>(i - 1, j - 1);
21+
a[6] = src[(i - 1) * width + j];
22+
a[7] = src[(i - 1) * width + j + 1];
23+
a[8] = src[(i - 1) * width + j - 1];
2724
for (int ii = 0; ii < 5; ii++) {
2825
for (int jj = ii + 1; jj < 9; jj++) {
2926
if (a[ii] > a[jj]) {
30-
unsigned char tmp = a[ii];
31-
a[jj] = a[ii];
32-
a[jj] = tmp;
27+
unsigned char temp = a[ii];
28+
a[ii] = a[jj];
29+
a[jj] = temp;
3330
}
3431
}
3532
}
36-
dst.at<uchar>(i, j) = a[4];
33+
dst[i * width + j] = a[4];
3734
}
3835
}
39-
for (int i = 0; i < row; i++) {
40-
dst.at<uchar>(i, 0) = src.at<uchar>(i, 0);
41-
dst.at<uchar>(i, col - 1) = src.at<uchar>(i, col - 1);
36+
for (int i = 0; i < width; i++) {
37+
dst[i] = src[i];
38+
dst[(height - 1) * width + i] = src[(height - 1) * width + i];
4239
}
43-
for (int i = 0; i < col; i++) {
44-
dst.at<uchar>(0, i) = src.at<uchar>(0, i);
45-
dst.at<uchar>(row - 1, i) = src.at<uchar>(row - 1, i);
40+
for (int i = 0; i < height; i++) {
41+
dst[i * width] = src[i * width];
42+
dst[i * width + width - 1] = src[i * width + width - 1];
4643
}
47-
return dst;
44+
}
45+
Mat speed_MedianFilter(Mat src) {
46+
int row = src.rows;
47+
int col = src.cols;
48+
unsigned char * data = (unsigned char *)src.data;
49+
unsigned char *dst = new unsigned char[row * col];
50+
//for (int i = 0; i < row * col; i++) {
51+
// printf("%d\n", data[i]);
52+
//}
53+
meanFilter(row, col, data, dst);
54+
Mat res(row, col, CV_8UC1, dst);
55+
return res;
4856
}
4957

5058
//使用AVX指令集优化中值滤波,相比串行,想你那好提升约60倍
@@ -113,7 +121,7 @@ void medianFilterAVX(int height, int width, unsigned char* __restrict src, unsig
113121
Mat AVX_MedianFilter(Mat src) {
114122
int row = src.rows;
115123
int col = src.cols;
116-
unsigned char * __restrict data = src.data;
124+
unsigned char * data = (unsigned char *)src.data;
117125
unsigned char *dst = new unsigned char[row * col];
118126
//for (int i = 0; i < row * col; i++) {
119127
// printf("%d\n", data[i]);
@@ -125,51 +133,60 @@ Mat AVX_MedianFilter(Mat src) {
125133

126134
//使用Openmp加速中值滤波,在6核Core i7 3930K上,12线程的加速比为8.4
127135

128-
Mat Openmp_MedianFilter(Mat src) {
129-
int row = src.rows;
130-
int col = src.cols;
131-
Mat dst(row, col, CV_8UC1);
136+
void MultiThtreadsFilter(int height, int width, unsigned char * __restrict src, unsigned char * __restrict dst) {
132137
#pragma omp parallel default(none) shared(src, dst, row, col) num_threads(12)
133-
{
138+
{
134139
#pragma omp for nowait
135-
for (int i = 1; i < row - 1; i++) {
136-
for (int j = 1; j < col - 1; j++) {
137-
unsigned char a[9];
138-
a[0] = src.at<uchar>(i, j);
139-
a[1] = src.at<uchar>(i, j + 1);
140-
a[2] = src.at<uchar>(i, j - 1);
141-
142-
a[3] = src.at<uchar>(i + 1, j);
143-
a[4] = src.at<uchar>(i + 1, j + 1);
144-
a[5] = src.at<uchar>(i + 1, j - 1);
145-
146-
a[6] = src.at<uchar>(i - 1, j);
147-
a[7] = src.at<uchar>(i - 1, j + 1);
148-
a[8] = src.at<uchar>(i - 1, j - 1);
149-
for (int ii = 0; ii < 5; ii++) {
150-
for (int jj = ii + 1; jj < 9; jj++) {
151-
if (a[ii] > a[jj]) {
152-
unsigned char tmp = a[ii];
153-
a[jj] = a[ii];
154-
a[jj] = tmp;
155-
}
140+
for (int i = 1; i < height - 1; i++) {
141+
for (int j = 1; j < width - 1; j++) {
142+
unsigned char a[9];
143+
a[0] = src[i * width + j];
144+
a[1] = src[i * width + j + 1];
145+
a[2] = src[i * width + j - 1];
146+
147+
a[3] = src[(i + 1) * width + j];
148+
a[4] = src[(i + 1) * width + j + 1];
149+
a[5] = src[(i + 1) * width + j - 1];
150+
151+
a[6] = src[(i - 1) * width + j];
152+
a[7] = src[(i - 1) * width + j + 1];
153+
a[8] = src[(i - 1) * width + j - 1];
154+
for (int ii = 0; ii < 5; ii++) {
155+
for (int jj = ii + 1; jj < 9; jj++) {
156+
if (a[ii] > a[jj]) {
157+
unsigned char temp = a[ii];
158+
a[ii] = a[jj];
159+
a[jj] = temp;
156160
}
157161
}
158-
dst.at<uchar>(i, j) = a[4];
159162
}
163+
dst[i * width + j] = a[4];
160164
}
161-
#pragma omp for nowait
162-
for (int i = 0; i < row; i++) {
163-
dst.at<uchar>(i, 0) = src.at<uchar>(i, 0);
164-
dst.at<uchar>(i, col - 1) = src.at<uchar>(i, col - 1);
165-
}
166-
#pragma omp for nowait
167-
for (int i = 0; i < col; i++) {
168-
dst.at<uchar>(0, i) = src.at<uchar>(0, i);
169-
dst.at<uchar>(row - 1, i) = src.at<uchar>(row - 1, i);
170-
}
171165
}
172-
return dst;
166+
#pragma omp for nowait
167+
for (int i = 0; i < width; i++) {
168+
dst[i] = src[i];
169+
dst[(height - 1) * width + i] = src[(height - 1) * width + i];
170+
}
171+
#pragma omp for nowait
172+
for (int i = 0; i < height; i++) {
173+
dst[i * width] = src[i * width];
174+
dst[i * width + width - 1] = src[i * width + width - 1];
175+
}
176+
}
177+
}
178+
179+
Mat Openmp_MedianFilter(Mat src) {
180+
int row = src.rows;
181+
int col = src.cols;
182+
unsigned char * data = (unsigned char *)src.data;
183+
unsigned char *dst = new unsigned char[row * col];
184+
//for (int i = 0; i < row * col; i++) {
185+
// printf("%d\n", data[i]);
186+
//}
187+
MultiThtreadsFilter(row, col, data, dst);
188+
Mat res(row, col, CV_8UC1, dst);
189+
return res;
173190
}
174191

175192
Mat speed_rgb2gray(Mat src) {
@@ -190,7 +207,7 @@ Mat speed_rgb2gray(Mat src) {
190207
}
191208

192209
int main() {
193-
Mat src = cv::imread("F:\\2.jpg");
210+
Mat src = cv::imread("F:\\2.png");
194211
src = speed_rgb2gray(src);
195212
int row = src.rows;
196213
int col = src.cols;

0 commit comments

Comments
 (0)