Skip to content

Commit 6bc3239

Browse files
committed
Update speed_meanFilter_in_gray_image.cpp x86
1 parent e1f8958 commit 6bc3239

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
//所有代码针对灰度图,RGB分为3个通道处理
2+
//中值滤波串行代码
3+
Mat SerialMedianFiltering(Mat src) {
4+
int row = src.rows;
5+
int col = src.cols;
6+
Mat dst(row, col, CV_8UC1);
7+
for (int i = 1; i < row - 1; i++) {
8+
for (int j = 1; j < col - 1; j++) {
9+
dst.at<uchar>(i, j) = ((int)src.at<uchar>(i, j) + src.at<uchar>(i, j + 1) + src.at<uchar>(i, j - 1) +
10+
src.at<uchar>(i - 1, j) + src.at<uchar>(i - 1, j - 1) + src.at<uchar>(i - 1, j + 1) +
11+
src.at<uchar>(i + 1, j) + src.at<uchar>(i + 1, j - 1) + src.at<uchar>(i + 1, j + 1)) / 9;
12+
}
13+
}
14+
for (int i = 0; i < row; i++) {
15+
dst.at<uchar>(i, 0) = src.at<uchar>(i, 0);
16+
dst.at<uchar>(i, col - 1) = src.at<uchar>(i, col - 1);
17+
}
18+
for (int i = 0; i < col; i++) {
19+
dst.at<uchar>(0, i) = src.at<uchar>(0, i);
20+
dst.at<uchar>(row - 1, i) = src.at<uchar>(row - 1, i);
21+
}
22+
return dst;
23+
}
24+
25+
//x86循环展开优化均值滤波
26+
Mat x86MedianFiltering(Mat src, const int BX, const int BY) {
27+
int row = src.rows;
28+
int col = src.cols;
29+
Mat dst(row, col, CV_8UC1);
30+
int i, j;
31+
for (i = 1; i < row - 1 - BY; i += BY) {
32+
for (j = 1; j < col - 1 - BX; j += BX) {
33+
unsigned short *temp = new unsigned short[BX*BY];
34+
memset(temp, 0, sizeof(temp));
35+
for (int ii = 0; ii < BY; ii++) {
36+
for (int jj = 0; jj < BX; jj++) {
37+
temp[ii*BX + jj] += src.at<uchar>(i + ii, j + jj - 1);
38+
temp[ii*BX + jj] += src.at<uchar>(i + ii, j + jj);
39+
temp[ii*BX + jj] += src.at<uchar>(i + ii, j + jj + 1);
40+
temp[ii*BX + jj] += src.at<uchar>(i + ii + 1, j + jj - 1);
41+
temp[ii*BX + jj] += src.at<uchar>(i + ii + 1, j + jj);
42+
temp[ii*BX + jj] += src.at<uchar>(i + ii + 1, j + jj + 1);
43+
temp[ii*BX + jj] += src.at<uchar>(i + ii - 1, j + jj - 1);
44+
temp[ii*BX + jj] += src.at<uchar>(i + ii - 1, j + jj);
45+
temp[ii*BX + jj] += src.at<uchar>(i + ii - 1, j + jj + 1);
46+
}
47+
}
48+
for (int ii = 0; ii < BY; ii++) {
49+
for (int jj = 0; jj < BX; jj++) {
50+
dst.at<uchar>(i + ii, j + jj) = (unsigned char)(temp[ii * BX + jj] / 9);
51+
}
52+
}
53+
}
54+
for (int ii = 0; ii < BY; ii++) {
55+
for (int je = j; je < col - 1; je++) {
56+
unsigned short temp = 0;
57+
temp += src.at<uchar>(i + ii, je);
58+
temp += src.at<uchar>(i + ii, je + 1);
59+
temp += src.at<uchar>(i + ii, je - 1);
60+
61+
temp += src.at<uchar>(i + ii + 1, je);
62+
temp += src.at<uchar>(i + ii + 1, je + 1);
63+
temp += src.at<uchar>(i + ii + 1, je - 1);
64+
65+
temp += src.at<uchar>(i + ii - 1, je);
66+
temp += src.at<uchar>(i + ii - 1, je + 1);
67+
temp += src.at<uchar>(i + ii - 1, je - 1);
68+
dst.at<uchar>(i + ii, je) = (unsigned char)(temp / 9);
69+
}
70+
}
71+
}
72+
for (int ie = i; ie < row - 1; ie++) {
73+
for (int j = 1; j < col - 1; j++) {
74+
unsigned short temp = 0;
75+
temp += src.at<uchar>(ie, j);
76+
temp += src.at<uchar>(ie, j + 1);
77+
temp += src.at<uchar>(ie, j - 1);
78+
temp += src.at<uchar>(ie - 1, j);
79+
temp += src.at<uchar>(ie - 1, j + 1);
80+
temp += src.at<uchar>(ie - 1, j - 1);
81+
temp += src.at<uchar>(ie + 1, j);
82+
temp += src.at<uchar>(ie + 1, j + 1);
83+
temp += src.at<uchar>(ie + 1, j - 1);
84+
dst.at<uchar>(ie, j) = (unsigned char)(temp / 9);
85+
}
86+
}
87+
for (int i = 0; i < row; i++) {
88+
dst.at<uchar>(i, 0) = src.at<uchar>(i, 0);
89+
dst.at<uchar>(i, col - 1) = src.at<uchar>(i, col - 1);
90+
}
91+
for (int i = 0; i < col; i++) {
92+
dst.at<uchar>(0, i) = src.at<uchar>(0, i);
93+
dst.at<uchar>(row - 1, i) = src.at<uchar>(row - 1, i);
94+
}
95+
return dst;
96+
}
97+
98+
Mat speed_rgb2gray(Mat src) {
99+
Mat dst(src.rows, src.cols, CV_8UC1);
100+
#pragma omp parallel for num_threads(4)
101+
for (int i = 0; i < src.rows; i++) {
102+
for (int j = 0; j < src.cols; j++) {
103+
dst.at<uchar>(i, j) = ((src.at<Vec3b>(i, j)[0] << 18) + (src.at<Vec3b>(i, j)[0] << 15) + (src.at<Vec3b>(i, j)[0] << 14) +
104+
(src.at<Vec3b>(i, j)[0] << 11) + (src.at<Vec3b>(i, j)[0] << 7) + (src.at<Vec3b>(i, j)[0] << 7) + (src.at<Vec3b>(i, j)[0] << 5) +
105+
(src.at<Vec3b>(i, j)[0] << 4) + (src.at<Vec3b>(i, j)[0] << 2) +
106+
(src.at<Vec3b>(i, j)[1] << 19) + (src.at<Vec3b>(i, j)[1] << 16) + (src.at<Vec3b>(i, j)[1] << 14) + (src.at<Vec3b>(i, j)[1] << 13) +
107+
(src.at<Vec3b>(i, j)[1] << 10) + (src.at<Vec3b>(i, j)[1] << 8) + (src.at<Vec3b>(i, j)[1] << 4) + (src.at<Vec3b>(i, j)[1] << 3) + (src.at<Vec3b>(i, j)[1] << 1) +
108+
(src.at<Vec3b>(i, j)[2] << 16) + (src.at<Vec3b>(i, j)[2] << 15) + (src.at<Vec3b>(i, j)[2] << 14) + (src.at<Vec3b>(i, j)[2] << 12) +
109+
(src.at<Vec3b>(i, j)[2] << 9) + (src.at<Vec3b>(i, j)[2] << 7) + (src.at<Vec3b>(i, j)[2] << 6) + (src.at<Vec3b>(i, j)[2] << 5) + (src.at<Vec3b>(i, j)[2] << 4) + (src.at<Vec3b>(i, j)[2] << 1) >> 20);
110+
}
111+
}
112+
return dst;
113+
}

0 commit comments

Comments
 (0)