边缘检测(Edge detection)是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。本文使用多种不同的方法,实现对 Lena 肖像的边缘检测,研究分析各算法的效果和优缺点。所涉及的方法如下:
高通滤波法
理想高通滤波器
Butterworth 高通滤波器
指数高通滤波器
微分算子法
Roberts 算子
Sobel 算子
Laplacian 算子
Canny 算子
神经网络方法
HED 算法
高通滤波法
图像中的边缘或线条等细节部分与图像频谱的高频分量相对应,因此采用高通滤波让高频分量顺利通过,使图像的边缘或线条细节变得清楚,实现边缘提取和图像锐化。
常见的高通滤波器包括:理想高通滤波器、Butterworth 高通滤波器、指数高通滤波器等。
理想高通滤波器
理想高通滤波器的传递函数 \(H(u, v)\) 满足下式:
\[H(u,v) = \begin{cases} 1, &D(u,v)>D_0 \cr 0, &D(u,v) \leq D_0 \end{cases}
\]
理想高通滤波器只是一种理想状况下的滤波器,不能用实际的电子器件实现。
Butterworth 高通滤波器
Butterworth 高通滤波器的传递函数 \(H(u,v)\) 如下:
\[H(u,v)=\frac{1}{1+[D_0/D(u,v)]^{2n}}
\]
式中,\(n\) 为阶数,\(D_0\) 为截止频率。
Butterworth 高通滤波器在高低频率间的过渡比较平滑,所以由其得到的输出图像的振铃现象不明显。
指数高通滤波器
指数高通滤波器的传递函数 \(H(u,v)\) 如下:
\[H(u,v)=\exp\{-[\frac{D_0}{D(u,v)}]^n\}
\]
式中,变量 \(n\) 控制从原点算起的传递函数 \(H(u,v)\) 的增长率。
指数高通滤波器的另一种常用的传递函数如下式所示:
\[H(u,v)=\exp\{[\ln(\frac{1}{\sqrt 2})][\frac{D_0}{D(u,v)}]^n\}
\]
代码实现
为了在频率域中实现高通滤波,先通过傅里叶变换得到图像的频谱,根据不同滤波器的不同传递函数,对频率进行相应的过滤,最后再对其进行傅里叶反变换,得到滤波后的图像。
傅里叶变换
img = plt.imread('images/lena.bmp')
fft_shift = np.fft.fftshift(np.fft.fft2(img))# 变换后将零频分量移到频谱中心
fft_img = np.log(np.abs(fft_shift))# 可视化
实现三种滤波器
def distance(shape):# 计算每个像素到中心原点的距离
n, m = shape
u = np.arange(n)
v = np.arange(m)
u, v = np.meshgrid(u, v)
return np.sqrt((u - n//2)**2 + (v - m//2)**2)</