@@ -6,45 +6,53 @@ using namespace cv;
66using 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
113121Mat 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
175192Mat speed_rgb2gray (Mat src) {
@@ -190,7 +207,7 @@ Mat speed_rgb2gray(Mat src) {
190207}
191208
192209int 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