空间滤波器——锐化
1 锐化原理
1.1 图像灰度微分的定义
为了描述图像的锐化,定义图像灰度的一阶微分和图像灰度的二阶微分。
图像灰度在坐标 xxx 的一阶微分:表示坐标 x 处相邻像素的灰度变化速度,其数学表达式为
∂f∂x=f(x+1)−f(x)
\frac{\partial f }{\partial x} = f(x+1)-f(x)
∂x∂f=f(x+1)−f(x)
图像灰度在坐标 xxx 的二阶微分:表示坐标 x 处相邻像素的灰度变化加速度,其数学表达式为
∂2f∂x2=f(x+1)+f(x−1)−2f(x)
\frac{\partial ^2 f}{\partial x^2} = f(x+1)+f(x-1)-2f(x)
∂x2∂2f=f(x+1)+f(x−1)−2f(x)
其中,xxx 表示坐标,f(x)f(x)f(x) 表示坐标 xxx 处的灰度值。
1.2 图像灰度的一阶微分和二阶微分
在图上取一条线段,假设线段包含10个点(坐标从x0x_0x0 到 x9x_9x9),其对应灰度值如下图所示。

以 坐标 x4x_4x4 为例,坐标 x4x_4x4 的图像灰度一阶导数表示的是坐标 x4x_4x4 处相邻像素的灰度变化速度,即
从坐标 x4x_4x4 到下一个坐标 x5x_5x5 的灰度变化值

数学表达式为
∂f∂x∣x=x4=f(x5)−f(x4)
\frac{\partial f }{\partial x} \bigg| _{x=x_4}= f(x_5)-f(x_4)
∂x∂f∣∣∣∣x=x4=f(x5)−f(x4)
依此关系计算所有点的一阶导数。需要说明的是,由于一阶导数是由当前点的灰度和当前点的下一个紧邻点的灰度计算产生的,最有一个点 x9x_9x9 没有一阶导数,因为它没有下一个紧邻点。

以 坐标 x4x_4x4 为例,坐标 x4x_4x4 的图像灰度二阶导数表示的是坐标 x4x_4x4 处相邻像素的灰度变化加速度,即图从坐标 x3x_3x3 到下一个坐标 x4x_4x4 的灰度一阶导数的变化值

数学表达式为
∂2f∂x2∣x=x4=∂f∂x∣x=x4−∂f∂x∣x=x3=[f(x5)−f(x4)]−[f(x4)−f(x3)]=f(x5)+f(x3)−2f(x4)
\begin{aligned}
\frac{\partial ^2f }{\partial x^2} \bigg| _{x=x_4}&=\frac{\partial f }{\partial x} \bigg| _{x=x_4}-\frac{\partial f }{\partial x} \bigg| _{x=x_3}\\
&=[f(x_5)-f(x_4)]-[f(x_4)-f(x_3)]\\
&= f(x_5)+f(x_3)-2 f(x_4)
\end{aligned}
∂x2∂2f∣∣∣∣x=x4=∂x∂f∣∣∣∣x=x4−∂x∂f∣∣∣∣x=x3=[f(x5)−f(x4)]−[f(x4)−f(x3)]=f(x5)+f(x3)−2f(x4)
依此关系计算所有点的二阶导数。需要说明的是,由于二阶导数是由当前点的灰度、当前点的前一个紧邻点的灰度和当前点的下一个紧邻点的灰度计算产生的,第一个点 x0x_0x0 最后一个点 x9x_9x9 都没有二阶导数,因为第一个点 x0x_0x0 没有当前点的前一个紧邻点, 最后一个点 x9x_9x9 没有下一个紧邻点。

