JuliaImages教程(二):图像分割

1、介绍

图像分割是将图像划分为具有相似属性的区域的过程。图像分割具有多种应用,例如医学图像分割、图像压缩,并用作对象检测和光流等更高级别视觉任务中的预处理步骤。该包是用 Julia 编写的图像分割算法的集合。

2、安装

Pkg.add("ImageSegmentation")

3、例子

图像分割不是一个数学上明确定义的问题:例如,输入图像的唯一无损表示是每个像素都是其自己的片段。然而,这并不符合我们自己的直觉观念,即某些像素自然地分组在一起。因此,许多算法需要参数,通常是某种阈值,表示您愿意容忍单个片段内像素之间一定量的变化。

让我们看一个有关如何使用此包中的分段算法的示例。我们将尝试将下图中的马、地面和天空分开。我们将探索两种算法 - 种子区域生长felzenszwalb。种子区域生长需要我们事先知道片段的数量以及每个片段上的一些点,而 felzenszwalb 使用更抽象的参数来控制片段内相似度。
在这里插入图片描述

3.1 加载原始图像

horse.jpg是本地图像,可以去这里下载

using Images, ImageView

img = load("images/horse.jpg")

imshow(img)

在这里插入图片描述

3.2 分割图像

最简单的方式是将鼠标悬停在要分割的不同对象上,然后读出每个对象内一个或多个点的坐标。我们将把种子点存储为元组向量,并与记录的种子点一起(seed position, label)使用。

seeds = [(CartesianIndex(126,81),1), (CartesianIndex(93,255),2), (CartesianIndex(213,97),3)]

segments = seeded_region_growing(img, seeds)

# 我们可以使用每个片段的平均颜色来可视化:
imshow(map(i->segment_mean(segments,i), labels_map(segments)));

在这里插入图片描述
可以看到,该算法在分割三个对象方面做的还不错。唯一明显的错误是“马”的边框和天空元素最终与地面组合在了一起。这是因为seeded_region_growing总是返回连接的区域,并且没有将天空的这些部分连接到更大图像的路径。如果我们在这些区域添加一些额外的种子点(鼠标悬停,多选择几个点),并给它们提供与天空其余部分相同的标签2,我们将得到或多或少完美的结果。
在这里插入图片描述

3.3 felzenszwalb 算法分割该图像

felzenszwalb只需要一个k控制段大小的参数。更大k将导致更大的细分。

using Images, ImageSegmentation

img = load("images/horse.jpg")

segments = felzenszwalb(img, 100)

segments2 = felzenszwalb(img, 10)

imshow(map(i->segment_mean(segments,i), labels_map(segments)));

imshow(map(i->segment_mean(segments2,i), labels_map(segments2)));

在这里插入图片描述
我们只得到了两个“主要”部分k = 100。设置k = 10导致片段较小但有很多噪点。felzenzwalb还带有一个可选参数min_size 它删除所有小于min_size像素的段。 (大多数方法在其核心算法中不会删除小片段。我们可以使用该prune_segments方法对分割结果进行后处理并删除小片段。)

segments = felzenszwalb(img, 10, 100)  # 删除小于100像素的片段

imshow(map(i->segment_mean(segments,i), labels_map(segments)))

在这里插入图片描述

4、结果

segments = felzenszwalb(img, 10, 100)
println(segments)

# 输出结果
Segmented Image with:
  labels map: 240×360 Matrix{Int64}
  number of labels: 59

所有分段算法(模糊 C 均值除外)都返回一个结构体SegmentedImage作为其输出。SegmentedImage包含有关段的所有必要信息。以下函数可用于获取有关段的信息:

  1. labels_map:返回一个数组,其中包含分配给每个像素的标签。
  2. segment_labels:返回所有分配的标签的列表。
  3. segment_mean:返回所提供标签的平均强度。
  4. segment_pixel_count:返回分配给所提供标签的像素计数。

5、种子域算法

种子区域生长根据一些用户定义的种子分割图像。每个种子都是一个(position, label)元组,其中positionCartesianIndexlabel是正整数。每个标签对应于图像的唯一分区。该算法尝试将这些标签分配给每个剩余的点。如果多个点具有相同的标签,那么它们将贡献于同一段。

