中值滤波(Median Filter)是一种非线性滤波技术,其基本思想是在单通道中将像素点邻域的灰度值进行排序,取中间值来代替原来的像素点的灰度值。中值滤波是目前处理椒盐噪声最好的滤波方式。
椒盐噪声(salt-and-pepper noise)又称脉冲噪声,在传感器或者远程传输的过程中,原本的数据会被影响,导致图像出现大量散粒状的噪声点。而在图像中,能量大部分集中在低频和中频,因此将邻域的数据排序取的中间值很少会取到被污染的高频点。

一、几个基本概念

(1)什么是线性滤波和非线性滤波?

线性滤波:指两个或多个信号之和的响应等于它们各自响应之和。这么说过于学术化了,简单来说就是图像上的每一个像素点的输出值是等于一些输入像素点的加权和。非线性滤波: 在计算中包含了取绝对值、置零等非线性运算。

(2) 像素点的邻域
顾名思义,一个像素点的邻域是指该像素点相邻的一些像素点。

二、中值滤波器原理

如果不在边缘区域,图像的数据是平缓的,没有太大的差值。因此,一个噪声点的值要么过大,要么过小。比如下图,左图是没有处理的原图,250在该区域由为突出,通过对3*3的9个数据进行排序,将中间值150重新填入,即滤波完成,原本的噪声点被去掉,该区域恢复平缓。同理,在边缘区域中,对于边界来说,高频不会影响,而过低数值将会突出,中值的选择将不会受到影响,除非3*3的整块区域都被污染,这时我们可以考虑更大的核来处理。

三、中值滤波实现过程

首先来看看程序效果:

(1) main函数: 读取图片—中值滤波——显示

int main(void)
{// [1] src读入图片cv::Mat src = cv::imread("pic3.jpg");// [2] dst目标图片cv::Mat dst;// [3] 中值滤波 RGB (5*5)的核大小dealMedianRGB(src, dst, 5, 5);// [4] 窗体显示cv::imshow("src", src);cv::imshow("dst", dst);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

(2) 彩色图像的通道分离
中值滤波是在一个通道上对像素点的值进行操作的,因此,将一幅彩色图像(RGB)进行分离,分别对R通道、G通道、B通道进行中值滤波处理,最后合并。

void dealMedianGary(const cv::Mat *src, cv::Mat *dst, int n, int m)
{// [1] 初始化*dst = (*src).clone();// [2] 彩色图片通道分离std::vector<cv::Mat> channels;cv::split(*src, channels);// [3] 滤波for (int i = 0; i < 3; i++) {MedianGary(&channels[i], n, m);}// [4] 合并返回cv::merge(channels, *dst);return ;
}

(3) 中值滤波处理主程序,通过扫描图像的每一个像素点,然后根据一个像素点确定一个5*5的矩形区域,将区域中的数据排序后获得一个返回值,最后将该值填入该输出像素点。
该代码只能完成5*5处理,博主比较懒就不写分类处理了,有兴趣自己写,哈哈哈哈~

void MedianGary(cv::Mat *dst, int n, int m)
{unsigned char *_medianArray = NULL;// [2] 初始化_medianArray = (unsigned char *)malloc(sizeof(unsigned char)*(n*m));printf(" 5 * 5 start ... ... \n");// [2-1] 扫描for (int i = 0; i < dst->height; i++) {for (int j = 0; j < dst->width; j++) {// [2-2] 忽略边缘if ((i>1) && (j>1) && (i<dst->height-2) && (j<dst->width-2)) {// [2-3] 保存数组int _count = 2;for (int num=0; num<(n*m); num+=5,_count--) {_medianArray[num] = *((unsigned char*)(dst->imageData+(i-_count)*dst->widthStep+(j-2)));_medianArray[num+1] = *((unsigned char*)(dst->imageData+(i-_count)*dst->widthStep+(j-1)));_medianArray[num+2] = *((unsigned char*)(dst->imageData+(i-_count)*dst->widthStep+(j)));_medianArray[num+3] = *((unsigned char*)(dst->imageData+(i-_count)*dst->widthStep+(j+1)));_medianArray[num+4] = *((unsigned char*)(dst->imageData+(i-_count)*dst->widthStep+(j+2)));}// [2-5] 求中值并保存*((unsigned char*)(dst->imageData+i*dst->widthStep+j)) = medianValue(_medianArray, (n*m));}//for[2-2]}}//for[2-1]
}

(4) 矩阵排序, 这里采用的冒泡排序,当然你也可以用快排或者其他的

// [## 求中值 冒泡 ##]
unsigned char medianValue(unsigned char * _medianArray, int count)
{unsigned char temp;int i, j;// 冒泡for (j = 0; j < count - 1; j++) {for (i = 0; i < count - 1 - j; i++){if (_medianArray[i] > _medianArray[i + 1]){temp = _medianArray[i];_medianArray[i] = _medianArray[i + 1];_medianArray[i + 1] = temp;}}}return _medianArray[count/2];
}

OpenCV中值滤波器详解及代码实现相关推荐

  1. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)

    Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...

  2. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  3. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  4. python 自动化-Python API 自动化实战详解(纯代码)

    主要讲如何在公司利用Python 搞API自动化. 1.分层设计思路 dataPool :数据池层,里面有我们需要的各种数据,包括一些公共数据等 config :基础配置 tools : 工具层 co ...

  5. 数学建模——智能优化之遗传算法详解Python代码

    数学建模--智能优化之遗传算法详解Python代码 import numpy as np import matplotlib.pyplot as plt from matplotlib import ...

  6. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  7. 数学建模——智能优化之模拟退火模型详解Python代码

    数学建模--智能优化之模拟退火模型详解Python代码 #本功能实现最小值的求解#from matplotlib import pyplot as plt import numpy as np imp ...

  8. 数学建模——智能优化之粒子群模型详解Python代码

    数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...

  9. 数学建模——支持向量机模型详解Python代码

    数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...

