引言:图像分割的艺术
图像分割是计算机视觉领域的核心技术之一,它像一把解剖刀,将图像分解成具有特定意义的区域。今天我们将探索两种经典算法:区域分裂合并(Region Splitting and Merging)和区域生长(Region Growing),并用Python代码实现它们的魔法效果
一、区域分裂合并:分而治之的智慧
算法原理
分裂阶段:从整张图像开始,递归地将不符合均匀性条件的区域划分为四个象限
合并阶段:将满足合并条件的相邻子区域重新组合
终止条件:区域标准差小于阈值或尺寸达到最小单位
def div_img(img, y, x, h, w, th, th1):
if np.std(img[y:y+h, x:x+w]) > th and min(h, w) >= 10:
# 递归分裂四个象限
div_img(img, y, x, round(h/2), round(w/2), th, th1)
div_img(img, y, x+round(w/2), round(h/2), round(w/2), th, th1)
div_img(img, y+round(h/2), x, round(h/2), round(w/2), th, th1)
div_img(img, y+round(h/2), x+round(w/2), round(h/2), round(w/2), th, th1)
else:
Mer_img(img, y, x, h, w, th1) # 合并处理
def Mer_img(img, y, x, h, w, th1):
# 根据区域平均灰度决定合并为白/黑
if np.mean(img[y:y+h, x:x+w]) > th1:
img[y:y+h, x:x+w] = 255
else:
img[y:y+h, x:x+w] = 0
参数解析
th
:区域标准差阈值(控制分裂灵敏度)th1
:灰度平均值阈值(决定合并为黑/白)- 最小区域尺寸:10×10像素(防止过度分割)
效果分析
原图中的连续区域(如物体轮廓)会被划分为均匀的色块,适合处理纹理简单、边界清晰的图像。调整阈值可控制分割粒度。
二、区域生长:种子发芽的魔法
算法原理
- 播种:选择初始种子点(示例中为(148, 142))
- 生长:检查种子点邻域(8方向)
- 纳入条件:邻域点灰度与种子点差异≤阈值
- 扩散:将符合条件的点加入种子队列
dire = [(-1,-1), (0,-1), (1,-1), (1,0), (1,1), (0,1), (-1,1), (-1,0)] # 8邻域 seeds = [(148, 142)] # 初始种子 img_v = np.zeros(img.shape) # 创建空白分割图 while seeds: seed = seeds.pop(0) value = int(img[seed[1], seed[0]]) img_v[seed[1], seed[0]] = 1 # 标记已访问 # 遍历8个邻域方向 for dx, dy in dire: nx, ny = seed[0] + dx, seed[1] + dy # 边界检查 if 0 <= nx < img.shape[1] and 0 <= ny < img.shape[0]: # 灰度差检查 & 未访问检查 if abs(int(img[ny, nx]) - value) <= threshold and img_v[ny, nx] == 0: img_v[ny, nx] = 1 seeds.append((nx, ny)) # 新种子入队
关键参数
- 种子选择:直接影响生长结果(示例中为(148,142))
- 生长阈值:控制区域包容性(示例threshold=10)
- 邻域定义:8邻域比4邻域更易穿透狭窄区域
效果分析
区域生长算法能精确提取与种子点特征相似的连通区域,特别适合医学图像中特定组织的分割。
三、双剑合璧:方法对比与应用场景
特性 | 区域分裂合并 | 区域生长 |
---|---|---|
初始化 | 无需人工干预 | 需要选择种子点 |
计算复杂度 | 较高(递归操作) | 较低(队列遍历) |
适用图像 | 多目标、纹理简单 | 单目标、特征明显 |
优势 | 全自动分割 | 精确控制目标区域 |
劣势 | 可能产生方块效应 | 依赖种子点位置 |
典型应用 | 卫星图像分割、工业零件检测 | 肿瘤检测、细胞分析 |
四、结语:探索永无止境
通过这两种算法,我们见证了计算机如何理解图像的内在结构。区域分裂合并像一位严谨的架构师,而区域生长则像耐心的园丁。在实际应用中,常将它们与其他方法(如边缘检测)结合使用。
# 完整代码获取
# 访问https://github.com/tangchao37/DIP.git