滤波这一概念可以结合数字信号处理这一领域中的滤波。而在数字图像处理中滤波可以分为空间域滤波和频率域滤波。这篇博文主要来学习下空间域滤波。
空间域滤波机理
*空间滤波器由一个邻域(典型的是一个较小的矩形)构成,对该邻域所包围的像素按照一定的操作计算出目标像素的值,这一过程就是空间滤波器的工作机理*
例如:
假设有一个这样的3*3的滤波器(每个元素代表权值
用T对下图进行滤波,其覆盖的第一个方块为红色的方框,对应元素相乘后结果求和,然后再求平均值(除以9),得出圆圈的像素。(这就是后边实现的均值滤波器)
空间相关与卷积
这里只是简单提一下这两个概念。
相关:滤波器位移过图像并计算每个位置乘积之后的处理
卷积:和相关相似,只是滤波器要先旋转
线性滤波器和非线性滤波器
概念:线性滤波器是指对像素进行线性操作;否则则称为非线性滤波器。
你可能问,什么是线性操作呢?线性操作简单来说就是满足下面式子的操作:
均值滤波器就是一个典型的线性滤波器。
中值滤波器是一个典型的非线性滤波器。
平滑线性滤波器
平滑线性滤波器的主要作用是模糊处理和降低噪声。例如在提取图像的最大目标时,需要先进行模糊处理来降低噪声。然后增强某一阈值之上的灰度,来突出”亮”的部分。
以上
说了这么多,我们来实现一个简单的均值滤波器。
function [Image] = fliter (img, type)
%初始化滤波器模板
f = ones(3,3);
[x,y] = size(img);
Image = zeros(x,y);
%注意由于我们是3*3的滤波器,对第一个像素img(1,1)滤波时,滤波器会有
%一部分在图像外部,所以我们要初始一个带着一圈0的壳的图像
temp = zeros(x+2,y+2);
%把中间的部分赋值原来的数值
temp(2:x+1,2:y+1) = img;
for i=2:x+1
for j=2:y+1
%计算均值
Image(i-1,j-1) = mean(mean(f.*temp(i-1:i+1,j-1:j+1))');
end;
end;
endfunction
统计排序(非线性)滤波器
由名字可知,这是基于数理统计的一种滤波器,采用的是非线性的计算。
中值滤波器
他是将邻域中的灰度值排序,然后取中值作为替换中心元素的灰度值。例如:3*3的中值滤波器,取排序后的第5个元素。
实现代码:
function [Image] = medianFliter (img)
[x,y] = size(img);
Image = zeros(x,y);
temp = zeros(x+2,y+2);
%同上面均值滤波的作用
temp(2:x+1,2:y+1) = img;
for i=1:x
for j=1:y
t = temp(i:i+2,j:j+2);
%median为求中值函数,需要将t转化为一个列向量
Image(i,j) = median(t(:));
end;
end;
endfunction
在原图中增加了椒盐噪声,可以看到,中值滤波后椒盐噪声基本被去除。
锐化空间滤波器
锐化:即增强图像中的边缘部分。边缘部分一般为灰度激变的部分。有photoshop的可以去试一下带的锐化功能。
准备知识
我们学习过高等数学中的积分和微分,别方,我尽量解释的容易理解一点同时也尽量准确点(说实话,让我正确的解释积分和微分我估计也解释不清楚)。
积分我们可以简单的理解为求和
一次函数积分不就是就其与
微分我们可以简单的理解为求导
一阶微分(一阶求导):我们高中就知道函数的一阶导数显示了函数斜率。斜率决定了函数变化的快慢。
二阶微分(二阶求(偏)导):二阶求导就是在一阶的基础上继续求导。一阶导数也是一个函数的话,二阶求导可以理解为斜率变化的快慢。
通过下面这个图可以看出对于灰度激变图像,一阶和二阶的表现:
可以看出二阶对激变的时刻更加敏感。
知道来这些怎么对离散的灰度微分(求导)呢?
一阶微分:我们定义为两个像素之间的差值
二阶微分
下面我们就正式开始进行图像锐化
这里我们采用二阶微分进行锐化先
这里有一个概念各向同性滤波器。它就是旋转图片后滤波结果仍然相同,与图像的突变方向无关。最为简单的各向同性微分算子是拉普拉斯算子。一个二维图像函数
我们可以定义为这样的模板
这样计算出一个图像的边界图像Temp,与原图像相加(相减),得到锐化的结果。(注意:边界图像中会有些部分小于0,我们要通过下面操作把他们置为0)
temp(temp<0) = 0;
最终表达式为:
当采用上边
梯度的算子模板。
实现代码:
function [Image] = sharpen (img)
[x,y] = size(img);
Image = zeros(x,y);
temp = zeros(x+2,y+2);
temp(2:x+1,2:y+1) = img;
%这里我没有采用算子模板进行计算
for i=1:x
for j=1:y
t = temp(i,j+1)+temp(i+2,j+1)+temp(i+1,j)+temp(i+1,j+2)-4*temp(i+1,j+1);
Image(i,j) = t;
end;
end;
Image(Image<0)=0;
figure;
imshow(uint8(Image));
Image = img.-Image;
endfunction
下面这张 c 错选为+号
非锐化掩蔽和高提升滤波
步骤:
1、模糊化原图。
2、原图减去模糊图像(差值称为模板)。
3、将模板加到原图。
令
非锐化掩蔽公式
然后,在原图加上模板的权重部分:
当k= 1时,称为非锐化掩蔽,
当k> 1时,称为高提升滤波。
使用一阶微分对(非线性)图像锐化——梯度
这里可以参照这位博主的博文部分,
http://blog.csdn.net/ubunfans/article/details/42214925
Good Night!