数字图像学笔记——9. 几种常见的空间滤波器(锐化滤波)

在上一章内容中,介绍了两种比较常用,而且简单的滤波器;在这一章里,要引入一个比较复杂的滤波器——锐化滤波。要弄懂锐化滤波需要先弄懂梯度、以及拉普拉斯算子,由于我已经在其他文章里介绍过了,所以在这里我不过多赘述,需要的朋友可以点开下面的连接……

《梯度、散度与拉普拉斯算子》

首先我们要理解一个概念,如果把一张图片的灰度信息当作平面的高度信息,那么当颜色出现变动的时候,就产生了类似梯度一样的概念。所以,在物体与背景之间,由于像素值的巨大变动,往往会出现巨大的梯度差。

锐化算法的本质,就是用数学的方法,调整这个梯度差,比如让这个梯度更为陡峭,于是从视觉上会起到细节增强的作用。而这与我们之前提到的像素变换,gamma变换是不一样的技术。

锐化滤波器背后的数学知识

在这里插入图片描述
假设我们有二次函数如上表示,它在某一点的斜率可以用其导数形式进行表示,既有:

d e r ( f ( x ) ) = f ( x + △ x ) − f ( x ) △ x der(f(x)) = \frac{ f(x+\triangle x) - f(x) }{\triangle x} der(f(x))=xf(x+x)f(x)

由小学的数学概念可以得知,如果改变原函数的斜率,那么就可以使得原函数变得更为陡峭或者平缓。但是在一阶导数上进行调整,稍微有些困难,所以通常情况下我们会选择在二阶导数上进行调整。

为了验证这个理论,我们做一个简单的实验,假设原函数为 y = x 2 y=x^2 y=x2,它的图像在 x > 0 x>0 x>0侧表示为:

在这里插入图片描述
其一阶导数为 d e r ( f ( x ) ) = 2 x der(f(x)) = 2x der(f(x))=2x,绘制出来的图像是这样的:

在这里插入图片描述

其二阶导数为 d e r ( d e r ( f ( x ) ) ) = 2 der(der(f(x))) = 2 der(der(f(x)))=2

在这里插入图片描述

我们给2阶导数乘一个大于1的数,比如1.5,那么原函数就变成了 f ( x ) = 3 2 x 2 + c x f(x) = \frac{3}{2} x^2 + cx f(x)=23x2+cx,令 c = 0 c=0 c=0,那么可以得到这样一个图像

y=1.5x^2
在这里插入图片描述

y=x^2
在这里插入图片描述
可以发现原函数变得陡峭多了!

锐化空间计算公式

由于通过二阶导反推回原函数有一定难度,所以我们需要分析一下其差分形式,

▽ 2 f = ▽ f ( x + 1 ) − ▽ f ( x ) \triangledown^2f = \triangledown f(x+1) - \triangledown f(x) 2f=f(x+1)f(x)

▽ f ( x ) = f ( x + 1 ) − f ( x ) \triangledown f(x) = f(x+1) - f(x) f(x)=f(x+1)f(x)

所以,就可以得到这样一个公式

f ( x ) = f ( x + 1 ) − ▽ f ( x ) f(x) = f(x+1) - \triangledown f(x) f(x)=f(x+1)f(x)

f ( x ) = f ( x + 1 ) − ▽ f ( x ) + ▽ 2 f ( x ) f(x) = f(x + 1) - \triangledown f(x) + \triangledown^2 f(x) f(x)=f(x+1)f(x)+2f(x)

那么,锐化后或者钝化后的实际图像 g ( x ) g(x) g(x),也就是对 ▽ 2 f \triangledown^2 f 2f 的乘积 k k k 就可以简单的变成这样的形式,

g ( x ) = f ( x + 1 ) − ▽ f ( x ) + k ▽ 2 f ( x ) g(x) = f(x + 1) - \triangledown f(x) + k \triangledown^2 f(x) g(x)=f(x+1)f(x)+k2f(x)

在不考虑精确度的情况下,把中间的梯度值设为0后,就可以表示为以下表达式:

g ( x ) = f ( x ) + k ▽ 2 f ( x ) g(x) = f(x) + k \triangledown^2 f(x) g(x)=f(x)+k2f(x)

这个式子的含义,就是求解原图像的二阶导数后得到一个和原图大小一致的矩阵,然后乘以一个系数 k k k后,把修改后的值直接加回原始图像,即可以得到增强或钝化后的图形。

