1+ #include " opencv2/opencv.hpp"
2+ #include " iostream"
3+ #include " algorithm"
4+ #include " vector"
5+ #include " stdio.h"
6+ using namespace std ;
7+ using namespace cv ;
8+
9+ void BoxFilter (const Mat &src, Mat &dst, int ksize){
10+ CV_Assert (src.channels ()==1 || src.channels () == 3 ); // 只处理单通道或者三通道图像
11+ // 生成一维的
12+ double *matrix = new double [ksize];
13+ double sum = 0 ;
14+ int origin = ksize / 2 ;
15+ for (int i = 0 ; i < ksize; i++){
16+ double g =1.0 ;
17+ sum += g;
18+ matrix[i] = g;
19+ }
20+ for (int i = 0 ; i < ksize; i++) matrix[i] /= sum;
21+ int border = ksize / 2 ;
22+ copyMakeBorder (src, dst, border, border, border, border, BORDER_CONSTANT);
23+ int channels = dst.channels ();
24+ int rows = dst.rows - border;
25+ int cols = dst.cols - border;
26+ // 水平方向
27+ for (int i = border; i < rows; i++){
28+ for (int j = border; j < cols; j++){
29+ double sum[3 ] = {0 };
30+ for (int k = -border; k<=border; k++){
31+ if (channels == 1 ){
32+ sum[0 ] += matrix[border + k] * dst.at <uchar>(i, j+k);
33+ }else if (channels == 3 ){
34+ Vec3b rgb = dst.at <Vec3b>(i, j+k);
35+ sum[0 ] += matrix[border+k] * rgb[0 ];
36+ sum[1 ] += matrix[border+k] * rgb[1 ];
37+ sum[2 ] += matrix[border+k] * rgb[2 ];
38+ }
39+ }
40+ for (int k = 0 ; k < channels; k++){
41+ if (sum[k] < 0 ) sum[k] = 0 ;
42+ else if (sum[k] > 255 ) sum[k] = 255 ;
43+ }
44+ if (channels == 1 )
45+ dst.at <Vec3b>(i, j) = static_cast <uchar>(sum[0 ]);
46+ else if (channels == 3 ){
47+ Vec3b rgb = {static_cast <uchar>(sum[0 ]), static_cast <uchar>(sum[1 ]), static_cast <uchar>(sum[2 ])};
48+ dst.at <Vec3b>(i, j) = rgb;
49+ }
50+ }
51+ }
52+ // 竖直方向
53+ for (int i = border; i < rows; i++){
54+ for (int j = border; j < cols; j++){
55+ double sum[3 ] = {0 };
56+ for (int k = -border; k<=border; k++){
57+ if (channels == 1 ){
58+ sum[0 ] += matrix[border + k] * dst.at <uchar>(i+k, j);
59+ }else if (channels == 3 ){
60+ Vec3b rgb = dst.at <Vec3b>(i+k, j);
61+ sum[0 ] += matrix[border+k] * rgb[0 ];
62+ sum[1 ] += matrix[border+k] * rgb[1 ];
63+ sum[2 ] += matrix[border+k] * rgb[2 ];
64+ }
65+ }
66+ for (int k = 0 ; k < channels; k++){
67+ if (sum[k] < 0 ) sum[k] = 0 ;
68+ else if (sum[k] > 255 ) sum[k] = 255 ;
69+ }
70+ if (channels == 1 )
71+ dst.at <Vec3b>(i, j) = static_cast <uchar>(sum[0 ]);
72+ else if (channels == 3 ){
73+ Vec3b rgb = {static_cast <uchar>(sum[0 ]), static_cast <uchar>(sum[1 ]), static_cast <uchar>(sum[2 ])};
74+ dst.at <Vec3b>(i, j) = rgb;
75+ }
76+ }
77+ }
78+ delete [] matrix;
79+ }
80+
81+ int main (){
82+ Mat src = imread (" ../beauty.jpg" );
83+ Mat dst (src.rows , src.cols , CV_8UC3);
84+ BoxFilter (src, dst, 5 );
85+ imshow (" origin" , src);
86+ imshow (" origin" , dst);
87+ waitKey (0 );
88+ imwrite (" ../result.jpg" , dst);
89+ return 0 ;
90+ }
0 commit comments