六、图像分割
6.3 分水岭图像分割
6.3.1分水岭算法的基本概念
分水岭算法之所以得名,是因为其的分割原理与地理学中的分水岭现象非常相似。在地理学中,分水岭是分隔相邻水系的山岭或高地,雨水会分别流向两侧的水系。
分水岭算法常用于图像的态学分割。它把图像比作一个地形图,其中每个像素的灰度值则代表该点的海拔高度。分水岭算法可以想象成是模拟水从局部最小值(低地)开始流动并汇聚成河流,最终在不同河流相遇处形成分水岭(山脊)的过程。在图像中,分水岭代表了不同像素区域之间的边界。因为分水岭算法是通过像素灰度值的连续变化来寻找图像边界的,因此它能够捕捉到图像中的微弱边缘,并生成封闭的、连续的分割结果。
6.3.2分水岭算法的基本原理
①图像预处理:通过滤波操作等对图像进行降噪处理,以减少噪声对分割结果的影响。
②梯度计算:计算图像的梯度,梯度图像中每个像素的值反映了该点灰度变化的快慢程度。它能更好地捕捉图像的边缘信息。
③模拟浸入过程:分水岭算法通过模拟浸入过程来寻找分水岭。可以想象成在模型中每个局部最小值表面刺穿一个小孔,然后将整个模型慢慢浸入水中。随着水位的上升,每个局部最小值的影响域逐渐向外扩展。当两个不同局部最小值的影响域相遇时,在这些相遇点构建分水岭,从而实现对图像的分割。
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 读取图片
img = cv2.imread('fu.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Otsu自动阈值
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 对二值图像进行一些形态学操作以去除噪声
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# 确定背景区域
sure_bg = cv2.dilate(opening, kernel, iterations=3)
# 寻找前景区域
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
_, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)
# 找到未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
# 标记标签
_, markers = cv2.connectedComponents(sure_fg)
# 为所有的标记增加一,以确保背景是0而不是1
markers = markers + 1
# 在未知区域标记0
markers[unknown == 255] = 0
# 应用分水岭
markers = cv2.watershed(img, markers)
img[markers == -1] = [255, 0, 0]
# 伪彩色处理
color_img = np.zeros((markers.shape[0], markers.shape[1], 3), dtype=np.uint8)
labels = np.unique(markers)
for label in labels:
if label == 0:
continue
color = tuple(np.random.randint(0, 255, 3).tolist())
color_img[markers == label] = color
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image with Watershed'), plt.axis('off')
plt.subplot(122), plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Pseudocolor Image'), plt.axis('off')
plt.show()
注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。
本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识
我对数字图像处理的知识点学习主要是按照学校的教学大纲来的,这一节是课程要求的最后一部分了。所以,所以之后数字图像数据处理的笔记更新可能会先告一段落。