Mahotas 简明教程

Mahotas - 2D Laplacian Filter

拉普拉斯滤波器用于检测图像中边缘和强度变化。从数学上讲,拉普拉斯滤波器定义为图像在 x 和 y 方向的二阶导数之和。

二阶导数提供有关每个像素强度变化率的信息。

拉普拉斯滤波器强调图像中强度快速变化的区域,例如边缘和角点。它的工作原理是从中心像素中减去周围像素的平均值,从而得出强度二阶导数的度量。

在 2D 中,拉普拉斯滤波器通常由方阵表示,通常为 3×3 或 5×5。以下是 3×3 拉普拉斯滤波器的一个示例:

0  1  0
1 -4  1
0  1  0

2D Laplacian Filter in Mahotas

若要在 mahotas 中应用二维拉普拉斯滤波器,可以使用 mahotas.laplacian_2D() 函数。以下是 Mahotas 中二维拉普拉斯滤波器的工作原理概述:

Input Image

  1. 滤波器采用灰度输入图像。

Convolution

  1. 拉普拉斯滤波器使用卷积核对输入图像应用卷积操作。该卷积核确定了卷积过程中应用于相邻像素的权重。

  2. 卷积操作包括在整个图像上滑动卷积核。在每个像素位置,拉普拉斯滤波器将相应的卷积核权重与邻域中的像素值相乘并计算总和。

Laplacian Response

  1. 通过对图像应用拉普拉斯算子获得拉普拉斯响应。它表示图像中的强度变化或不连续性,这些强度变化或不连续性与边缘相关。

The mahotas.laplacian_2D() function

mahotas.laplacian_2D() 函数以灰度图像作为输入,并对其执行 2D 拉普拉斯运算。生成图像高亮显示快速强度变化的区域,例如边缘。

以下是 mahotas 中 laplacian_2D() 函数的基本语法 −

mahotas.laplacian_2D(array, alpha=0.2)

其中,

  1. array − 这是输入图像。

  2. alpha (optional) − 这是 0 和 1 之间的标量值,用于控制拉普拉斯算子的形状。较大的 alpha 值会增加拉普拉斯算子对边缘的敏感度。默认值为 0.2。

以下是使用 laplacian_2D() 函数检测图像中的边缘的基本示例 −

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
image = mh.imread('picture.jpg', as_grey = True)
# Applying a laplacian filter
filtered_image = mh.laplacian_2D(image)
# Displaying the original image
fig, axes = mtplt.subplots(1, 2, figsize=(9, 4))
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].axis('off')
# Displaying the laplacian filtered featured image
axes[1].imshow(filtered_image, cmap='gray')
axes[1].set_title('Laplacian Filtered')
axes[1].axis('off')
mtplt.show()

执行上面的代码后,我们得到以下输出: -

2D laplacian filter

Scaling the Laplacian Response

通过改变 alpha 参数,我们可以控制拉普拉斯响应的尺度。较小的 alpha 值(例如 0.2)会产生相对微妙的响应,突出显示更精细的细节和边缘。

另一方面,较大的 alpha 值(例如 0.8)会放大响应,使其更加明显,并强调更突出的边缘和结构。

因此,我们可以在拉普拉斯算子中使用不同的 alpha 值来反映边缘检测的变化。

Example

在此处,我们正在拉普拉斯算子中使用不同的 alpha 值来反映边缘检测的变化 −

import mahotas as mh
import matplotlib.pyplot as plt
# Load an example image
image = mh.imread('pic.jpg', as_grey=True)
# Apply the Laplacian filter with different alpha values
filtered_image_1 = mh.laplacian_2D(image, alpha=0)
filtered_image_2 = mh.laplacian_2D(image, alpha=0.5)
filtered_image_3 = mh.laplacian_2D(image, alpha=1)
# Display the original and filtered images with different scales
fig, axes = plt.subplots(1, 4, figsize=(12, 3))
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].axis('off')
axes[1].imshow(filtered_image_1, cmap='gray')
axes[1].set_title('Filtered Image (alpha=0)')
axes[1].axis('off')
axes[2].imshow(filtered_image_2, cmap='gray')
axes[2].set_title('Filtered Image (alpha=0.5)')
axes[2].axis('off')
axes[3].imshow(filtered_image_3, cmap='gray')
axes[3].set_title('Filtered Image (alpha=1)')
axes[3].axis('off')
plt.show()

Followng 是上述代码的输出 −

2D laplacian filter1

Using Randomly Generated Array

我们还可以对随机生成的数组应用拉普拉斯算子。要实现此目的,我们首先需要创建一个随机的 2D 数组。我们可以使用 NumPy 库的 np.random.rand() 函数创建数组。

此函数生成 0 和 1 之间的值,表示数组的像素强度。

接下来,我们把随机生成的数组传递给 mahotas.laplacian_2D() 函数。此函数将拉普拉斯算子应用于输入数组并返回经过滤的数组。

Example

现在,我们尝试对随机生成的数组应用拉普拉斯算子 −

import mahotas as mh
import numpy as np
import matplotlib.pyplot as plt
# Generate a random 2D array
array = np.random.rand(100, 100)
# Apply the Laplacian filter
filtered_array = mh.laplacian_2D(array)
# Display the original and filtered arrays
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(array, cmap='gray')
plt.title('Original Array')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(filtered_array, cmap='gray')
plt.title('Filtered Array')
plt.axis('off')
plt.show()

上述代码的输出如下:

randomly generated array