using Images, ImageSegmentation

img = load("images/worm.jpg")

seeds = [(CartesianIndex(104, 48), 1), (CartesianIndex( 49, 40), 1),
                (CartesianIndex( 72,131), 1), (CartesianIndex(109,217), 1),
                (CartesianIndex( 28, 87), 2), (CartesianIndex( 64,201), 2),
                (CartesianIndex(104, 72), 2), (CartesianIndex( 86,138), 2)];

segments = seeded_region_growing(img, seeds)

imshow(map(i->segment_mean(segments,i), labels_map(segments)));

打印结果:
在这里插入图片描述

6、未播种区域算法

该算法类似于种子区域算法,但不需要任何有关种子点的先验信息

using Images, ImageSegmentation

img = load("images/tree.jpg");

segments = unseeded_region_growing(img, 0.05);

imshow(map(i->segment_mean(segments,i), labels_map(segments)));

unseeded_region_growing需要图像img及其threshold参数。

threshold=0.05
在这里插入图片描述
threshold = 0.1
在这里插入图片描述

threshold = 0.2
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试面试题(二)

Web 测试.web 测试描述用浏览器访问 www.baidu.com 的过程以京东首页为例,设计用例框架。(注意框架设计逻辑,区域划分,专项测试等,不需 要详细用例,需要查看 PC 可直接和辨识管提要求)如何测试购…

Java Web 网页设计(1)

不要让追求之舟停泊在幻想的港湾 而应扬起奋斗的风帆 驶向现实生活的大海 网页设计 1.首先 添加框架支持 找到目录右键添加 找到Web Application选中 点击OK 然后 编辑设置 找到Tomcat--local 选中 点击OK 名称可以自己设置 找到对应文件夹路径 把Tomcat添加到项目里面 因为…

C++之通俗易懂学模版

目录 一、了解什么是泛性编程 二、模版 1.函数模版 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.5 模板参数的匹配原则 2.类模板 2.1 类模板的定义格式 2.2 类模板的实例化 3. 非类型模板参数 4. 模板的特化 4.1 概念 4.2 …

Visual Studio调试C/C++指南

1. 前言 Visual Studio(VS)是微软开发的一款集成开发环境(IDE)软件,支持C/C、C#、VB、Python等开发语言,开发桌面、Web等应用程序。VS功能极其强大,使用极其便利,用户数量最多,被誉为"宇宙…

Python 基础 (Pandas):Pandas 入门

