数字图像处理之空间域滤波和锐化(Octave实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24894159/article/details/53372346

滤波这一概念可以结合数字信号处理这一领域中的滤波。而在数字图像处理中滤波可以分为空间域滤波和频率域滤波。这篇博文主要来学习下空间域滤波。

空间域滤波机理

  *空间滤波器由一个邻域(典型的是一个较小的矩形)构成,对该邻域所包围的像素按照一定的操作计算出目标像素的值,这一过程就是空间滤波器的工作机理*

例如:
假设有一个这样的3*3的滤波器(每个元素代表权值 w )

T=111111111

用T对下图进行滤波,其覆盖的第一个方块为红色的方框,对应元素相乘后结果求和,然后再求平均值(除以9),得出圆圈的像素。(这就是后边实现的均值滤波器)

空间相关与卷积

这里只是简单提一下这两个概念。

相关:滤波器位移过图像并计算每个位置乘积之后的处理
卷积:和相关相似,只是滤波器要先旋转 180°

线性滤波器和非线性滤波器

概念:线性滤波器是指对像素进行线性操作;否则则称为非线性滤波器。

你可能问,什么是线性操作呢?线性操作简单来说就是满足下面式子的操作:

f(x+y)=f(x)+f(y)f(ax)=af(x)

均值滤波器就是一个典型的线性滤波器。
中值滤波器是一个典型的非线性滤波器。

平滑线性滤波器

平滑线性滤波器的主要作用是模糊处理和降低噪声。例如在提取图像的最大目标时,需要先进行模糊处理来降低噪声。然后增强某一阈值之上的灰度,来突出”亮”的部分。

T1=111111111T2=121242121

以上 T1 为简单的均值滤波器, T2 为带权值的均值滤波器。后者更为重要些。
说了这么多,我们来实现一个简单的均值滤波器。

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的可以去试一下带的锐化功能。

准备知识

我们学习过高等数学中的积分和微分,别方,我尽量解释的容易理解一点同时也尽量准确点(说实话,让我正确的解释积分和微分我估计也解释不清楚)。

积分我们可以简单的理解为求和

一次函数积分不就是就其与 x 轴所围面积的和吗?虽然有正负。那我们的均值滤波器可以思考下其实也是积分的原理,是离散的积分,计算出他们的乘积和,只不过最后又平均了一下。

微分我们可以简单的理解为求导

一阶微分(一阶求导):我们高中就知道函数的一阶导数显示了函数斜率。斜率决定了函数变化的快慢。
二阶微分(二阶求(偏)导):二阶求导就是在一阶的基础上继续求导。一阶导数也是一个函数的话,二阶求导可以理解为斜率变化的快慢。

通过下面这个图可以看出对于灰度激变图像,一阶和二阶的表现:
这里写图片描述
可以看出二阶对激变的时刻更加敏感。

知道来这些怎么对离散的灰度微分(求导)呢?

一阶微分:我们定义为两个像素之间的差值

fx=f(x+1)f(x)

二阶微分

2f2x=f(x+1)xf(x)x=f(x+1)+f(x1)2f(x)

下面我们就正式开始进行图像锐化

这里我们采用二阶微分进行锐化先

这里有一个概念各向同性滤波器。它就是旋转图片后滤波结果仍然相同,与图像的突变方向无关。最为简单的各向同性微分算子是拉普拉斯算子。一个二维图像函数 f(x,y) 的拉普拉斯算子定义为:

2f=2fx2+2fy2=f(x+1,y)+f(x1,y)2f(x,y)+f(x,y+1)+f(x,y1)2f(x,y)

我们可以定义为这样的模板
T3=010141010

T4=111181111

T5=010141010

T6=111181111

这样计算出一个图像的边界图像Temp,与原图像相加(相减),得到锐化的结果。(注意:边界图像中会有些部分小于0,我们要通过下面操作把他们置为0)

temp(temp<0) = 0;

最终表达式为:

g(x,y)=f(x,y)+c[2f(x,y)]

当采用上边 T3T4 模板时,c为-1,采用 T5T6 时,c=1;其中 T4T6 是包含对角变化

梯度的算子模板。
实现代码:

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、将模板加到原图。
f¯(x,y) 表示模糊图像,

非锐化掩蔽公式

gmask(x,y)=f(x,y)f¯(x,y)

然后,在原图加上模板的权重部分:
g(x,y)=f(x,y)+kgmask(x,y)

当k= 1时,称为非锐化掩蔽,
当k> 1时,称为高提升滤波。

使用一阶微分对(非线性)图像锐化——梯度

这里可以参照这位博主的博文部分,
http://blog.csdn.net/ubunfans/article/details/42214925

Good Night!

猜你喜欢

转载自blog.csdn.net/qq_24894159/article/details/53372346