OpenCV计算机视觉实战(16)——图像分割技术

OpenCV计算机视觉实战(16)——图像分割技术

    • 0. 前言
    • 1. 分水岭算法
      • 1.1 应用场景
      • 1.2 实现过程
    • 2. GrabCut 交互式分割
      • 2.1 应用场景
      • 2.2 实现过程
    • 3. FloodFill
      • 3.1 应用场景
      • 3.2 实现过程
    • 小结
    • 系列链接

0. 前言

图像分割是计算机视觉中将像素划分为具有特定语义或结构的区域。面对目标紧密相连或前景背景对比不明显的复杂场景,仅凭简单的阈值往往捉襟见肘。本文深入讲解并演示了三种经典而高效的分割方法——分水岭算法借鉴地形水漫模型精准分离粘连目标,GrabCut 交互式抠图通过最小割迭代优化实现细节丰富的前景提取,以及 FloodFill 以种子点为起点快速覆盖同质区域。

1. 分水岭算法

将灰度图看作地形高程图,把“低谷”视为种子点,利用梯度图构造“水漫”过程,最终在“山脊线”处形成分割边界,适合处理前景连通但边界黯淡的场景。

1.1 应用场景

  • 重叠目标分离:当前景对象相互粘连时(如重叠的硬币、细胞团),分水岭能精确沿“山脊”将它们分开
  • 纹理分割:结合梯度图,能处理前景背景亮度相近但纹理不同的场景
  • 预分割:常作为后续目标检测或特征提取的预处理步骤,提供连通组件

1.2 实现过程

  • 读取图像与预处理
    • 转灰度并做高斯模糊,减少噪声
    • 计算梯度图 (SobelLaplacian) 以突出边缘
  • 二值化与距离变换
    • 对图像做阈值化,得到粗略二值前景
    • 对前景做距离变换并归一化
  • 标记种子区域
    • 对距离变换结果做阈值,提取“确实前景”作为种子标记
    • 将未知区域标为 0,背景标为 1
  • 调用分水岭
    • cv2.watershed 会修改标记矩阵,将边界点标记为 –1
    • 在原图上将边界涂为红色