1. 官方文档 API reference — pandas 2.2.2 documentation 2. 准备知识:Pandas 数据结构 Series & DataFrame 2.1 Series 2.1.1 创建 Series 类型数据 一个 Series 对象包含两部分:值序列、标识符序列。可通过 .values (返回 NumPy ndarry 类型…

C语言扫雷游戏完整实现(下)

文章目录 前言一、排雷函数菜单二、排雷函数菜单的实现三、拓展棋盘功能四、源码1. test.c源文件2. game.h头文件3. game.c源文件 总结 前言 C语言实现扫雷游戏的排雷菜单,以及功能的实现,拓展棋盘功能,以及源码等。 上半部分的链接地址: C语…

第十五届蓝桥杯省赛第二场PythonB组B题【逆序对期望】题解(AC)

解题思路 枚举所有的可能的交换情况,时间复杂度 O ( n 4 ) O(n^4) O(n4)。 用归并排序计算数组的逆序对,时间复杂度 O ( n ) O(n) O(n)。 综上时间复杂度 O ( n 5 ) O(n^5) O(n5)。 由于 Python 运行效率较低,约 500 500 500 秒可得到…

前端框架技术调研

目前程序员使用前端框架最多的是哪一个?

SEGGER Embedded Studio IDE移植FreeRTOS

SEGGER Embedded Studio IDE移植FreeRTOS 一、简介二、技术路线2.1 获取FreeRTOS源码2.2 将必要的文件复制到工程中2.2.1 移植C文件2.2.2 移植portable文件2.2.3 移植头文件 2.3 创建FreeRTOSConfig.h并进行配置2.3.1 处理中断优先级2.3.2 configASSERT( x )的处理2.3.3 关于系…

echarts树图-实现拓扑图效果

使用echarts树图来实现拓扑图效果,其效果如下: 代码如下: const data {name: XXX公司,children: [{name: 网络主机,children: [{name: 普通路由器,children: [{name: 智能网关},{name: 192.168.1.0/24}]}]},{name: 企业路由器},{name: 三…

【分享】WinRAR软件如何压缩文件?

WinRAR是一款功能强大的压缩文件管理工具,支持多种压缩文件格式,那如何使用WinRAR来压缩文件呢?不清楚的小伙伴一起来看看吧! 压缩方法: 首先,安装好WinRAR工具,然后选中需要压缩的文件或文件夹…

C++高级特性:异常概念与处理机制(十四)

1、异常的基本概念 异常:是指在程序运行的过程中发生的一些异常事件(如:除数为0,数组下标越界,栈溢出,访问非法内存等) C的异常机制相比C语言的异常处理: 函数的返回值可以忽略&…

麒麟龙芯loongarch64 electron 打包deb包

在麒麟龙芯(loongarch64)电脑上 使用electron 开发桌面应用。之前用electron-packager 打包出来的是文件夹 是 unpack 包。现在需要打包deb包,依据开发指南开始打包。 在项目文件夹下 打开终端 输入 npm run packager 先打包unpack包 然后…

FreeRTOS:3.消息队列

FreeRTOS消息队列 本文主要基于消息队列的源码进行分析,来对FreeRTOS的消息队列进一步学习。 消息队列非常重要,因为后面的各种信号量基本都是基于队列的,搞清楚消息队列的源码,也就搞清楚消息队列的原理。 参考链接&#xff1…

188页 | 2023企业数字化转型建设方案(数据中台、业务中台、AI中台)(免费下载)

1、知识星球下载: 如需下载完整PPTX可编辑源文件,请前往星球获取:https://t.zsxq.com/19KcxSeyA 2、免费领取步骤: 【1】关注公众号 方案驿站 【2】私信发送 【2023企业数字化转型建设方案】 【3】获取本方案PDF下载链接&#…

AI:165-Coze自定义赛博风格Bot-图片生成操作指南

Coze是由字节跳动推出的一个AI聊天机器人和应用程序编辑开发平台,旨在帮助用户快速创建各种类型的聊天机器人、智能体、AI应用和插件,并将其部署在社交平台和即时聊天应用程序中,如Discord、WhatsApp、Twitter、飞书、微信公众号等。 这个平…

计算机网络3——数据链路层3以太网的MAC层

文章目录 一、MAC 层的硬件地址1、介绍2、注意点3、定制标准 二、MAC 帧的格式1、结构2、工作原理3、其他 一、MAC 层的硬件地址 1、介绍 在局域网中,硬件地址又称为物理地址或 MAC地址(因为这种地址用在MAC帧中)。 大家知道,在所有计算机系统的设计中…

剑指Offer题目笔记32(拓扑排序)

面试题113: 解决方案: 将课程看成图中的节点,如果两门课程存在先修顺序那么它们在图中对应的节点之间存在一条从先修课程到后修课程的边,因此这是一个有向图。可行的修课序列实际上是图的拓扑排序序列。图中的每条边都是从先修课…

C++并发编程

基本介绍 线程 C98标准没有直接提供原生的多线程支持 在C98中&#xff0c;并没有像后来的C11标准中那样的<thread>库或其他直接的多线程工具 然而&#xff0c;这并不意味着在C98中无法实现多线程。开发者通常会使用平台特定的API&#xff08;如Windows的线程API或POSI…

前端开发攻略---用原生JS在网页中也能实现 文本转语音!

1、原理 语音合成 (也被称作是文本转为语音&#xff0c;英语简写是 tts) 包括接收 app 中需要语音合成的文本&#xff0c;再在设备麦克风播放出来这两个过程。 Web API中对此有一个主要控制接口 SpeechSynthesis&#xff0c;外加一些处理如何表示要被合成的文本 (也被称为 utte…