基于区域和边缘的分割

machine learningnumpyprogramming更新于 2025/9/5 9:37:17

简介

图像分割是将数字图像划分成更小组的过程,以便更轻松地处理和分析更大的图像。区域分割和基于边缘的分割是不同类型的图像分割。

在深入探讨基于区域和边缘的分割之前,让我们先简要概述一下分割的原理。

图像分割

简单来说,分割就是为图像中的像素分配特定标签的过程。具有相同标签的像素组会成为更大图像的一个片段。

例如,下面是两幅图像及其分割图。

在第一幅图中,马的图像是一个与其周围环境分离的片段。

在第二幅图中,左侧的道路在右侧被数字分割成不同的片段,并以不同的颜色显示。

因此,此过程降低了计算和处理的复杂性,尤其是对于图像处理和人工智能算法而言,因为现在我们可以在片段级别上进行处理,而不是一次性处理整幅图像,这会非常耗费计算资源,并且会造成很大的压力。资源。

现在,我们已经学习了一些分割的基础知识,让我们继续学习基于区域和边缘的分割。

基于区域的分割

此过程涉及将图像划分为具有特定规则的较小区域。该技术采用一种算法,将图像划分为具有共同像素特征的多个部分。该过程会在图像中寻找大块的区域。小区域可以包含来自相邻像素的相似像素,随后大小会增大。该算法可以从周围像素中获取灰度级。

它们有两种类型

  • 区域增长 − 此方法通过包含具有相似特征的相邻像素来递归地增长区域。它利用灰度差异来表示灰色区域,利用纹理差异来表示纹理图像。

  • 区域分割 − 在此方法中,整幅图像被视为一个区域。现在,为了将区域划分为多个区域,它会检查初始区域中的像素是否符合预定义的标准。如果它们遵循相似的规则,则将它们归入一个片段。

基于边缘的分割

在基于边缘的分割中,图像的边界或边缘彼此之间以及与图像背景之间都存在显著差异。这一特性用于对具有不同强度级别和边缘不连续性的图像进行边缘检测。边缘包含大量有关图像的信息。该方法中的两个常见任务是边缘检测和边缘连接。在边缘检测中,边界被识别。顾名思义,边缘连接就是将一条边缘与另一条边缘连接起来。阈值化是检测轮廓的常用技术。

现在,让我们看一下边缘和区域分割的代码实现。

代码实现 - 基于边缘

示例

import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage.feature import canny
from scipy import ndimage as ndi

coins = data.coins()
h = np.histogram(coins, bins=np.arange(0, 256))
figure, (ax_1) = plt.subplots()
ax_1.imshow(coins, cmap=plt.cm.gray)

edges = canny(coins/255.)
figure, axis = plt.subplots(figsize=(6, 4))
axis.imshow(edges, cmap=plt.cm.gray)
axis.axis('off')
axis.set_title('Detect canny')

fc = ndi.binary_fill_holes(edges)
figure, axis = plt.subplots(figsize=(6, 4))
axis.imshow(fc, cmap=plt.cm.gray)
axis.axis('off')
axis.set_title('hole fill')

输出

Text(0.5, 1.0, 'hole fill')

代码实现 – 基于区域

示例

from skimage.filters import sobel
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage.feature import canny
from scipy import ndimage as ndi

coins = data.coins()
elmap = sobel(coins)
figure, axis = plt.subplots(figsize=(6, 4))
axis.imshow(elmap, cmap=plt.cm.gray)
axis.axis('off')
axis.set_title('map elevation')

输出

Text(0.5, 1.0, 'map elevation')

结论

基于区域和边缘的分割在依赖于图像和视频操作的现代算法中非常有用。这些技术简单,但功能强大。


相关文章