最新文章

  1. 零基础学python需要多久-零基础学习Python大概要多久,感悟分享?
  2. js改变classname 或添加classname
  3. 故障排查:是什么 导致了客户端批量心跳超时掉线
  4. spring的log4j listener(webAppRootKey)
  5. oracle cusor 定义
  6. 开源的.NET运行剖析器nprof简单使用指引
  7. RIA开发权威指南 基于JavaFX(赠品)
  8. 如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间
  9. 【 HDU - 1215 】七夕节(数论,约数和公式)
  10. 生成javaDoc文档MyEclipse 0914
  11. mysql中的dateDayOfYear_Mysql 常用的时间日期及转换函数小结
  12. 正定矩阵、正定矩阵与极值的关系、黑塞矩阵、牛顿法
  13. 秋招之8.31农行研发中心笔试
  14. 等额本息PMT和PPMT推导计算公式
  15. CSS 语法 网贷黑户正规查询系统,通过CSS选择器控制怎么查自己带过的网贷数量做一个个人网贷记录查询软件
  16. poi-ooxml-lite:5.0.0 与 poi-ooxml-schemas:4.1.1 正式环境冲突
  17. discuz_result
  18. 【代数语言学巡礼】Lambda-演算在形式语义学的中应用II
  19. Java 移位、逻辑运算符详解(~史上最全|吹牛逼)
  20. 操作系统——并发相关问题

热门文章

  1. 【选型】CC2530F256方案简介
  2. 南京邮电大学网络信息安全——网络数据包捕获WireShark(实验一)
  3. 18-----BBS论坛
  4. ORA-01017:用户名/口令无效,登录被拒绝(ORA-01017: invalid username/password; logon denied)
  5. CentOS上安装各种安装包
  6. 固定资产清理之源码研究
  7. Windows内核--内核空间和用户空间(3.6)
  8. python - 集合:华为笔试题
  9. Android ImageButton(图片按钮)
  10. “航天天域分布式数据库”获评第四届数字中国国务院国资委央企十大科技成果