注:本系列来自于图像处理课程实验,用Matlab实现最主要的图像处理算法算法
本文章是Matlab图像处理系列的第二篇文章。介绍了空间域图像处理最主要的概念————模版和滤波器,给出了均值滤波起和中值滤波器的Matlab实现。最后简要讨论去躁效果。bash
图像处理中。模版可以看做是n*n(n一般是奇数)的窗体。模版连续地运动于整个图像中,对模版窗体范围内的像素作相应处理。markdown
模版运算主要分为:函数
模版卷积是把模版内像素的灰度值和模版中相应的灰度值相乘,求平均值赋给当前模版窗体的中心像素。做为它的灰度值;性能
模版排序是把模版内像素的灰度值排序,取某个顺序统计量做为模版中心像素灰度值。优化
Matlab中作模版卷积十分高效,取出模版内子矩阵和模版权重点乘求平均就能够ui
咱们很是easy想到模版的中心点是边界的特殊状况。处理边界有很是多种作法:spa
忽略边界是模版直接在非边界点运动操做,直接忽略这些边界点。这么作的优势固然是效率高,比較适合图像尺寸较大或人们感兴趣部分不在图像边缘的状况;code
外插边界顾名思义就是补齐边界点做为模版中心时缺失的像素部分,可以赋予补边像素必定的灰度值并做计算。优势在于不牺牲性能的状况下,对边界进行了处理。但是补边像素的灰度值设定势必致使边界的像素点的不连贯性,严重状况下致使失真;排序
改变模版领域是指在边界处理中改变模版窗体的大小,为边界作特殊处理,如3*3
模版在处理最左上角像素点时仅仅考虑图像内点2*2
的模版运算。这样为边界特殊考虑既不失真又没有忽略不论什么像素点。但是在推断边界时势必会产生必定的开销。稍微会影响图像处理的性能(可以分状况写,在牺牲程序复杂度的状况下弥补推断带来的开销)。
不论什么的边界处理都不是完美的,都在必定程度上又一次分配了模版权重。
把模版运算运用于图像的空间域加强的技术称为空间域滤波。依据滤波频率空间域滤波分为平滑滤波(减弱和去除高频份量)和锐化滤波(减弱和去除低频份量),依据滤波计算特色又分为线性滤波和非线性滤波。
所以空间域滤波可分为:
分类 | 线性 | 非线性 |
---|---|---|
平滑 | 线性平滑 | 非线性平滑 |
锐化 | 线性锐化 | 非线性锐化 |
领域均值滤波顾名思义是就是求模版内像素点灰度的均值。是最经典的线性平滑滤波。空域滤波常用于去除加性噪声,一般把滤波算法封装的模块称做滤波器。
均值滤波的模版就是ones(n, n)
,模版内所有元素均是一,即他们的权重如出一辙。
其它常用的线性滤波还有:
先调用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
函数求均值,淡化了模版卷积的概念(后面边缘检測中会显式地作模版卷积)。
中值滤波选取模版中像素灰度值的中位数赋给模版中心像素,是经典的非线性平滑滤波。
理想状况下,中值滤波的椒盐去噪效果优于均值滤波。是因为它能有效的消除孤立阶跃脉冲噪声。后面将比較分析。
2-D中值滤波也可以选取各类各样的模版,我在这里就选取最简单的8-领域模版作演示。
相同我检測边界。作特殊处理:
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函数实现方式,若是它是一个平方量级的算法,那么咱们有如下两种优化方式,来提高中值滤波的速度:
如下是椒盐噪声的去除效果,中值滤波的效果更优:
如下是高斯噪声的去除效果,均值滤波的效果更优:
这里并无数学理论的数学分析。也没有给出样例。仅仅是从直观理解角度简要分析:
而均值滤波处理阶跃值时分配权重不会变化。那么求平均值时受阶跃值影响而产生的偏差就较大。所以效果不理想。