区域和边缘的分割
介绍
图像分割是将数字图像划分为更小的组,以便处理和分析更大图像变得更加容易和简单的过程。区域和边缘分割是不同类型的图像分割。
在深入研究区域和边缘分割之前,让我们简要了解一下分割的过程。
图像分割
简单来说,分割是将图像中的像素分配特定的标签的过程。具有相同标签的一组像素成为较大图像的一个分割。
例如,下面是两个图像及其分割。
在第一张图中,马的图片是一个单独的部分与周围分开。
在第二张图中,左边的道路在右边被数字化地分割成不同的部分,并以不同的颜色显示出来。
因此,这个过程减少了计算和处理的复杂性,尤其是对于图像处理和人工智能算法来说,因为现在我们可以在段落级别进行处理,而不是一次性处理整个图像,这样可以减少计算量,也可以减轻资源的压力。
现在,我们已经了解了一些分割的基础知识,让我们继续学习基于区域和边缘的分割。
基于区域的分割
这个过程涉及将图像分割成较小的部分,这些部分具有一定的规则。此技术使用一种算法将图像分割为具有相同像素特征的几个组件。该过程查找图像中的段落块。小的片段可以包括相邻像素的相似像素,并随后增长。算法可以从周围像素中提取灰度级。
它们有两种类型
- 区域增长 - 该方法通过包括具有相似特征的邻近像素来递归地增长分段。对于灰色区域使用灰度级别的差异,并对纹理图像使用纹理的差异。
- 区域分割 - 在该方法中,整个图像被视为单个区域。现在为了将区域分割成段,它会检查初始区域中包含的像素是否遵循预定义的一组标准。如果它们遵循相似的规则,它们将被放入一个段中。
基于边缘的分割
在基于边缘的分割中,图像的边界或边缘与彼此及图像的背景显著不同。这一事实被用于对具有不同强度和边缘不连续性的图像进行边缘检测。边缘对图像具有相当丰富的信息。这种方法中常见的两个任务是边缘检测和边缘连接。在边缘检测中,边界被识别出来。而边缘连接则是连接一个边缘与另一个边缘。检测轮廓的常见技术之一是阈值处理。
现在,让我们来看一下边缘和区域分割的代码实现。
代码实现 – 基于边缘
示例
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')
结论
区域和边缘基于分割是现代算法中的有用方法,这些算法依赖于基于图像和视频的操作。这些是简单但非常强大的技术。