空间滤波基础
滤波的原理:
空间滤波是采用滤波处理的图像增强的方法,理论基础是空间卷积和空间相关,目的是改善图片质量
线性空间滤波
- 移动滤波的模板w称为滤波器
- 相关 与 卷积:
相关是指模板w按下图所示的方式进行图像数组的处理。在原理上,卷积是相同的处理过程,只不过在w通过之前先将它选旋转180度
相关与卷积操作说明
需要注意的地方:
- 相关是滤波器位移的函数
- 滤波器w与一个只包含一个1其余全是0的函数相关,得到的是旋转了180度的滤波器w,将这个函数称之为离散单位冲激
结论: 一个函数与离散单位冲激相关,在该冲激位置产生这个函数的一个翻转版本
一个函数与离散单位冲激相关激卷积,得到的是在该冲激处的这个函数的拷贝,这个复制的性质称为筛选
这种定义推广到图像如下图所示
为了便于表达,以公式形式总结两种形式
- 大小为m×n的滤波模板w(x,y)与函数f(x,y)的相关
![](https://i.loli.net/2019/07/17/5d2e78e52323950837.jpg)
- 大小为m×n的滤波模板w(x,y)与函数f(x,y)的卷积
$$w(x,y)\bigstar f(x,y)=\sum_{s=-a}^{a}\sum_{t=-b}^{b}w(s,t)f(x+s,y+t)$$
Matlab的实现:
工具箱使用imfilter来实现线性空间滤波,语法如下:g = imfilter(f, w, filtering_mode, boundary_options, size_options)
默认值为相关,若想执行卷积操作,有以下两种做法:
g = imfilter(f, w, 'conv')
或者使用
rot90(w, 2)
来将w旋转180度g = imfilter(f, rot90(w, 2))
f是输入图像,w为滤波模板,g为滤波结果
其他参数如下
使用matlab实现为f = imread('filter.jpg'); F = im2double(f); imshow(F); title('current image'); w = ones(31); gd = imfilter(F, w); figure,imshow(gd, [ ]); title('Default'); gr = imfilter(F, w, 'replicate'); figure,imshow(gr, [ ]); title('replicate'); gs = imfilter(F, w, 'symmetric'); figure,imshow(gs, [ ]); title('symmetric'); gc = imfilter(F, w, 'circular'); figure,imshow(gc, [ ]); title('circular'); g = imfilter(f, w, 'replicate'); figure,imshow(g, [ ]); title('replicate unit8');
这里开始读取的filter.jpg为uint8格式,故在处理之前先使用
im2double
将其转化为double类型以提高精度
滤波结果如下
非线性空间滤波:
线性空间滤波基于计算乘积和,即线性操作,非线性空间滤波基于涉及邻域像素内的非线性操作,例如,使每个中心点的响应等于邻域内像素最大值的操作可以称为是非线性滤波操作
- Matlab工具
- nlfilter:直接执行二维操作
- coldilt:按列组织数据,更多采用
标准的 空间滤波器
线性空间滤波器
可以使用fspecial实现,生成滤波器w
w = fspecial('type', parameters)
‘type’表示滤波器的类型,’parameters’进一步定义指定的滤波器
应用参数如下:
Laplace滤波器的实现
原理:
图像f(x,y)的laplace算子:
Laplace算子增强公式:
$$g(x,y) = f(x,y)+c[\triangledown ^2 f(x,y)]$$
注意:如果模板的中心系数为正,c为1;如果为负,c为0.fspecial('laplacian', alpha)
可以实现更为一般的laplace模板
下面是用laplace滤波器增强图像的例子:
首先设置滤波器>> w = fspecial('laplacian', 0);
输入的图像为unit8类,
>> g1 = imfilter(f, w, 'replicate'); >> imshow(g1);
得到结果,但存在问题,所有像素都是正的。原因:滤波器的中心参数为负值,为了解决这一问题,可以在滤波前将f转换为浮点数
>> ff = tofloat(f); >> g2 = imfilter(ff, w, 'replicate'); >> imshow(g2);
这里tofloat为M-IPT函数,实现代码如下:
function [out,revertclass] = tofloat(inputimage) %Copy the book of Gonzales identify = @(x) x; tosingle = @im2single; table = {'uint8',tosingle,@im2uint8 'uint16',tosingle,@im2uint16 'logical',tosingle,@logical 'double',identify,identify 'single',identify,identify}; classIndex = find(strcmp(class(inputimage),table(:,1))); if isempty(classIndex) error('不支持的图像类型'); end out = table{classIndex,2}(inputimage); revertclass = table{classIndex,3};
导入workspace即可
最后用原始图像减去laplace图像来恢复失去的灰度层次(因为中心参数为负值)
>> g = ff - g2; imshow(g);
可以看到结果比原图象要清晰
非线性空间滤波器
- 函数ordfilt2计算统计排序(order-statistic filter)滤波器(也叫做rank filter,即排序滤波器)
语法为:
g = ordfilt2(f, order, domain)
用邻域集合中的第order个元素去替换f中的每个元素的值来生成图像g,domain是由0和1组成的大小为m×n的矩阵,规定了在计算中使用的邻域中像素点的位置
- 中值滤波器,最著名的统计排序滤波器,对应第50个百分位,对应奇数的m和n
g = ordfilt2(f, (m*n + 1)/2, ones(m, n));
- 这里提供了一个专门的二维中值滤波器:
g = medfilt2(f, [m, n], padopt)
padopt规定了三个可能的边缘填充选项:
- ‘zeros’,默认值
- ‘symmetric’,f按照镜像反射方式对称地沿边缘扩展
- ‘indexed’,f属于double类,用1填充;否则用0填充
中值滤波增强图像:
首先给图像添加黑白噪点发生概率为0.2的’椒盐噪声’>> fn = imnoise(f, 'salt & pepper', 0.2)
对带噪图像进行中值滤波处理
>> gm = medfilt2(fn)
注意,在这里出现了错误,==A应为二维==
原因:中值滤波medfilt2,输入的图像应为二维矩阵,实际输入的为imread读取的图像加上噪声,通常是三维RGB图,是三维矩阵
解决办法:先用rgb2gray(f)将图像转换为灰度矩阵图像>> fn2 = rgb2gray(fn); >> gm = medfilt2(fn2); >> imshow(gm);
减弱外圈黑点
>> gms = medfilt2(fn2, 'symmetric');