C++实现均值滤波器和中值滤波器
代码实现均值滤波器和中值滤波器
由于中值滤波器是非线性滤波,不是卷积,所以均值和中值滤波分开实现。opencv版本为3.4.5
my_convolution.h
#ifndef MY_CONVOLUTION
#define MY_CONVOLUTION
#include <opencv2/opencv.hpp>
class My_Convolution {
public:
My_Convolution();
~My_Convolution();
bool load_kernal(const cv::Mat kernal);//加载卷积核
void convolute(const cv::Mat &image, cv::Mat &dst);//卷积操作
private:
bool kernal_loaded;//是否已经加载卷积核
cv::Mat curr_kernal;//当前卷积核
int bios_x, bios_y;//记录偏移量
//计算每一个像素的掩模乘积之和
void compute_sum_of_product(int i, int j, int chan, cv::Mat &complete_image, cv::Mat & dst);
//将原图像转换成边框补全的图像
void complete_image_transform(const cv::Mat &image, cv::Mat &dst);
};
#endif // MY_CONVOLUTION
my_convolution.cpp
#include "my_convolution.h"
using namespace std;
using namespace cv;
My_Convolution::My_Convolution() {
kernal_loaded = false;
}
My_Convolution::~My_Convolution() {
}
//加载卷积核
bool My_Convolution::load_kernal(const Mat kernal) {
if (kernal.cols % 2 == 1 && kernal.rows % 2 == 1) {
curr_kernal = kernal.clone();
bios_x = (kernal.cols - 1) / 2;
bios_y = (kernal.rows - 1) / 2;
kernal_loaded = true;
return true;
}
else {
cout << "The size of kernal is not suitable!" << endl;
return false;
}
}
//卷积操作
void<