计算机视觉 - 图像分割



什么是图像分割?

图像分割是将图像分割成多个片段的过程,以使图像更容易分析。每个片段或区域通常对应于不同的物体或物体的一部分。

通过分割图像,我们可以专注于特定区域,从而更容易识别和分析图像中的物体。

图像分割的重要性

图像分割对于计算机视觉中的各种应用非常重要,例如:

  • 目标检测:识别和定位图像中的物体。
  • 医学影像:分析医学影像以检测和诊断疾病。
  • 自动驾驶:通过识别道路、车辆、行人等来理解周围环境。
  • 图像编辑:选择和操作图像的特定部分。

图像分割类型

图像分割有多种类型,它们是:

  • 阈值分割
  • 基于边缘的分割
  • 基于区域的分割
  • 基于聚类的分割
  • 基于深度学习的分割

阈值分割

阈值分割是最简单的分割技术之一。它通过设置阈值将灰度图像转换为二值图像。

强度值高于阈值的像素被分配一个值(例如,白色),而低于阈值的像素被分配另一个值(例如,黑色)。

我们可以使用以下方法应用阈值分割:

  • 全局阈值:对整幅图像使用单个阈值。
  • import cv2
    
    # Load image in grayscale
    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)

基于区域的分割

基于区域的分割根据预定义的标准(例如强度值或纹理)将像素分组到区域中。其思想是将具有相似属性的相邻像素分组到同一区域。

常见的基于区域的方法如下所示:

  • 区域生长:从种子点开始,通过添加满足某些条件的相邻像素来增长区域。
  • 分水岭算法:将图像视为地形表面,并找到分水岭线来分割区域。

以下是如何应用基于区域的分割的示例:

# Apply Watershed Algorithm
import numpy as np

# Convert image to binary
_, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# Perform distance transform
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)
# Marker labeling
_, markers = cv2.connectedComponents(foreground)
markers = markers + 1
markers[unknown == 255] = 0
# Apply watershed
markers = cv2.watershed(image, markers)
image[markers == -1] = [255, 0, 0]

基于聚类的分割

基于聚类的分割根据像素的相似性将像素分组到聚类中。K均值聚类是此类分割的常用方法。

以下是如何应用 K 均值聚类的示例:

import numpy as np

# Convert image to float32
image = np.float32(image)
# Define criteria and apply 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)
# Convert back to uint8 and reshape the image
centers = np.uint8(centers)
segmented_image = centers[labels.flatten()]
segmented_image = segmented_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])
广告

© . All rights reserved.