简介:本文围绕计算机视觉图像分割展开,系统解析阈值分割、区域生长与分水岭算法的原理、实现及适用场景,帮助开发者快速掌握基础分割技术,为复杂任务提供理论支撑与实践指导。
计算机视觉的核心任务之一是将图像划分为具有语义意义的区域,这一过程称为图像分割。作为计算机视觉的基础技术,图像分割广泛应用于医学影像分析、自动驾驶、工业质检等领域。本文聚焦三种经典入门算法——阈值分割、区域生长与分水岭算法,从原理到实现逐步展开,帮助开发者建立系统认知。
阈值分割是最直观的分割方法,其核心思想是通过设定一个或多个阈值,将图像像素分为前景(目标)和背景两类。数学表达为:
[
I{\text{segmented}}(x,y) =
\begin{cases}
1 & \text{if } I(x,y) > T \
0 & \text{otherwise}
\end{cases}
]
其中,(I(x,y))为原始图像像素值,(T)为阈值,(I{\text{segmented}})为分割结果(1表示前景,0表示背景)。
全局阈值法:适用于光照均匀的图像,常用方法包括:
img = cv2.imread(‘image.jpg’, 0)
_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
```
区域生长从种子点出发,逐步合并与种子点相似的邻域像素,形成连通区域。步骤如下:
import cv2import numpy as npdef region_growing(img, seed, threshold):regions = []height, width = img.shapevisited = np.zeros((height, width), dtype=np.bool_)stack = [seed]visited[seed[0], seed[1]] = Truewhile stack:x, y = stack.pop()regions.append((x, y))for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]: # 4邻域nx, ny = x + dx, y + dyif 0 <= nx < height and 0 <= ny < width:if not visited[nx, ny] and abs(img[nx, ny] - img[x, y]) < threshold:visited[nx, ny] = Truestack.append((nx, ny))return regions# 示例调用img = cv2.imread('image.jpg', 0)seed = (100, 100) # 手动选择种子点regions = region_growing(img, seed, 10)
分水岭算法将图像视为地形图,像素强度对应高度。算法模拟浸水过程:
应用分水岭:
import cv2import numpy as np# 读取图像并转为灰度图img = cv2.imread('image.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 梯度计算grad = cv2.morphologyEx(gray, cv2.MORPH_GRADIENT, np.ones((3,3), np.uint8))# 标记背景(通过阈值或膨胀)_, thresh = cv2.threshold(grad, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)kernel = np.ones((3,3), np.uint8)sure_bg = cv2.dilate(thresh, kernel, iterations=3)# 标记前景(通过距离变换)dist = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)_, sure_fg = cv2.threshold(dist, 0.5*dist.max(), 255, 0)# 未知区域sure_fg = np.uint8(sure_fg)unknown = cv2.subtract(sure_bg, sure_fg)# 生成标记_, markers = cv2.connectedComponents(sure_fg)markers = markers + 1markers[unknown == 255] = 0# 应用分水岭markers = cv2.watershed(img, markers)img[markers == -1] = [255, 0, 0] # 边界标记为红色
| 算法 | 计算复杂度 | 适用场景 | 典型问题 |
|---|---|---|---|
| 阈值分割 | 低 | 简单背景、光照均匀 | 无法处理复杂纹理 |
| 区域生长 | 中 | 小目标、纹理一致区域 | 种子点敏感 |
| 分水岭算法 | 高 | 重叠目标、复杂背景 | 过度分割 |
选择建议:
本文系统解析了阈值分割、区域生长与分水岭算法的原理与实现,开发者可根据任务需求选择合适方法。未来,随着深度学习的发展,基于CNN的语义分割(如U-Net)逐渐成为主流,但传统方法在计算资源受限或简单场景中仍具有实用价值。建议读者从经典算法入手,逐步过渡到深度学习框架,构建完整的计算机视觉知识体系。