不过在具体实现这个算法前,我想先简单的探讨一下拉普拉斯算子的其他应用,因为这在我们其他应用中也会用到类似的技术。

拉普拉斯算子与图像边界

拉普拉斯算子,即二阶偏微分方程,根据二阶导在某些情况下所描述的数学定义,即在区间为 [ a , b ] [a, b] [a,b] 时,为其函数值为正或者负,则原函数是递增或递减,为0则表示不变的特性。

可以知道在大块色块相似的区域内,拉普拉斯算子求解出的值应该为0或接近0的数,只有在色块出现大块颜色区分的时候,拉普拉斯算子才会计算出的大于0或者小于0的数,而这正好对应到图片中物体的边界。

而为了避免 < 0 <0 <0 的情况出现,以及无法正确显示边界信息,通常会选择使用它的绝对值信息。所以,如果我们实现一个拉普拉斯算子的程序如下,经过它处理后的图片就会出现这样有趣的效果:

def laplacian_kernel(image, i, j):

    kernel = np.array([[0, 1, 0],
                        [1, -4, 1],
                        [0, 1, 0]])

	# 从原始图像中,根据ij所在位置,扣出一个3x3的小矩阵
    sub_img = image[i-1:i+2, j-1:j+2]
    result = kernel * sub_img
    return abs(np.sum(result))

def laplacian_operator(image):
    width, height = image.shape
    backup = np.zeros(image.shape, np.uint8)

    for i in range(1, width - 1):
        for j in range(1, height - 1):
            backup[i][j] = laplacian_kernel(image, i, j)

    return backup

用numpy可以很大程度简化这个过程,如果用C或者其他语言,你可能需要一位一位的去计算。
在这里插入图片描述
最终执行效果,我们如愿以偿的从原始图片中扣出了边界信息。

锐化滤波

根据我们之前得到的粗糙的锐化函数

g ( x ) = f ( x ) + k ▽ 2 f ( x ) g(x) = f(x) + k \triangledown^2 f(x) g(x)=f(x)+k2f(x)

可以知道锐化后的图像,为原始图像加上进过拉普拉斯处理后的信息乘以某个参数。所以拉普拉斯算子的代码我们可以改写成如下形式:

def laplacian_kernel(image, i, j, k):
	# laplacian matrix
    kernel = np.array([[0, 1, 0],
                       [1, -4, 1],
                       [0, 1, 0]])

    # 从原始图像中,根据ij所在位置,扣出一个3x3的小矩阵
    sub_img = image[i - 1:i + 2, j - 1:j + 2]
    result = kernel * sub_img
    result = abs(np.sum(result)) * k
    return round(result)

def laplacian_operator(image, k):
    width, height = image.shape
    backup = np.zeros(image.shape, np.uint8)

    for i in range(1, width - 1):
        for j in range(1, height - 1):
            res = laplacian_kernel_mod(image, i, j, k) + image[i][j]

            if res > 255:
                res = 255

            backup[i][j] = res

    return backup

假如这个k值,如果我们设为2.5,就能得到非常明显的锐化效果了:
在这里插入图片描述

锐化滤波改进型

锐化滤波有一个比较显著的缺点,就是会同时强化原始图像中的噪点。所以通常的一些改进形方法:

改进方法一

一、先使用中值滤波,过滤原始图像中出现的噪点得到输出的图像 g ( x , y ) g(x,y) g(x,y)
二、对 g ( x , y ) g(x,y) g(x,y) 使用拉普拉斯算子,计算它的梯度图像,得到 l a p ( x , y ) lap(x, y) lap(x,y)
三、将得到的 l a p ( x , y ) lap(x,y) lap(x,y) 用于增强原始图像 f ( x , y ) f(x,y) f(x,y)

改进方法二

你会注意到,拉普拉斯算子的计算矩阵为

[ 0 1 0 1 − 4 1 0 1 0 ] \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} 010141010

其中一种改进型,使用如下计算矩阵:

[ 1 1 1 1 − 8 1 1 1 1 ] \begin{bmatrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{bmatrix} 111181111

当然,除了这些方法外,还有其他一些改进方法,有兴趣你可以搜一下相关论文,尝试一下各种方法的效果,直到找到一种合适你使用场景的,这里我就不做过多的扩展了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值