数据图像处理26

六、图像分割

6.3 分水岭图像分割

6.3.1分水岭算法的基本概念

分水岭算法之所以得名,是因为其的分割原理与地理学中的分水岭现象非常相似。在地理学中,分水岭是分隔相邻水系的山岭或高地,雨水会分别流向两侧的水系。

分水岭算法常用于图像的态学分割。它把图像比作一个地形图,其中每个像素的灰度值则代表该点的海拔高度。分水岭算法可以想象成是模拟水从局部最小值(低地)开始流动并汇聚成河流,最终在不同河流相遇处形成分水岭(山脊)的过程。在图像中,分水岭代表了不同像素区域之间的边界。因为分水岭算法是通过像素灰度值的连续变化来寻找图像边界的,因此它能够捕捉到图像中的微弱边缘,并生成封闭的、连续的分割结果。

6.3.2分水岭算法的基本原理

①图像预处理:通过滤波操作等对图像进行降噪处理,以减少噪声对分割结果的影响。

②梯度计算:计算图像的梯度,梯度图像中每个像素的值反映了该点灰度变化的快慢程度。它能更好地捕捉图像的边缘信息。

③模拟浸入过程:分水岭算法通过模拟浸入过程来寻找分水岭。可以想象成在模型中每个局部最小值表面刺穿一个小孔,然后将整个模型慢慢浸入水中。随着水位的上升,每个局部最小值的影响域逐渐向外扩展。当两个不同局部最小值的影响域相遇时,在这些相遇点构建分水岭,从而实现对图像的分割。

python 复制代码
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()

注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。

本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识

我对数字图像处理的知识点学习主要是按照学校的教学大纲来的,这一节是课程要求的最后一部分了。所以,所以之后数字图像数据处理的笔记更新可能会先告一段落。

相关推荐
百***3495几秒前
Python连接SQL SEVER数据库全流程
数据库·python·sql
2501_941111401 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
大模型实验室Lab4AI2 分钟前
【Github热门项目】DeepSeek-OCR项目上线即突破7k+星!突破10倍无损压缩,重新定义文本-视觉信息处理
人工智能·ocr·deepseek-ocr
中科米堆5 分钟前
冲压钣金件案例 | 三维扫描3d偏差检测分析解决方案-CASAIM
人工智能·3d·3d全尺寸检测
Yue丶越7 分钟前
【C语言】深入理解指针(四)
java·c语言·算法
IT_陈寒10 分钟前
React性能优化实战:我用这5个技巧将组件渲染速度提升了70%
前端·人工智能·后端
集成显卡22 分钟前
AI取名大师 | uni-app 微信小程序打包 v-bind、component 动态组件问题
人工智能·微信小程序·uni-app
Abona27 分钟前
自动驾驶、无人机、机器人核心技术双范式
算法·机器人·自动驾驶·无人机
小霖家的混江龙28 分钟前
AI 为啥能回答你的问题?大模型 5 步工作流程,看完秒懂!
人工智能·llm
磊磊落落28 分钟前
如何使用 Spec Kit 工具进行规范驱动开发?
人工智能