Python Pillow - 边缘检测



边缘检测是使用数学算法识别图像中这些边界或轮廓的过程。边缘检测旨在定位图像中强度突然变化的点,这通常对应于两个区域之间的边缘或边界。一般来说,边缘定义为图像中两个不同区域之间的边界或轮廓。这些区域在强度、颜色、纹理或任何其他视觉特征方面可能有所不同。边缘可以表示图像中的重要特征,例如物体边界、形状和纹理。

边缘检测是许多图像处理应用程序中的一个重要步骤,例如目标识别、分割、跟踪和增强。在本教程中,我们将学习使用 Python Pillow 库检测图像边缘的不同方法。

将边缘检测滤镜应用于图像

可以使用ImageFilter.FIND_EDGES滤镜检测图像中的边缘,这是 Pillow 库当前版本中用于检测图像边缘的内置滤镜选项之一。

以下是检测图像边缘的步骤:

  • 使用 Image.open() 函数加载输入图像。

  • 将 filter() 函数应用于加载的 Image 对象,并将 ImageFilter.FIND_EDGES 作为参数提供给该函数。该函数将返回检测到的边缘作为 PIL.Image.Image 对象。

示例

以下示例演示如何使用ImageFilter.FIND_EDGES滤镜内核和 filter() 方法来检测图像中的边缘。

from PIL import Image, ImageFilter

# Open the image
image = Image.open('Images/compass.jpg')

# Apply edge detection filter
edges = image.filter(ImageFilter.FIND_EDGES)

# Display the original image
image.show()

# Display the edges-detected image
edges.show()

输入图像

compass

输出图像

检测到的边缘:

imagefilter find edges

示例

这是一个使用 ImageFilter.FIND_EDGES 滤镜内核检测图像边缘的示例。然后,它应用 ImageFilter.MaxFilter() 类来平滑检测到的边缘。

import matplotlib.pyplot as plt
from PIL import Image, ImageFilter

# Open the image and convert it to grayscale
im = Image.open('Images/compass.jpg').convert('L')

# Detect edges
edges = im.filter(ImageFilter.FIND_EDGES)

# Make fatter edges
fatEdges = edges.filter(ImageFilter.MaxFilter)

# Make very fat edges
veryFatEdges = edges.filter(ImageFilter.MaxFilter(7))

# Create subplots for displaying the images
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
ax = axes.ravel()

# Original image
ax[0].imshow(im, cmap='gray')
ax[0].set_title('Original')

# Detected edges
ax[1].imshow(edges, cmap='gray')
ax[1].set_title('Edges')

# Fatter edges
ax[2].imshow(fatEdges, cmap='gray')
ax[2].set_title('Fatter Edges')

# Very fat edges
ax[3].imshow(veryFatEdges, cmap='gray')
ax[3].set_title('Very Fat Edges')

for ax in axes.flatten():
   ax.axis('off')

# Display the images
plt.tight_layout()
plt.show()

输出图像

imagefilter maxfilter

使用 ImageFilter.Kernel() 类检测边缘

此类用于创建卷积内核。

在这种方法中,我们将定义一个具有某些指定内核值 (-1, -1, -1, -1, 8, -1, -1, -1, -1) 的 3X3 卷积内核。我们将对图像执行边缘检测。

示例

以下示例演示如何使用卷积矩阵和 ImageFilter.kernel() 类对图像执行边缘检测。

from PIL import Image, ImageFilter

# Open the image and convert it to grayscale
image = Image.open('Images/compass.jpg').convert('L')

# Calculate edges using a convolution matrix
kernel = ImageFilter.Kernel((3, 3), (-1, -1, -1, -1, 8, -1, -1, -1, -1), scale=1, offset=0)
edges = image.filter(kernel)

# Display the original image
image.show()

# Display the edges
edges.show()

输入图像

image_convertto grayscale

输出图像

检测到的边缘:

detected edges
广告