Skip to content

Commit 6f65c45

Browse files
committed
Update BoxFilter.cpp
1 parent 5759bb5 commit 6f65c45

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

ImageFiltering/Box Filter.cpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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+
}

ImageFiltering/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
- Gaussian Filter.cpp C++实现了高斯滤波,支持一个通道和3个通道的高斯滤波。原理请看:https://blog.csdn.net/just_sort/article/details/84305585
55
- Guided Filter.cpp C++实现了何凯明提出的引导滤波,可以用于暗通道去雾加速。原理请看:https://blog.csdn.net/just_sort/article/details/84324239
66
- BilateralFilter.cpp C++实现了双边滤波,在滤除噪声的同时可以对原图的边缘细节进行保留。原理请看:https://blog.csdn.net/just_sort/article/details/84957533
7+
- BoxFilter.cpp C++实现了方框滤波(盒滤波),用于平滑图像。原理为滤波器值全为(1/滤波器元素个数)在原图进行滑动。

0 commit comments

Comments
 (0)