赞
踩
为了描述图像的锐化,定义图像灰度的一阶微分和图像灰度的二阶微分。
图像灰度在坐标
x
x
x 的一阶微分:表示坐标 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)
图像灰度在坐标
x
x
x 的二阶微分:表示坐标 x 处相邻像素的灰度变化加速度,其数学表达式为
∂
2
f
∂
x
2
=
f
(
x
+
1
)
+
f
(
x
−
1
)
−
2
f
(
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)
其中,
x
x
x 表示坐标,
f
(
x
)
f(x)
f(x) 表示坐标
x
x
x 处的灰度值。
在图上取一条线段,假设线段包含10个点(坐标从
x
0
x_0
x0 到
x
9
x_9
x9),其对应灰度值如下图所示。
以 坐标
x
4
x_4
x4 为例,坐标
x
4
x_4
x4 的图像灰度一阶导数表示的是坐标
x
4
x_4
x4 处相邻像素的灰度变化速度,即
从坐标
x
4
x_4
x4 到下一个坐标
x
5
x_5
x5 的灰度变化值
数学表达式为
∂
f
∂
x
∣
x
=
x
4
=
f
(
x
5
)
−
f
(
x
4
)
\frac{\partial f }{\partial x} \bigg| _{x=x_4}= f(x_5)-f(x_4)
∂x∂f∣∣∣∣x=x4=f(x5)−f(x4)
依此关系计算所有点的一阶导数。需要说明的是,由于一阶导数是由当前点的灰度和当前点的下一个紧邻点的灰度计算产生的,最有一个点
x
9
x_9
x9 没有一阶导数,因为它没有下一个紧邻点。
以 坐标
x
4
x_4
x4 为例,坐标
x
4
x_4
x4 的图像灰度二阶导数表示的是坐标
x
4
x_4
x4 处相邻像素的灰度变化加速度,即图从坐标
x
3
x_3
x3 到下一个坐标
x
4
x_4
x4 的灰度一阶导数的变化值
数学表达式为
∂
2
f
∂
x
2
∣
x
=
x
4
=
∂
f
∂
x
∣
x
=
x
4
−
∂
f
∂
x
∣
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
)
依此关系计算所有点的二阶导数。需要说明的是,由于二阶导数是由当前点的灰度、当前点的前一个紧邻点的灰度和当前点的下一个紧邻点的灰度计算产生的,第一个点 x 0 x_0 x0 最后一个点 x 9 x_9 x9 都没有二阶导数,因为第一个点 x 0 x_0 x0 没有当前点的前一个紧邻点, 最后一个点 x 9 x_9 x9 没有下一个紧邻点。
观察一阶微分和二阶微分的图像可以得出以下结论:
锐化的目的就是突出灰度的过度部分,即图像边缘。
为了突出图像边缘,图像边缘灰度值大的部分应该增大灰度值,令其更大,灰度值小的部分应该减小灰度值,令其更小。
应用拉普拉斯算子(二阶微分)进行图像锐化是比较常用的方法。该算法的依据是 1.3 节第 2 点和第 3 点,算法令图像所有位置的灰度值减去该位置灰度值的二阶导数。在边缘的起点和终点,小的灰度值会变得更小,大的灰度值会变得更大。在其他位置,灰度值的二阶导数为零,减法操作不会影响图像的灰度值。
由于图像锐化所考虑的是
x
x
x 和
y
y
y 两个方向。
y
y
y 方向位置固定不变,考虑
x
x
x 方向图像灰度的二阶导数,表达式为
∂
2
f
∂
x
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
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)
x
x
x 方向位置固定不变,考虑
y
y
y 方向图像灰度的二阶导数,表达式为
∂
2
f
∂
y
2
=
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
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)
同时考虑
x
x
x 和
y
y
y 两个方向,图像灰度的二阶导数(也成为图像的拉普拉斯算子)表示为
∇
2
f
=
∂
2
f
∂
x
2
+
∂
2
f
∂
y
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
x
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
x
,
y
)
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
4
f
(
x
,
y
)
图像灰度变化除了在
x
x
x 和
y
y
y 两个方向发生,在角线上也会发生,故完整的各向同性的拉普拉斯算子表示为
∇
2
f
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
x
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
x
,
y
)
+
f
(
x
+
1
,
y
+
1
)
+
f
(
x
−
1
,
y
−
1
)
−
2
f
(
x
,
y
)
+
f
(
x
−
,
y
+
1
)
+
f
(
x
+
1
,
y
−
1
)
−
2
f
(
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
)
−
8
f
(
x
,
y
)
由各向同性的拉普拉斯算子容易获得,各向同性的拉普拉斯滤波器
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; }
[1]: Rafael C. Gonzalez 数字图像处理(第三版) 电子工业出版社
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。