import cv2
import numpy as np# 1. 读取与预处理
img = cv2.imread('2.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)# 2. 梯度与二值化
grad = cv2.Laplacian(blur, cv2.CV_8U, ksize=3)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 3. 距离变换与种子标记
dist = cv2.distanceTransform(binary, cv2.DIST_L2, 5)
_, fg = cv2.threshold(dist, 0.4 * dist.max(), 255, 0)
fg = np.uint8(fg)
bg = cv2.dilate(binary, np.ones((3,3), np.uint8), iterations=3)
unknown = cv2.subtract(bg, fg)# 4. 连通组件与标记
_, markers = cv2.connectedComponents(fg)
markers = markers + 1           # 背景标记为 1
markers[unknown == 255] = 0     # 未知区域标记为 0# 5. 分水岭
markers = cv2.watershed(img, markers)
output = img.copy()
output[markers == -1] = [0, 0, 255]  # 边界标红cv2.imshow('Watershed Segmentation', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

分水岭

关键函数解析:

  • cv2.distanceTransform(src, distType, maskSize):计算二值图中每个前景像素到最近背景的距离,用于挖掘前景核心区域
  • cv2.connectedComponents(src):对前景二值图进行连通组件标记,生成初始标记矩阵
  • cv2.watershed(image, markers):以 markers 为种子,在彩色图像上执行分水岭算法,输出带边界的标记图

2. GrabCut 交互式分割

GrabCut 利用图割 (Graph Cut) 模型结合少量用户标注(矩形或前景/背景涂抹),自动学习前景与背景像素分布,实现高质量分割,适合人物/物体抠图。

2.1 应用场景

  • 半自动抠图:用户只需框选对象,后续可用笔刷细化边缘,比如头发、树叶等复杂轮廓
  • 视频抠像:在关键帧交互后,将模型应用于相邻帧,实现半自动背景替换
  • 图形编辑工具:集成 GrabCut,让非专业用户也能轻松抠图

2.2 实现过程

  • 读取图像与定义感兴趣区域 (Region of Interest, ROI)
    • 用户给定一个大致含前景的矩形框 rect
  • 初始化掩码与模型
    • mask 初始化为全 “可能背景”
    • bgModelfgModel 用于内部高斯混合模型 (Gaussian Mixture Model, GMM)
  • 调用 GrabCut
    • cv2.grabCut 根据 rect 或用户刷涂的 mask 迭代优化
    • 模型会不断更新前景/背景分布
  • 提取结果
    • mask 中标记为前景/可能前景的像素保留,其余设为背景
import cv2
import numpy as npimg = cv2.imread('2.jpeg')
mask = np.zeros(img.shape[:2], np.uint8)# 1. 用户定义矩形 ROI (x,y,w,h)
rect = (50, 50, img.shape[1]-100, img.shape[0]-100)# 2. 初始化模型
bgModel = np.zeros((1,65), np.float64)
fgModel = np.zeros((1,65), np.float64)# 3. 执行 GrabCut
cv2.grabCut(img, mask, rect, bgModel, fgModel, 5, cv2.GC_INIT_WITH_RECT)# 4. 构建前景掩码并应用
mask2 = np.where((mask==cv2.GC_FGD)|(mask==cv2.GC_PR_FGD),255,0).astype('uint8')
result = cv2.bitwise_and(img, img, mask=mask2)cv2.imshow('GrabCut Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

分割结果

关键函数解析:

  • cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode):在指定 rect 区域或已有 mask 上运行 GrabCut
    • mode=cv2.GC_INIT_WITH_RECT:使用矩形初始化
    • mode=cv2.GC_INIT_WITH_MASK:根据用户细化涂抹结果再运行
  • mask 标签值:GC_BGD(0), GC_FGD(1), GC_PR_BGD(2), GC_PR_FGD(3),可提取出最终前景

3. FloodFill

FloodFill 从给定种子点开始,将相似像素“漫水填充”到边界,可用于区域生长、缺陷检测与交互式标注。

3.1 应用场景

  • 缺陷检测:从划痕起点填充,快速定位裂纹区域
  • 交互式分割:点击图像生成精确区域掩码,配合 GrabCut 等方法
  • 色块分割:在质感均匀的背景或卡通图像中,快速提取色块

3.2 实现过程

  • 读取图像
  • 指定种子点 (x, y)
  • 设置填充参数
    • loDiff / upDiff:允许填充的像素与种子点最大差异
    • flags:控制填充方式、掩码使用
  • 调用 FloodFill
    • 返回填充后的像素数与更新后的图像
import cv2
import numpy as npimg = cv2.imread('1.jpeg')
h, w = img.shape[:2]# 1. 构建掩码,需比原图多两像素边缘
mask = np.zeros((h+2, w+2), np.uint8)# 2. 漫水填充参数
seed_point = (700, 500)
newVal = (0, 0, 255)      # 填充颜色:红色
loDiff = (20, 20, 20)     # 下限差异
upDiff = (20, 20, 20)     # 上限差异
flags = 4 | cv2.FLOODFILL_FIXED_RANGE | (255<<8)# 3. 执行 FloodFill
num, img_flood, mask, rect = cv2.floodFill(img.copy(), mask, seed_point,newVal, loDiff, upDiff, flags)cv2.imshow('FloodFill Result', img_flood)
cv2.waitKey(0)
cv2.destroyAllWindows()

floodfill

关键函数解析

  • cv2.floodFill(image, mask, seedPoint, newVal, loDiff, upDiff, flags):从 seedPoint 开始填充,loDiff / upDiff 控制像素相似度
  • flags 参数含义:
    • cv2.FLOODFILL_FIXED_RANGE:像素差异相对种子点
    • cv2.FLOODFILL_MASK_ONLY:仅更新 mask

小结

本节从分水岭的高程地图思路切入,讲解如何借助距离变换与连通组件构建水漫分割,再通过 GrabCut 的图割模型与用户交互实现更高精度的前景去背,最后以 FloodFill 的种子驱动方式演示快速区域生长。三者各有侧重,却可互为补充:分水岭适合自动化预分割,GrabCut 适合复杂边缘细化,FloodFill 则胜在简单直观和交互式应用。

系列链接

OpenCV计算机视觉实战(1)——计算机视觉简介
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介
OpenCV计算机视觉实战(3)——计算机图像处理基础
OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
OpenCV计算机视觉实战(5)——图像基础操作全解析
OpenCV计算机视觉实战(6)——经典计算机视觉算法
OpenCV计算机视觉实战(7)——色彩空间详解
OpenCV计算机视觉实战(8)——图像滤波详解
OpenCV计算机视觉实战(9)——阈值化技术详解
OpenCV计算机视觉实战(10)——形态学操作详解
OpenCV计算机视觉实战(11)——边缘检测详解
OpenCV计算机视觉实战(12)——图像金字塔与特征缩放
OpenCV计算机视觉实战(13)——轮廓检测详解
OpenCV计算机视觉实战(14)——直方图均衡化
OpenCV计算机视觉实战(15)——霍夫变换详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915618.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Coturn打洞服务器

* 概念理解&#xff1a;1. SDP协议&#xff1a;会话描述协议&#xff0c;视频通话的双方通过交换SDP信息进行媒体协商&#xff0c;从而选择使用某一相同的媒体协议进行通信&#xff1b;TLS协议&#xff1a;基于TCP的安全层传输协议DTLS协议&#xff1a;基于UDP的安全层传输协议…

python flusk 监控

# 创建虚拟环境目录 python3 -m venv /sda1/xunjian/venv # 激活虚拟环境 source /sda1/xunjian/venv/bin/activate # 激活后终端会显示 (venv)创建虚拟环境&#xff08;在当前目录&#xff09;&#xff1a;bashpython3 -m venv venv激活虚拟环境&#xff1a;bashsource venv/b…

VUE2 项目学习笔记 ? 语法 v-if/v-show

?语法页面渲染的时候&#xff0c;需要服务器传过来的对象中的一个属性&#xff0c;然后根据这个属性用v-for渲染标签&#xff0c;这里写的v-for".... in dataList.goodsList"但是当解析到这行语法的时候&#xff0c;dataList还没返回&#xff0c;因此控制台会报错找…

使用qemu命令启动虚拟机

1. 安装相关软件 yum install qemu edk2* libvirt -y 启动libvirt服务 systemctl start libvirtd systemctl status libvirtd2. 创建虚拟机 2.1. qemu启动命令示例 /usr/bin/qemu-system-loongarch64 \-machine virt,accelkvm \-nodefaults \-m 2048 \-smp 2,maxcpus4,co…

大模型系统化学习路线

人工智能大模型系统化学习路线一、基础理论筑基&#xff08;1-2个月) 目标&#xff1a;建立大模型核心认知框架 核心内容&#xff1a; 深度学习基础&#xff1a;神经网络原理、CNN/RNN结构、梯度下降算法大模型本质&#xff1a;Transformer架构&#xff08;重点掌握注意力机制、…

LLaMA-Factory 微调可配置的模型基本参数

LLaMA-Factory 微调可配置的模型基本参数 flyfish 基本参数 一、模型加载与路径配置参数名类型描述默认值model_name_or_pathOptional[str]模型路径&#xff08;本地路径或 Huggingface/ModelScope 路径&#xff09;。Noneadapter_name_or_pathOptional[str]适配器路径&#xf…

Ubuntu 22 安装 ZooKeeper 3.9.3 记录

Ubuntu 22 安装 ZooKeeper 3.9.3 记录 本文记录在 Ubuntu 22.04 系统上安装 ZooKeeper 3.9.3 的过程&#xff0c;包含 Java 环境准备、配置文件调整、启动与停机操作、以及如何将 ZooKeeper 注册为系统服务。 一、准备环境 ZooKeeper 3.9.x 要求 Java 11 或更高版本&#xff…

FreeSwitch通过Websocket(流式双向语音)对接AI实时语音大模型技术方案(mod_ppy_aduio_stream)

FreeSwitch通过WebSocket对接AI实时语音大模型插件技术方案1. 方案概述 基于FreeSWITCH的实时通信能力&#xff0c;通过WebSocket协议桥接AI大模型服务&#xff0c;实现低延迟、高并发的智能语音交互系统。支持双向语音流处理、实时ASR/TTS转换和动态业务指令执行。 1753095153…

航班调度优化策略全局概览

在机场关闭场景下的航班恢复工作&#xff0c;是将机场关闭期间所有的航班进行取消然后恢复还是将机场关闭期间航班全部延误而后调整呢&#xff1f;简单来说&#xff0c;在实际操作中&#xff0c;既不是无差别地全部取消&#xff0c;也不是无差别地全部延误。这两种“一刀切”的…

spring boot 异步线程@Async 传递 threadLocal数据

将父类的 threadLocal 的数据 在线程池时&#xff0c;可以转给子线程使用。 Async 的使用。 第一步在启动服务加上 EnableAsync 注解。 EnableAsync public class NetCoreApplication {... ... }第二步&#xff1a;导入阿里 线程工具类<dependency><groupId>com.a…

AI产品经理成长记《零号列车》第一集 邂逅0XAI列车

《零号列车》绝非传统意义上的 AI 产品经理教程 —— 它是我沉淀二十多年跨行业数字化转型与工业 4.0 实战经验后,首创的100集大型小说体培养指南。那些曾在千行百业验证过的知识与经验,不再是枯燥的文字堆砌,而是化作一场沉浸式的学习旅程。​ 这里没有生硬的理论灌输,而…

[C++11]范围for循环/using使用

范围for循环 范围for循环&#xff08;Range-based for loop&#xff09;是 C11 引入的一种简洁的循环语法&#xff0c;用于遍历容器中的元素或者其他支持迭代的数据结构。 范围for循环可以让代码更加简洁和易读&#xff0c;避免了传统for循环中索引的操作。 下面是范围for循环的…

简单了解下npm、yarn 和 pnpm 中 add 与 install(i) 命令的区别(附上两图带你一目明了)

目录 pnpm 中 add 和 i 的区别 npm 中 add 和 i 的区别 yarn 中 add 和 i 的区别 附上两图带你一目明了&#xff1a; npm、yarn和pnpm的三者区别图&#xff1a; i 和 add 的核心区别图&#xff1a; 个人建议&#xff1a;在项目中保持命令使用的一致性&#xff0c;选择一种…

ESP32-S3学习笔记<2>:GPIO的应用

ESP32-S3学习笔记&#xff1c;2&#xff1e;&#xff1a;GPIO的应用1. 头文件包含2. GPIO的配置2.1 pin_bit_mask2.2 mode2.3 pull_up_en和pull_down_en2.4 intr_type3. 设置GPIO输出/获取GPIO输入4. 中断的使用4.1 gpio_install_isr_service4.2 gpio_isr_handler_add4.3 gpio_…

得物视觉算法面试30问全景精解

得物视觉算法面试30问全景精解 ——潮流电商 商品鉴别 视觉智能&#xff1a;得物视觉算法面试核心考点全览 前言 得物App作为中国领先的潮流电商与鉴别平台&#xff0c;持续推动商品识别、真假鉴别、图像搜索、内容审核、智能推荐等视觉AI技术的创新与落地。得物视觉算法岗位…

[Linux入门] Linux 账号和权限管理入门:从基础到实践

一、Linux 用户账号&#xff1a;谁能访问系统&#xff1f; 1️⃣超级用户&#xff08;root&#xff09; 2️⃣普通用户 3️⃣程序用户 二、组账号&#xff1a;让用户管理更高效 1️⃣组的类型 2️⃣特殊组 三、用户与组的 “身份证”&#xff1a;UID 和 GID 四、配置文…

阿里云ssl证书自动安装及续订(acme)

目录 一、shell命令安装 二、docker run安装 三、docker compose安装 一、shell命令安装 # 安装acme curl https://get.acme.sh | sh -s emailfloxxx5163.com# 注册zerossl .acme.sh/acme.sh --register-account -m flowxxx25163.com --server zerossl# 获取证书 export Al…

@fullcalendar/vue 日历组件

功能&#xff1a;日程安排&#xff0c;展示日历&#xff0c;可以用来做会议日历&#xff0c;可以跨日期显示日程。 Fullcalendarvue3 日历组件 参考文档&#xff1a;【vue2】一个完整的日历组件 fullcalendar&#xff0c;会议预约功能 中文说明文档&#xff1a;https://www.he…

Dijkstra 算法求解多种操作

一、问题背景与核心需求 需要找到从a到b的最优操作序列&#xff0c;使得总花费最小。三种操作的规则为&#xff1a; 操作 1&#xff1a;x → x1&#xff0c;花费c1&#xff1b;操作 2&#xff1a;x → x-1&#xff0c;花费c2&#xff1b;操作 3&#xff1a;x → x*2&#xff0…

本地项目提交到git教程

创建远程仓库 登录 GitHub&#xff0c;点击右上角 New repository。 填写仓库名称&#xff08;如 my-project&#xff09;、描述&#xff0c;选择公开 / 私有。 不要初始化 README、.gitignore 或 LICENSE&#xff08;保持空仓库&#xff09;&#xff0c;点击 Create repositor…