1、线性空间滤波
相关:
卷积(w旋转180°):
工具箱使用 imfilter 来实现线性空间滤波
g = imfilter(f, w, filtering_mode, boundary_options, size_options)
滤波模式: 'corr' ,相关,默认值;'conv',卷积。
边界选项:
P,使用P值来填充扩展,默认选项,值为0;
'replicate',图像的大小通过复制图像边界外的值来扩展;
'symmetric',图像的大小通过边界镜像反射来扩展;
'circular',图像的大小通过将图像处理为二维周期函数的一个周期来扩展;
大小选项::
'full',输出与填充后的图像大小相同;
'same',输出图像的大小与输入图像的大小相同。
w = ones(31); %31 x 31的滤波器
f8 = im2uint8(f);
g8 = imfilter(f8, w, 'replicate');
imshow(g8, [])
2、非线性空间滤波
实现非线性空间滤波时,常用 colfilt 函数
g = colfilt(f, [m n], 'sliding', fun)
使用 colfilt 时,滤波前需要显示的填充输入图像,使用二维函数 padarray 可以实现
fp = padarray(f, [r c], method, direction)
[r c]: 表示填充 f 的行和列数
method: symmetric, repliacte, circular
direction: pre, post, both(默认值)
f = [1 2; 3 4]
fp = padarray(f, [1 1], 'replicate', 'both')
%几何平均滤波
gmean = @(A) prod(A, 1)^(1/size(A, 1));
f = padarray(f, [m n], 'replicate');
g = colfit(f, [m n], 'sliding', @gmean)
[M N] = size(f);
g = g((1:M) + m, (1:N) + n);
3、标准线性空间滤波器
工具箱中预定义了一些二维线性空间滤波器,可以通过函数 fspecial 生成
w = fspecial('type', parameters)
'average': 矩形平均滤波器
fspecial('average', [r c])
'disk': 圆形平均滤波器
fspecial('disk', r)
'gaussian': 高斯低通滤波器
fspecial('gaussian', [r c], sig)
'laplacian': 拉普拉斯滤波器
fspecial('laplacian', alpha)
'log': 高斯拉普拉斯滤波器
fspecial('log', [r c], sig)
'motion' 近似计算 len 个像素的线性运动
fspecial('motion', len, theta)
'prewitt:' prewitt 滤波器,近似计算垂直梯度
fspecial('prewitt')
'sobel': sobel滤波器,近似计算垂直梯度
fspecial('sobel')
'unsharp': 非尖锐滤波器
fspecial('unsharp', alpha)
<拉普拉斯算子>
近似为
空间模板
w = fspecial('laplacian', 0)
% 0 1 0
% 1 -4 1
% 0 1 0
拉普拉斯滤波器实现如下
w = fspecial('laplacian', 0)
f2 = tofloat(f);
g1 = imfilter(f2, w, 'replicate');
g = f2 - g1;
4、标准非线性空间滤波器
- 排序滤波器
g = ordfilt2(f, order, domain)
order:排序中的第 order 个元素代替 f 中的每个元素
domain: 一个由 0 和 1 组成的大小为 m x n 的矩阵,计算时,不使用对应为 0 的像素。
%最小滤波器
g = ordfilt2(f, 1, ones(m, n))
%最大滤波器
g = ordfilt2(f, m*n, ones(m, n))
%中值滤波器
g = ordfilt2(f, (m*n + 1)/2, ones(m, n))
工具箱中提供了一个专门的二维终止滤波器函数 medfilt2
g = medfilt2(f, [m n], padopt)
padopt: 指定边界填充选项
'zeros:'零填充,(默认值)
'symmetric': 镜像方式
'indexed':若 f 是 double 类的则用 1 填充,否则用 0 填充
fn = imnoise(f, 'salt & pepper', 0.2);
gm = medfilt2(fn, 'symmetric');