首页 > 编程语言 >分水岭算法简介

分水岭算法简介

时间:2024-08-31 14:52:29浏览次数:7  
标签:plt 简介 cv2 算法 区域 图像 font 分水岭 sure

分水岭算法是一种经典的图像分割技术,广泛应用于图像处理领域。它的名称源自地理学中的“分水岭”概念,即在地形中,水从高处流向低处,最终汇聚成河流的过程。在图像分割中,分水岭算法将灰度图像视为地形,将像素值看作海拔高度。该算法模拟水从各个局部最小值(即山谷)向外扩展,最终在山峰相遇处形成分割边界。

分水岭算法的步骤
  1. 图像预处理

    • 首先,对输入图像进行灰度化处理,然后通过高斯模糊等方法进行平滑,减少噪声的影响。
  2. 图像二值化

    • 通过阈值分割,将图像二值化。通常,采用 Otsu 方法自动确定最佳阈值,以确保前景和背景的有效分离。
  3. 形态学操作

    • 使用形态学开运算去除噪点,并通过膨胀操作填补前景中的空洞,以获得较为平滑的背景区域。
  4. 确定前景和背景

    • 应用距离变换技术,确定前景区域。通过对开运算结果进行距离变换,可以计算前景物体到边缘的距离。然后,通过设定阈值分割,得到前景区域。
    • 背景区域通过膨胀操作从前景区域推导出来。
  5. 找到未知区域

    • 通过将背景区域和前景区域相减,得到未知区域。这些区域通常位于前景和背景之间,是分割的关键部分。
  6. 标记连通区域

    • 对确定的前景区域进行连通区域标记,以标识不同的物体。为了避免背景标记为零,通常将所有标记值加 1,然后将未知区域标记为 0。
  7. 应用分水岭算法

    • 最后,应用分水岭算法,通过不断扩展标记区域,最终在不同物体之间形成分割边界。

代码实现

以下是使用分水岭算法进行图像分割的完整代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 设置字体为黑体,避免中文显示乱码
font = FontProperties(fname="C:/Windows/Fonts/simhei.ttf", size=12)

# 读取图像
image = cv2.imread('yibgbi.png')  # 将路径替换为你的图像路径
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像
blurred = cv2.GaussianBlur(gray, (5, 5), 0)  # 应用高斯模糊,平滑图像

# 二值化图像(使用Otsu方法进行阈值分割)
_, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 形态学操作去噪点和填补空洞
kernel = np.ones((3, 3), np.uint8)  # 定义3x3的卷积核
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=3)  # 开运算去除噪点

# 确定背景区域(膨胀操作)
sure_bg = cv2.dilate(opening, kernel, iterations=3)  # 膨胀操作填补空洞,得到确定的背景

# 确定前景区域(距离变换和阈值分割)
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)  # 距离变换
_, sure_fg = cv2.threshold(dist_transform, 0.1 * dist_transform.max(), 255, 0)  # 阈值分割得到确定的前景区域
sure_fg = np.uint8(sure_fg)  # 转换为8位整型

# 找到未知区域
unknown = cv2.subtract(sure_bg, sure_fg)  # 背景减去前景得到未知区域

# 标记连通区域
_, markers = cv2.connectedComponents(sure_fg)  # 连通组件标记

# 所有标记加一,确保背景不是0
markers = markers + 1

# 将未知区域标记为0
markers[unknown == 255] = 0

# 应用分水岭算法
markers = cv2.watershed(image, markers)
image[markers == -1] = [255, 0, 0]  # 用红色标记分割边界

# 绘制结果
plt.figure(figsize=(14, 12))

plt.subplot(2, 4, 1)
plt.title("原始图像", fontproperties=font)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.subplot(2, 4, 2)
plt.title("二值化图像", fontproperties=font)
plt.imshow(binary, cmap='gray')

plt.subplot(2, 4, 3)
plt.title("开运算去噪点", fontproperties=font)
plt.imshow(opening, cmap='gray')

