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 My_Convolution::convolute(const Mat &image, Mat &dst) {if (!kernal_loaded) {cout << "kernal is empty!Please load the kernal first!" << endl;return;}Mat complete_image;complete_image_transform(image, complete_image);dst = Mat::zeros(image.rows, image.cols, image.type());int channels = image.channels();//获取图像的通道数if (channels == 3) {for (int chan = 0;chan < channels;chan++) {for (int i = 0;i < dst.rows;i++) {for (int j = 0;j < dst.cols;j++) {compute_sum_of_product(i, j, chan, complete_image, dst);}}}return;}if (channels == 1) {for (int i = 0;i < dst.rows;i++) {for (int j = 0;j < dst.cols;j++) {compute_sum_of_product(i, j, 0, complete_image, dst);}}}}//计算掩模乘积之和
void My_Convolution::compute_sum_of_product(int i, int j, int chan, Mat &complete_image, Mat &dst) {if (complete_image.channels() == 3) {float sum = 0;int bios_rows = i;int bios_cols = j;for (int curr_rows = 0;curr_rows < curr_kernal.rows;curr_rows++) {for (int curr_cols = 0;curr_cols < curr_kernal.cols;curr_cols++) {float a = curr_kernal.at<float>(curr_rows, curr_cols)*complete_image.at<Vec3b>(curr_rows + bios_rows, curr_cols + bios_cols)[chan];sum += a;}}dst.at<Vec3b>(i, j)[chan] = (int)sum;}else if (complete_image.channels() == 1) {float sum = 0;int bios_rows = i;int bios_cols = j;for (int curr_rows = 0;curr_rows < curr_kernal.rows;curr_rows++) {for (int curr_cols = 0;curr_cols < curr_kernal.cols;curr_cols++) {float a = curr_kernal.at<float>(curr_rows, curr_cols)*complete_image.at<uchar>(curr_rows + bios_rows, curr_cols + bios_cols);sum += a;}}dst.at<uchar>(i, j) = (int)sum;}else {cout << "the type of image is not suitable!" << endl;return;}}//边框像素补全
void My_Convolution::complete_image_transform(const Mat &image, Mat &dst) {if (!kernal_loaded) {cout << "kernal is empty!" << endl;return;}//Mat的type()成员函数生成CV_<位数>(S/U/F)C<通道数>//初始化一个补全图像的大小。dst = Mat::zeros(2 * bios_y + image.rows, 2 * bios_x + image.cols, image.type());Rect real_roi_of_image = Rect(bios_x, bios_y, image.cols, image.rows);Mat real_mat_of_image = dst(real_roi_of_image);image.copyTo(real_mat_of_image);
}

my_nedianfilter.h

#ifndef MY_MEDIANFILTER
#define MY_MEDIANFILTER#include <vector>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;void MedianFilter(Mat& src, Mat& dst, int win_size);
void Complete_Image_Transform(Mat &src, Mat &comp, int size);
void Calc_Median(Mat& comp, Mat& dst, int r, int c, int s);#endif

my_nedianfilter.cpp

#include "my_medianfilter.h"void MedianFilter(Mat& src, Mat& dst, int win_size) {Mat comp = src.clone();Complete_Image_Transform(src, comp, win_size);int rows = comp.rows, cols = comp.cols;int start = win_size / 2;if (comp.channels() > 1){//彩色图片通道分离vector<Mat> channels_c, channels_d;split(comp, channels_c);split(comp, channels_d);//滤波for (int i = 0; i < 3; i++)Calc_Median(channels_c[i], channels_d[i], rows, cols, start);//合并彩色通道merge(channels_d, dst);}elseCalc_Median(comp, dst, rows, cols, start);
}//边框像素补全
void Complete_Image_Transform(Mat &src, Mat &comp, int size) {//初始化一个补全图像的大小comp = Mat::zeros(2 * (size / 2) + src.rows, 2 * (size / 2) + src.cols, src.type());Rect real_roi_of_image = Rect((size / 2), (size / 2), src.cols, src.rows);Mat real_mat_of_image = comp(real_roi_of_image);src.copyTo(real_mat_of_image);
}void Calc_Median(Mat& comp, Mat& dst, int r, int c, int s)
{for (int m = s; m < r - s; m++) {for (int n = s; n < c - s; n++) {vector<uchar> model;for (int i = -s + m; i <= s + m; i++) {for (int j = -s + n; j <= s + n; j++) {//cout << int(src.at<uchar>(i, j)) << endl;model.push_back(comp.at<uchar>(i, j));}}sort(model.begin(), model.end());     //采用快速排序进行dst.at<uchar>(m - s, n - s) = model[(s * 2 + 1) * (s * 2 + 1) / 2];}}
}

C++实现均值滤波器和中值滤波器相关推荐

  1. 第5章 Python 数字图像处理(DIP) - 图像复原与重建10 - 空间滤波 - 统计排序滤波器 - 中值、最大值、最小值、中点、修正阿尔法均值滤波器

    标题 统计排序滤波器 中值.最大值.最小值.中点 滤波器 修正阿尔法均值滤波器 统计排序滤波器 中值.最大值.最小值.中点 滤波器 f^(x,y)=median{g(r,c)}(5.27)\hat{f ...

  2. 均值滤波器类型_均值滤波适用于处理什么样的噪声

    图像降噪是图像处理中的专业术语.在现实生活中,我们看到的数字图像,在数字化和传输过程中由于常受到成像设备与外部环境噪声干扰等影响,把这些图像称为含噪图像或者叫噪声图像.减少数字图像中噪声的过程称为图像 ...

  3. 【OpenCV 例程200篇】99. 修正阿尔法均值滤波器

    [OpenCV 例程200篇]99. 修正阿尔法均值滤波器 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 3.6 修 ...

  4. 均值滤波器类型_详解图像滤波原理及实现!

    图像的实质是一种二维信号,滤波是信号处理中的一个重要概念.在图像处理中,滤波是一常见的技术,它们的原理非常简单,但是其思想却十分值得借鉴,滤波是很多图像算法的前置步骤或基础,掌握图像滤波对理解卷积神经 ...

  5. 空间滤波-统计排序滤波器-修正阿尔法均值滤波器

    目录 1. 介绍 2. 代码实现 3. code 1. 介绍 本章内容介绍的是修正阿尔法均值滤波器,它也是属于统计排序滤波器的一种.和之前的统计排序滤波不同的是,修正阿尔法均值滤波器会将kernel处 ...

  6. [数字图像处理]图像去噪初步(1)--均值滤波器

    1.图像去噪的前言 上一篇博文中,我对噪声的类型进行了介绍,也使用的Matlab对各种噪声进行了实现.旧话重提,一幅图像,甚至是一个信号的老化,能够使用下面模型来表示. 能够使用下面算式来表示 这里, ...

  7. 均值滤波器3*3模板_均值滤波器

    作者:泛音公众号:数学交点分享知识,共同学习,欢迎机器学习爱好者的投稿. 均值滤波器 介绍 均值滤波器属于低通滤波器: 输出为模板内领域像素的简单平均值: 主要用于图像的模糊和降噪,去除尖锐部分,比滤 ...

  8. 第5章 Python 数字图像处理(DIP) - 图像复原与重建9 - 空间滤波 - 均值滤波器 - 算术平均、几何平均、谐波平均、反谐波平均滤波器

    标题 只存在噪声的复原 - 空间滤波 均值滤波器 算术平均滤波器 几何均值滤波器 谐波平均滤波器 反(逆)谐波平均滤波器 只存在噪声的复原 - 空间滤波 仅被加性噪声退化 g(x,y)=f(x,y)+ ...

  9. matlab 修正后阿尔法,修正后的阿尔法均值滤波器Alpha.ppt

    修正后的阿尔法均值滤波器Alpha 数字图像处理Digital Image Processing 第6章 图像复原(Image Restoration) 第6章 图像复原(Image Restorat ...

  10. 加权均值滤波matlab,模糊加权均值滤波器

    模糊加权均值滤波器 蔡靖,杨晋生,丁润涛(天津大学电子信息工程学院,天津 300072) 摘 要 主要研究了受混合噪声污染图象的降噪滤波问题,运用模糊数学思想提出了一种基于模糊隶属度的加权均值滤波器. ...

最新文章

  1. linux删除网卡bond,linux下网卡bond的基本配置及错误
  2. 【数据结构】——快速排序
  3. 第一台定制商用NAS存储服务器
  4. Linux 实操———— Shell 远程执行命令
  5. Git 代码分支管理 / 版本管理
  6. java请求转发实例_Servlet请求转发的步骤和实例
  7. rust能捏人不_不跟风出游的五一假期,武汉人到底能去哪
  8. 原生mysql 怎么创表_Mysql的基础使用之SQL原生语句的使用:表的 创建 删除 修改 (一)...
  9. 手机上图片信息怎么拉一个矩形框_为什么华为手机明明删了照片,内存还是不足?原来问题出在这里…...
  10. python全局变量定义_python全局变量和局部变量的概念
  11. vfp 连接mysql数据库,vfp数据库的asp连接
  12. 用电机进行简单的PID参数整定
  13. SAP成本核算中的作业价格计算过程实例
  14. STC系列51单片机延时程序汇总
  15. 腕象谈表:V6卡地亚山度士后镶满钻评测
  16. oracle rman crosscheck 命令
  17. 使用sws_scale转换视频、使用swr_convert转换音频
  18. macOS长按键盘重复输入
  19. 蓝牙常用的profile
  20. 拍摄失败导致照片像素低,学会这个可以一键高清修复

热门文章

  1. JSON.stringify的使用
  2. 如何设置打印机双面打印?
  3. 计算机显示u盘隐藏分区,Win10下U盘多分区启动盘被显示怎么隐藏方法
  4. ktv服务器管理系统,小型KTV综合解决方案
  5. 力控批量建立数据库点参数操作
  6. ocp认证考试报名_2019年OCP认证在线考试网_OCP题库
  7. Java:idea查看JDK源码
  8. Chrome 下载文件出现已禁止
  9. JSON字符串和JSON对象的相互转换
  10. 《算法笔记》胡凡 例题/练习 答案