空间域平滑滤波器
原文:https://www.cnblogs.com/zfyouxi/p/5144068.html
1.空间域增强
(1)模版运算
图像处理中。模版能够看作是n*n(n通常是奇数)的窗体。模版连续地运动于整个图像中,对模版窗体范围内的像素做相应处理。
模版运算主要分为:
- 模版卷积
- 模版排序
模版卷积是把模版内像素的灰度值和模版中相应的灰度值相乘,求平均值赋给当前模版窗体的中心像素。作为它的灰度值;
模版排序是把模版内像素的灰度值排序,取某个顺序统计量作为模版中心像素灰度值。
Matlab中做模版卷积十分高效,取出模版内子矩阵和模版权重点乘求平均就可以
我们非常easy想到模版的中心点是边界的特殊情况。处理边界有非常多种做法:
- 忽略边界
- 外插边界
- 改变模版领域
忽略边界是模版直接在非边界点运动操作,直接忽略这些边界点。这么做的优点当然是效率高,比較适合图像尺寸较大或人们感兴趣部分不在图像边缘的情况;
外插边界顾名思义就是补齐边界点作为模版中心时缺失的像素部分,能够赋予补边像素一定的灰度值并作计算。优点在于不牺牲性能的情况下,对边界进行了处理。可是补边像素的灰度值设定势必导致边界的像素点的不连贯性,严重情况下导致失真;
改变模版领域是指在边界处理中改变模版窗体的大小,为边界做特殊处理,如3*3
模版在处理最左上角像素点时仅仅考虑图像内点2*2
的模版运算。这样为边界特殊考虑既不失真又没有忽略不论什么像素点。可是在推断边界时势必会产生一定的开销。稍微会影响图像处理的性能(能够分情况写,在牺牲程序复杂度的情况下弥补推断带来的开销)。
不论什么的边界处理都不是完美的,都在一定程度上又一次分配了模版权重。
(2)空间域滤波
把模版运算运用于图像的空间域增强的技术称为空间域滤波。依据滤波频率空间域滤波分为平滑滤波(减弱和去除高频分量)和锐化滤波(减弱和去除低频分量),依据滤波计算特点又分为线性滤波和非线性滤波。
因此空间域滤波可分为:
分类 | 线性 | 非线性 |
---|---|---|
平滑 | 线性平滑 | 非线性平滑 |
锐化 | 线性锐化 | 非线性锐化 |
2.均值滤波
(1)均值滤波器
领域均值滤波顾名思义是就是求模版内像素点灰度的均值。是最经典的线性平滑滤波。空域滤波经常使用于去除加性噪声,通常把滤波算法封装的模块称作滤波器。
均值滤波的模版就是ones(n, n)
,模版内全部元素均是一,即他们的权重一模一样。
其它经常使用的线性滤波还有:
- 加权滤波:通常中心元素权重较大,且对称向外递减
- 高斯滤波:加权滤波的特例,依据高斯分布确定模版系数
(2)代码实现
先调用Matlab函数给图像加入3%的椒盐噪声:
salt = imnoise(original,'salt & pepper',0.03);
接下来构造我们的均值滤波器。我採用改变模版领域。也就是对边界条件推断做特殊处理:
function [ filtered ] = MeanFilter( noise )
filtered = noise;
h = size(filtered, 1);
w = size(filtered, 2);
for i = 1 : h
for j = 1 : w
up = max(i - 1, 1);
down = min(i + 1, h);
left = max(j - 1, 1);
right = min(j + 1, w);
filtered(i, j) = mean(mean(noise(up : down, left : right)));
end
end
end
这里我调用了一系列的max
和min
函数避免写起来比較繁杂的if语句。确定了模版边界后直接调用mean
函数求均值,淡化了模版卷积的概念(后面边缘检測中会显式地做模版卷积)。
3.中值滤波
(1)中值滤波器
中值滤波选取模版中像素灰度值的中位数赋给模版中心像素,是经典的非线性平滑滤波。
理想情况下,中值滤波的椒盐去噪效果优于均值滤波。是由于它能有效的消除孤立阶跃脉冲噪声。后面将比較分析。
2-D中值滤波也能够选取各种各样的模版,我在这里就选取最简单的8-领域模版做演示。
(2)代码实现
相同我检測边界。做特殊处理:
function [ filtered ] = MedianFilter( noise )
filtered = noise;
h = size(filtered, 1);
w = size(filtered, 2);
for i = 1 : h
for j = 1 : w
up = max(i - 1, 1);
down = min(i + 1, h);
left = max(j - 1, 1);
right = min(j + 1, w);
sub = noise(up : down, left : right);
sub = sub(:);
filtered(i, j) = median(sub);
end
end
end
仅仅须要将子矩阵转成向量。再求median
就可以。
注:我没有细致研究Matlab median函数实现方式,如果它是一个平方量级的算法,那么我们有以下两种优化方式,来提升中值滤波的速度:
- 寻求效率更高的顺序统计量算法。见算法导论——期望为线性时间的选择算法和最坏情况为线性时间的选择算法
- 利用模版移动的连续性。邻近移动区域仅仅有少量像素点不同,能够依据模版的这个性质构造线性时间的增量式顺序统计量算法
4.两种滤波器结果对照讨论
(1)平滑结果展示
以下是椒盐噪声的去除效果,中值滤波的效果更优:
以下是高斯噪声的去除效果,均值滤波的效果更优:
(2)讨论
这里并没有数学理论的数学分析。也没有给出样例。仅仅是从直观理解角度简要分析:
- 中值滤波去除椒盐效果更好。由于椒盐噪声是阶跃脉冲噪声(取值0或255且小概率出现),中值滤波是去中位数,不会被阶跃值影响,所以差点儿能全然过滤掉阶跃脉冲噪声。
而均值滤波处理阶跃值时分配权重不会变化。那么求平均值时受阶跃值影响而产生的误差就较大。因此效果不理想。
- 高斯噪声是图像中每一个像素点都从原灰度值依据高斯分布做随机噪声。那么选取中值的代表意义并不大,由于各个像素都是独立同分布的。中值滤波相当于在模版内再选出了一个经过高斯噪声变换后的灰度值,滤波效果和噪声图像没有明显改善,所以比較之下均值滤波较优。
原文地址:https://www.cnblogs.com/Ph-one/p/11568406.html
- Validation of viewstate MAC failed 解决办法
- springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected sin
- springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected sin
- idea启动多个tomcat失败
- Log4Net 生成多个文件、文件名累加解决方法
- 【C#|.NET】lock(this)其实是个坑
- SpringMVC过程中@RequestBody接收Json的问题 总是报415
- 如何开发自己的搜索帝国之安装ik分词器
- 如何开发自己的搜索帝国之ES图形化Kibana安装与使用
- 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备
- 分布式文件系统FastDFS如何做到高可用
- 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
- SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法
- 分布式监控系统Zabbix3.2对数据库的连接数预警
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Array - 277 Find the Celebrity
- Array - 80. Remove Duplicates from Sorted Array II
- Array - 508. Wiggle Sort
- Array - 376. Wiggle Subsequence
- Array - 283. Move Zeroes
- Array - 88. Merge Sorted Array
- Array - 228. Summary Ranges
- Array - 152. Maximum Product Subarray
- Focal Loss和它背后的男人RetinaNet
- Array - 53. Maximum Subarray
- Array - 295. Find Median from Data Stream
- Array - 239. Sliding Window Maximum
- Array - 164. Maximum Gap
- Array - 128. Longest Consecutive Sequence
- String - 13. Roman to Integer