数据图像处理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()

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

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

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

相关推荐
m0_613856292 小时前
mysql如何利用事务隔离级别解决特定业务冲突_mysql隔离方案选型
jvm·数据库·python
AI_小站2 小时前
6个GitHub爆火的免费大模型教程,助你快速进阶AI编程
人工智能·langchain·github·知识图谱·agent·llama·rag
xindoo2 小时前
GitHub Trending霸榜!深度解析AI Coding辅助神器 Superpowers
人工智能·github
时间之里2 小时前
【深度学习】:RF-DETR与yolo对比
人工智能·深度学习·yolo
北京阿法龙科技有限公司3 小时前
数智化升级:AR 智能眼镜驱动工业运维效能革新
人工智能
风落无尘3 小时前
《智能重生:从垃圾堆到AI工程师》——第二章 概率与生存
大数据·人工智能
j_xxx404_3 小时前
Linux:静态链接与动态链接深度解析
linux·运维·服务器·c++·人工智能
收获不止数据库3 小时前
达梦9发布会归来:AI 时代,我们需要一款什么样的数据库?
数据库·人工智能·ai·语言模型·数据分析
hhb_6183 小时前
AI全栈编程生存指南
人工智能
AI-Frontiers3 小时前
transformer进阶之路:#2 工作原理详解
人工智能·深度学习·transformer