计算机视觉 - 图像分割
什么是图像分割?
图像分割是将图像分割成多个片段的过程,以使图像更易于分析。每个片段或区域通常对应不同的对象或对象的一部分。
通过分割图像,我们可以专注于特定区域,从而更容易识别和分析图像中的对象。
图像分割的重要性
图像分割对于计算机视觉中的各种应用都很重要,例如−
- 物体检测:识别和定位图像中的物体。
- 医学成像:分析医学图像以检测和诊断疾病。
- 自动驾驶:通过识别道路、车辆、行人等了解周围环境。
- 图像编辑:选择和操作图像的特定部分。
图像类型分割
图像分割有几种类型,它们是 −
- 阈值化
- 基于边缘的分割
- 基于区域的分割
- 基于聚类的分割
- 基于深度学习的分割
阈值化
阈值化是最简单的分割技术之一。它通过设置阈值将灰度图像转换为二值图像。
强度值高于阈值的像素被分配一个值(例如白色),低于阈值的像素被分配另一个值(例如黑色)。
我们可以使用以下方式应用阈值 −
- 全局阈值:对整个图像使用单个阈值。
import cv2
# 以灰度加载图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
adaptive_binary_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
基于边缘的分割
基于边缘的分割检测图像中的边缘并使用它们来定义片段的边界。此方法依赖于检测强度值的显著变化。
常用的边缘检测方法是Canny 边缘检测器。它是一种多阶段算法,可检测各种边缘。
edges = cv2.Canny(image, 100, 200)
基于区域的分割
基于区域的分割根据预定义的标准(例如强度值或纹理)将像素分组到区域中。这个想法是将具有相似属性的相邻像素分组到同一区域中。
常见的基于区域的方法如下所示 −
- 区域增长:从种子点开始,通过添加符合特定条件的相邻像素来增长区域。
- 分水岭算法:将图像视为地形表面,并找到分水岭线来分割区域。
以下是如何应用基于区域的分割的示例 −
# 应用分水岭算法 import numpy as np # 将图像转换为二进制 _, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 执行距离变换 distance_transform = cv2.distanceTransform(binary_image, cv2.DIST_L2, 5) _, foreground = cv2.threshold(distance_transform, 0.7 * distance_transform.max(), 255, 0) foreground = np.uint8(foreground) unknown = cv2.subtract(binary_image, foreground) # 标记标记 _, markers = cv2.connectedComponents(foreground) markers = markers + 1 markers[unknown == 255] = 0 # 应用分水岭 markers = cv2.watershed(image, markers) image[markers == -1] = [255, 0, 0]
基于聚类分割
基于聚类的分割根据像素的相似性将像素分组为簇。K 均值聚类是此类分割的常用方法。
以下是如何应用 K 均值聚类的示例 −
import numpy as np # 将图像转换为 float32 image = np.float32(image) # 定义标准并应用 K-means criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) _, labels, centers = cv2.kmeans(image, 3, None,criteria, 10, cv2.KMEANS_RANDOM_CENTERS) # 转换回 uint8 并重塑图像 centers = np.uint8(centers) segmented_image = centers[labels.flatten()] segmented_image = divided_image.reshape((image.shape))
基于深度学习的分割
基于深度学习的分割使用卷积神经网络 (CNN) 来分割图像。这种方法非常准确,可以处理复杂的图像。
以下是常见的深度学习模型 −
- 全卷积网络 (FCN):用卷积层替换全连接层以生成分割图。
- U-Net:一种使用编码器-解码器架构的流行生物医学图像分割模型。
以下是如何应用基于深度学习的分割的示例 −
from keras.models import Model from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate inputs = Input((image_height, image_width, 1)) conv1 = Conv2D(64, 3, activation='relu', padding='same')(inputs) pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) conv2 = Conv2D(128, 3, activation='relu', padding='same')(pool1) up1 = concatenate([UpSampling2D(size=(2, 2))(conv2), conv1], axis=3) conv3 = Conv2D(64, 3, activation='relu', padding='same')(up1) outputs = Conv2D(1, 1, activation='sigmoid')(conv3) model = Model(inputs=[inputs], outputs=[outputs])

