Skip to content

Commit 34220d1

Browse files
committed
Update speed_meanFilter_in_gray_image.cpp openmp
1 parent 76188cd commit 34220d1

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

Algorithm optimization/speed_meanFilter_in_gray_image.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
#include <stdio.h>
2+
#include <iostream>
3+
#include <opencv2/opencv.hpp>
4+
using namespace cv;
5+
using namespace std;
16
//所有代码针对灰度图,RGB分为3个通道处理
27
//中值滤波串行代码
38
Mat SerialMedianFiltering(Mat src) {
@@ -95,6 +100,85 @@ Mat x86MedianFiltering(Mat src, const int BX, const int BY) {
95100
return dst;
96101
}
97102

103+
//openmp + x86循环展开优化均值滤波
104+
Mat OpenmpMedianFiltering(Mat src, const int BX, const int BY) {
105+
int row = src.rows;
106+
int col = src.cols;
107+
Mat dst(row, col, CV_8UC1);
108+
int i, j;
109+
#pragma omp parallel for lastprivate(i)
110+
for (i = 1; i < row - 1 - BY; i += BY) {
111+
for (j = 1; j < col - 1 - BX; j += BX) {
112+
unsigned short *temp = new unsigned short[BX*BY];
113+
memset(temp, 0, sizeof(temp));
114+
for (int ii = 0; ii < BY; ii++) {
115+
for (int jj = 0; jj < BX; jj++) {
116+
temp[ii*BX + jj] += src.at<uchar>(i + ii, j + jj - 1);
117+
temp[ii*BX + jj] += src.at<uchar>(i + ii, j + jj);
118+
temp[ii*BX + jj] += src.at<uchar>(i + ii, j + jj + 1);
119+
temp[ii*BX + jj] += src.at<uchar>(i + ii + 1, j + jj - 1);
120+
temp[ii*BX + jj] += src.at<uchar>(i + ii + 1, j + jj);
121+
temp[ii*BX + jj] += src.at<uchar>(i + ii + 1, j + jj + 1);
122+
temp[ii*BX + jj] += src.at<uchar>(i + ii - 1, j + jj - 1);
123+
temp[ii*BX + jj] += src.at<uchar>(i + ii - 1, j + jj);
124+
temp[ii*BX + jj] += src.at<uchar>(i + ii - 1, j + jj + 1);
125+
}
126+
}
127+
for (int ii = 0; ii < BY; ii++) {
128+
for (int jj = 0; jj < BX; jj++) {
129+
dst.at<uchar>(i + ii, j + jj) = (unsigned char)(temp[ii * BX + jj] / 9);
130+
}
131+
}
132+
}
133+
for (int ii = 0; ii < BY; ii++) {
134+
for (int je = j; je < col - 1; je++) {
135+
unsigned short temp = 0;
136+
temp += src.at<uchar>(i + ii, je);
137+
temp += src.at<uchar>(i + ii, je + 1);
138+
temp += src.at<uchar>(i + ii, je - 1);
139+
140+
temp += src.at<uchar>(i + ii + 1, je);
141+
temp += src.at<uchar>(i + ii + 1, je + 1);
142+
temp += src.at<uchar>(i + ii + 1, je - 1);
143+
144+
temp += src.at<uchar>(i + ii - 1, je);
145+
temp += src.at<uchar>(i + ii - 1, je + 1);
146+
temp += src.at<uchar>(i + ii - 1, je - 1);
147+
dst.at<uchar>(i + ii, je) = (unsigned char)(temp / 9);
148+
}
149+
}
150+
}
151+
for (int ie = i; ie < row - 1; ie++) {
152+
for (int j = 1; j < col - 1; j++) {
153+
unsigned short temp = 0;
154+
temp += src.at<uchar>(ie, j);
155+
temp += src.at<uchar>(ie, j + 1);
156+
temp += src.at<uchar>(ie, j - 1);
157+
temp += src.at<uchar>(ie - 1, j);
158+
temp += src.at<uchar>(ie - 1, j + 1);
159+
temp += src.at<uchar>(ie - 1, j - 1);
160+
temp += src.at<uchar>(ie + 1, j);
161+
temp += src.at<uchar>(ie + 1, j + 1);
162+
temp += src.at<uchar>(ie + 1, j - 1);
163+
dst.at<uchar>(ie, j) = (unsigned char)(temp / 9);
164+
}
165+
}
166+
#pragma omp parallel
167+
{
168+
#pragma omp for
169+
for (int i = 0; i < row; i++) {
170+
dst.at<uchar>(i, 0) = src.at<uchar>(i, 0);
171+
dst.at<uchar>(i, col - 1) = src.at<uchar>(i, col - 1);
172+
}
173+
#pragma omp for
174+
for (int i = 0; i < col; i++) {
175+
dst.at<uchar>(0, i) = src.at<uchar>(0, i);
176+
dst.at<uchar>(row - 1, i) = src.at<uchar>(row - 1, i);
177+
}
178+
}
179+
return dst;
180+
}
181+
98182
Mat speed_rgb2gray(Mat src) {
99183
Mat dst(src.rows, src.cols, CV_8UC1);
100184
#pragma omp parallel for num_threads(4)

0 commit comments

Comments
 (0)