图像分割:从基础到实践

学习目标

通过本课程,学员们将了解图像分割的基本概念,掌握使用OpenCV实现图像分割的方法,包括基于阈值的分割和基于区域的分割技术。同时,学员将能够独立完成简单的图像分割任务,并理解其背后的原理。

相关知识点

  • Python OpenCV图像分割

学习内容

1 Python OpenCV图像分割

1.1 图像分割基础

图像分割是计算机视觉中的一个基本问题,它涉及将图像划分为多个部分或区域,每个部分或区域具有相似的属性,如颜色、纹理或亮度。图像分割是许多高级图像处理任务的基础,如对象识别、图像分析和医学图像处理等。在图像分割中,目标是将图像中的像素分组为多个区域,每个区域对应于图像中的一个特定对象或部分。

图像分割的重要性在于它能够帮助计算机理解图像的内容,从而为后续的图像分析和处理提供基础。例如,在医学图像处理中,通过分割可以准确地识别出肿瘤的位置和大小;在自动驾驶技术中,图像分割可以帮助车辆识别道路、行人和其他障碍物。

在本课程中,学员将首先了解图像分割的基本概念,包括分割的目的、常见的分割方法以及分割结果的评估标准。接下来,探讨图像分割在实际应用中的重要性,以及如何选择合适的分割方法来解决特定的问题。

1.2 基于阈值的图像分割

基于阈值的图像分割是最简单也是最常用的图像分割方法之一。这种方法的基本思想是根据图像的灰度值或颜色值将图像中的像素分为不同的类别。阈值的选择是基于阈值分割的关键,不同的阈值选择方法适用于不同的图像和应用场景。

1.2.1 简单阈值分割

执行以下指令获取测试图片。

!wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/3c363b682faa11f09680fa163edcddae/example.jpg

简单阈值分割是最基本的阈值分割方法,它通过设定一个固定的阈值来将图像中的像素分为前景和背景。如果像素的灰度值大于阈值,则该像素被标记为前景;否则,被标记为背景。这种方法适用于背景和前景之间灰度值差异明显的图像。