plt.subplot(2, 4, 4)
plt.title("确定的背景", fontproperties=font)
plt.imshow(sure_bg, cmap='gray')

plt.subplot(2, 4, 5)
plt.title("确定的前景", fontproperties=font)
plt.imshow(sure_fg, cmap='gray')

plt.subplot(2, 4, 6)
plt.title("未知区域", fontproperties=font)
plt.imshow(unknown, cmap='gray')

plt.subplot(2, 4, 7)
plt.title("距离变换", fontproperties=font)
plt.imshow(dist_transform, cmap='gray')

plt.subplot(2, 4, 8)
plt.title("分水岭分割结果", fontproperties=font)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

plt.show()

标签:plt,简介,cv2,算法,区域,图像,font,分水岭,sure
From: https://blog.csdn.net/2401_83885036/article/details/141752800

相关文章

  • 15.标准库算法
    15.标准库算法15.1引言无事可记15.2最低迭代器要求(MinimumIteratorRequirements)容器的一个重要的部分就是它所支持的迭代器类型。这决定了容器可以使用哪种算法。例如,vector和array都支持random-accessiterators。所有的标准库算法都可以用于vector,不改变容器大小的算......
  • ROS2 Moveit2 - moveit_resources_panda_moveit_config包简介
    moveit_resources_panda_moveit_config是一个在MoveIt框架中常用的资源包,包含了Panda机器人模型(FrankaEmikaPanda)的配置文件。这个包用于测试和演示MoveIt的功能。它通常包含以下内容:URDF/XACRO文件:描述Panda机器人的几何、动力学和运动学模型。SRDF文件:描述Pand......
  • 求阴影面积【简便算法】
    如图所示,长方形ABCD的面积为20平方厘米,S△ABE=4平方厘米,S△AFD=6平方厘米,三角形AEF的面积是多少平方厘米 (?)A 7.2B 7.6    【正确答案】C 8.4D 8.8首先拿到这道题以后,先大致的看一遍,发现这个题目的描述很简短,几何图形也很简单,所以一定是有简便算法的,不需要设什么变量,考试......
  • 一种基于YOLOv10的高精度光伏板缺陷检测算法(原创自研),适用缺陷检测场景、小缺陷场景
     ......
  • 经典跟踪算法总结
    https://github.com/mikel-brostrom/boxmotSORT SORT是一种多目标跟踪算法,可以有效地关联目标,并提升跟踪的实时性。SORT的核心主要是卡尔曼滤波和匈牙利算法的结合,可以达到较好的跟踪效果。在当时,跟踪速度达到了260HZ,相比其他方法速度提升了20倍。SORT关注的重点是实时跟踪......
  • 【机器学习】sklearn核心分类算法比较
    sklearn核心分类算法比较sklearn分类问题的核心算法及其关联核心分类算法其他分类算法算法之间的关联示例代码运行结果sklearn分类问题的核心算法及其关联在scikit-learn中,分类问题是机器学习中最常见的任务之一。scikit-learn提供了多种分类算......
  • 【PSO-BP】基于粒子群算法优化BP神经网络的风电功率预测研究(Matlab代码实现)
            ......
  • 亦菲喊你来学机器学习(16) --K-means聚类算法
    文章目录K-means基本步骤优缺点构建模型总结K-meansK-means算法是一种广泛使用的聚类算法,旨在将数据集划分为K个簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。这个算法通过迭代的方式实现,每次迭代都会更新簇的中心(即簇内所有点的均值),然后将......
  • 【电力系统短期负荷预测】基于ELM、白鲸算法优化ELM、鹭鹰算法优化ELM极限学习机的电
       ......
  • 算法讲演录[1]
    准备在线测评系统Codeforces是一个提供在线评测系统的俄罗斯网站。截止2023年,该网站已经拥有超过2,000,000的注册用户。AtCoder是日本最大的算法竞技网站。提供编程在线比赛、过往比赛提交、在线评测等服务。准备工作安装Code::Blocks。安装Edge浏览器。安装浏览器扩......