1.3 图像灰度微分的意义
观察一阶微分和二阶微分的图像可以得出以下结论:
- 图像灰度变化时,一阶导数不为零;
- 图像灰度匀速变化的起点和终点,二阶导数不为零;
- 当灰度值开始下降的时候,二阶导数为负数,当灰度值停止下降时,二阶导数为正数。(同理:当灰度值开始上升的时候,二阶导数为正数,当灰度值停止上升时,二阶导数为负数。)
- 如果存在灰度值的平稳-上升-平稳或者平稳-下降-平稳的过程,二阶导数就一定在 xxx 轴上下两侧都存在点。
故常用灰度二阶微分确定图像边缘。
1.4 锐化
锐化的目的就是突出灰度的过度部分,即图像边缘。
为了突出图像边缘,图像边缘灰度值大的部分应该增大灰度值,令其更大,灰度值小的部分应该减小灰度值,令其更小。
应用拉普拉斯算子(二阶微分)进行图像锐化是比较常用的方法。该算法的依据是 1.3 节第 2 点和第 3 点,算法令图像所有位置的灰度值减去该位置灰度值的二阶导数。在边缘的起点和终点,小的灰度值会变得更小,大的灰度值会变得更大。在其他位置,灰度值的二阶导数为零,减法操作不会影响图像的灰度值。
1.5 拉普拉斯算子(二阶微分)
由于图像锐化所考虑的是 xxx 和 yyy 两个方向。
yyy 方向位置固定不变,考虑 xxx 方向图像灰度的二阶导数,表达式为
∂2f∂x2=f(x+1,y)+f(x−1,y)−2f(x,y)
\frac{\partial ^2 f}{\partial x^2} = f(x+1, y)+f(x-1,y)-2f(x,y)
∂x2∂2f=f(x+1,y)+f(x−1,y)−2f(x,y)
xxx 方向位置固定不变,考虑 yyy 方向图像灰度的二阶导数,表达式为
∂2f∂y2=f(x,y+1)+f(x,y−1)−2f(x,y)
\frac{\partial ^2 f}{\partial y^2} = f(x, y+1)+f(x,y-1)-2f(x,y)
∂y2∂2f=f(x,y+1)+f(x,y−1)−2f(x,y)
同时考虑 xxx 和 yyy 两个方向,图像灰度的二阶导数(也成为图像的拉普拉斯算子)表示为
∇2f=∂2f∂x2+∂2f∂y2=f(x+1,y)+f(x−1,y)−2f(x,y)+f(x,y+1)+f(x,y−1)−2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)
\begin{aligned}
\nabla ^2f&= \frac{\partial ^2 f}{\partial x^2} + \frac{\partial ^2 f}{\partial y^2}\\
&= f(x+1,y)+f(x-1,y)-2f(x,y)+ f(x,y+1)+f(x, y-1)-2f(x,y)\\
&= f(x+1,y)+f(x-1,y)+ f(x,y+1)+f(x, y-1)-4f(x,y)
\end{aligned}
∇2f=∂x2∂2f+∂y2∂2f=f(x+1,y)+f(x−1,y)−2f(x,y)+f(x,y+1)+f(x,y−1)−2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)
图像灰度变化除了在 xxx 和 yyy 两个方向发生,在角线上也会发生,故完整的各向同性的拉普拉斯算子表示为
∇2f=f(x+1,y)+f(x−1,y)−2f(x,y)+f(x,y+1)+f(x,y−1)−2f(x,y)+f(x+1,y+1)+f(x−1,y−1)−2f(x,y)+f(x−,y+1)+f(x+1,y−1)−2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)+f(x+1,y+1)+f(x−1,y−1)+f(x−,y+1)+f(x+1,y−1)−8f(x,y) \begin{aligned} \nabla ^2f &= f(x+1,y)+f(x-1,y)-2f(x,y)\\ &+ f(x,y+1)+f(x, y-1)-2f(x,y)\\ &+ f(x+1,y+1)+f(x-1,y-1)-2f(x,y)\\ &+ f(x-,y+1)+f(x+1, y-1)-2f(x,y)\\ &= f(x+1,y)+f(x-1,y)+ f(x,y+1)+f(x, y-1)\\ &+ f(x+1,y+1)+f(x-1,y-1)+ f(x-,y+1)+f(x+1, y-1)-8f(x,y) \end{aligned} ∇2f=f(x+1,y)+f(x−1,y)−2f(x,y)+f(x,y+1)+f(x,y−1)−2f(x,y)+f(x+1,y+1)+f(x−1,y−1)−2f(x,y)+f(x−,y+1)+f(x+1,y−1)−2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)+f(x+1,y+1)+f(x−1,y−1)+f(x−,y+1)+f(x+1,y−1)−8f(x,y)
2 锐化实现
由各向同性的拉普拉斯算子容易获得,各向同性的拉普拉斯滤波器

2.1 程序(C#)
private byte[] Sharpen(byte[] dat, int width, int height)
{
int[] laplaceFilter = new int[dat.Length];
byte[] result = new byte[dat.Length];
for (int row = 1; row < height - 1; row++)
{
for (int column = 1; column < width - 1; column++)
{
laplaceFilter[row * width + column] = (-8 * dat[row * width + column]
+ dat[(row + 1) * width + column]
+ dat[(row - 1) * width + column]
+ dat[row * width + (column + 1)]
+ dat[row * width + (column - 1)]
+ dat[(row - 1) * width + (column - 1)]
+ dat[(row + 1) * width + (column + 1)]
+ dat[(row - 1) * width + (column + 1)]
+ dat[(row + 1) * width + (column - 1)]);
}
}
for (int i = 0; i < laplaceFilter.Length; i++)
{
laplaceFilter[i] = (int)(dat[i] - laplaceFilter[i]);
if (laplaceFilter[i] > 255)
{
laplaceFilter[i] = 255;
}
else if (laplaceFilter[i] < 0)
{
laplaceFilter[i] = 0;
}
result[i] = (byte)laplaceFilter[i];
}
return result;
}
2.2 效果

参考文献
[1]: Rafael C. Gonzalez 数字图像处理(第三版) 电子工业出版社
本文介绍了图像锐化的原理,重点讨论了图像灰度微分的一阶和二阶导数,强调了灰度二阶导数在确定图像边缘中的作用。拉普拉斯算子作为常用的锐化方法,通过减去图像灰度值的二阶导数来增强边缘。文章还提及了拉普拉斯算子的实现,并提供了C#程序示例。
&spm=1001.2101.3001.5002&articleId=115644555&d=1&t=3&u=f913ee0cba7b4ea29e8724f49c870565)
1万+

被折叠的 条评论
为什么被折叠?