import cv2
import numpy as np
from matplotlib import pyplot as plt# 读取图像
img = cv2.imread('example.jpg', 0)# 应用简单阈值分割
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 显示结果
plt.subplot(1, 2, 1), plt.imshow(img, 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(thresh1, 'gray')
plt.title('Thresholded Image'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

1.2.2 自适应阈值分割

自适应阈值分割是一种更高级的阈值分割方法,它根据图像的局部特性动态地选择阈值。这种方法适用于图像中背景和前景灰度值变化较大的情况。自适应阈值分割通过计算每个像素周围的局部平均灰度值来确定阈值,从而更好地适应图像的局部特性。

# 应用自适应阈值分割
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)# 显示结果
plt.subplot(1, 2, 1), plt.imshow(img, 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(thresh2, 'gray')
plt.title('Adaptive Thresholded Image'), plt.xticks([]), plt.yticks([])
plt.show()
1.3 基于区域的图像分割

基于区域的图像分割方法通过分析图像中的区域特性来实现分割。这些方法通常基于图像的连通性、颜色或纹理等特征,将图像中的像素分组为不同的区域。基于区域的分割方法适用于图像中对象边界不明显或背景复杂的情况。

1.3.1 连通区域标记

连通区域标记是一种基于区域的分割方法,它通过标记图像中的连通区域来实现分割。连通区域是指图像中具有相同或相似属性的像素集合。通过连通区域标记,可以将图像中的不同对象或部分区分开来。

# 读取图像
img = cv2.imread('example.jpg', 0)# 二值化图像
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 连通区域标记
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary, connectivity=8)# 显示结果
plt.imshow(labels, cmap='jet')
plt.title('Connected Components'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

1.3.2 分水岭算法

分水岭算法是一种基于区域的分割方法,它通过模拟地形中的分水岭来实现图像分割。分水岭算法将图像中的每个像素视为地形中的一个点,通过模拟水从高处流向低处的过程,将图像中的不同区域分隔开来。分水岭算法适用于图像中对象边界不明显或背景复杂的情况。

# 读取图像
img = cv2.imread('example.jpg')# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化图像
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 距离变换
dist_transform = cv2.distanceTransform(binary, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)# 找到未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(binary, sure_fg)# 标记连通区域
ret, markers = cv2.connectedComponents(sure_fg)# 将所有标记加1,确保背景为1
markers = markers + 1# 将未知区域标记为0
markers[unknown == 255] = 0# 应用分水岭算法
markers = cv2.watershed(img, markers)
img[markers == -1] = [255, 0, 0]# 显示结果
plt.subplot(1, 2, 1), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Watershed Segmentation'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(markers, cmap='jet')
plt.title('Markers'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

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

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

相关文章

MQ使用场景分析

异步解耦‌系统间通过消息队列通信,降低耦合度(如订单系统与库存系统)典型场景:电商下单后异步通知物流系统‌流量削峰‌应对突发流量,将请求暂存到消息队列逐步处理典型场景:秒杀活动时缓冲高并发请求‌数…

人工智能学习:NLP文本处理的基本方法

一、分词 1、分词介绍 概念 分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符。分词过程就是找到这样分界符的过程…

Vue3 中 Proxy 在组件封装中的妙用

目录 Vue3 中 Proxy 在组件封装中的妙用:让组件交互更优雅 组件封装中的常见痛点 Proxy 是什么? Proxy 在组件封装中的应用 基础组件结构 使用 Proxy 实现方法透传 代码解析 父组件中的使用方式 Proxy 的其他应用场景 1. 权限控制 2. 方法调用…

DevExpress WinForms中文教程:Data Grid - 过滤编辑器

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

华为云CCE

华为云CCE:重构云原生应用的全栈引擎 一、云原生时代的"操作系统" 在数字经济浪潮中,容器化和微服务架构已成为企业数字化转型的标配。华为云容器引擎(CCE)作为云原生领域的"操作系统",通过深度…

STM32——Uinx时间戳+BKP+RTC实时时钟

目录 一、Uinx时间戳 1.1Uinx简介 1.2UTC/GMT 1.3时间戳转换 1.3.1主要数据类型 1.3.2主要函数 1.3.3C语言时间戳转换示例 1.3.4时间格式化说明符 1.3.5注意事项 二、BKP 2.1BKP简介 2.2BKP基本结构 三、RTC 3.1RTC简介 3.2RTC框图 3.3RTC基本结构 3.4RTC硬件…

Java设计模式是什么?核心设计原则有哪些?

文章目录什么是设计模式?为什么使用设计模式?设计模式的核心设计原则是什么?1. 开闭原则(Open-Closed Principle, OCP)2. 里氏替换原则(Liskov Substitution Principle, LSP)3. 依赖倒置原则&am…

网络层和数据链路层

目录 1.网络层 2.数据链路层 1.网络层 我们知道,我们的消息为了从A端发送到B端,达成远距离传输,我们为此设计了很多协议层,分别是应用层,传输层,网络层,数据链路层,网卡&#xff0c…

Redis 的字典:像智能文件柜一样高效的哈希表实现

目录 一、从传统查找的痛点到哈希表的优势​ 二、哈希表的核心结构:文件柜的构成​ 2.1、 dictht 结构体:文件柜本体​ 2.2、dictEntry 结构体:带链条的文件夹​ 2.2.1、 哈希冲突的解决:抽屉里的链条​ 2.3、字典的高层封装…

FAST API部署和使用

第一部分:FastAPI 的使用(开发环境) 1. 安装 首先,你需要安装 FastAPI 和一个 ASGI 服务器,最常用的是 Uvicorn。 pip install "fastapi[standard]"这个命令会安装 FastAPI 以及所有推荐的依赖,包…

【JavaWeb】之HTML(对HTML细节的一些总结)

大家天天开心! 文章目录 前言一、HTML的简介二、HTML运行方式三、html 的标签/元素-说明四、表单注意事项总结 前言 首先我们在把Java基础学习完之后,我们就要进行网站方面的开发了,我们要了解网页的组成,而网页的组成有HTML,CSS,…

互联网医院品牌IP的用户体验和生态构建

一、患者体验与信任构建互联网医院品牌IP的价值核心在于获得患者的深度信任,而卓越的用户体验是实现这一目标的关键路径。在医疗服务同质化严重的当下,患者体验已成为医疗机构差异化竞争的重要维度。研究表明,良好的用户体验能够提高用户满意…

【Node.js教程】Express框架入门:从搭建到动态渲染商品列表

前言 Visual Studio Code(简称VSCode)是微软开发的一款免费开源跨平台代码编辑器,凭借其免费、开源、跨平台的特性,以及丰富的插件生态和美观的界面,成为前端开发者的首选工具。 本文将带你从零开始学习Express框架,包括搭建项目、配置路由、使用中间件以及实现动态渲染…

众擎机器人开源代码解读

一,综述 EngineAI ROS 包: 高层开发模式:用户可通过发布身体速度指令,直接调用 EngineAI 机器人的行走控制器。底层开发模式:用户可通过发布关节指令,自主开发专属的控制器。 ROS2 package:全…

Windows系统安装Git详细教程

文章目录步骤 1:下载 Git 安装包步骤 2:运行安装程序步骤 3:选择安装路径步骤 4:选择组件步骤 5:选择默认编辑器步骤 6:选择路径环境变量步骤 7:选择 HTTPS 协议的传输方式步骤 8:配…

leetcode 3446. 按对角线进行矩阵排序 中等

给你一个大小为 n x n 的整数方阵 grid。返回一个经过如下调整的矩阵:左下角三角形(包括中间对角线)的对角线按 非递增顺序 排序。右上角三角形 的对角线按 非递减顺序 排序。示例 1:输入: grid [[1,7,3],[9,8,2],[4,…

携程旅行 web 验证码 分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 部分python代码 result cp…

JavaEE 进阶第一期:开启前端入门之旅(上)

专栏:JavaEE 进阶跃迁营 个人主页:手握风云 一、HTML基础 1.1. 什么是HTML HTML(Hyper Text Markup Language),超文本标记语言。 超文本:比文本要强大,通过链接和交互式方式来组织和呈现信息的文本形式。不仅仅有文本…

4.5 PBR

1.PBR简介 2.高光工作流 3.金属工作流1.PBR简介 PBR(Physically Based Rendering, 基于物理的渲染)的工作流分为金属工作流和高光工作流2.高光工作流 高光工作流是一种传统的工作流, 现在用的相对较少, 但是在某些特定情况下能提供更精细的控制a.核心思想它不区分金属和非金属,…

09.《路由基础知识解析和实践》

09.路由基础 文章目录09.路由基础核心概念路由关键组成部分三层转发原理介绍(通信流程)路由类型及配置直连路由(direct)实验示例**静态路由(Static)****实验示例****动态路由****RIP(routing information protocol---路…