基于 OpenCV 的图像分割项目实战

2023-10-28

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本期我们将一起来实现一个有趣的问题 -图像分割的算法。

本文的示例代码可以在以下链接中找到:

https://github.com/kiteco/kite-python-blog-post-code/tree/master/image-segmentation

作为我们的例子,我们将对KESM显微镜获取的图像进行分割以获取其中的血管组织。

数据科学家和医学研究人员可以将这种方法作为模板,用于更加复杂的图像的数据集(如天文数据),甚至一些非图像数据集中。由于图像在计算机中表示为矩阵,我们有一个专门的排序数据集作为基础。在整个处理过程中,我们将使用 Python 包,以及OpenCV、scikit 图像等几种工具。除此之外,我们还将使用 numpy ,以确保内存中的值一致存储。

主要内容

去噪

为了消除噪声,我们使用简单的中位数滤波器来移除异常值,但也可以使用一些不同的噪声去除方法或伪影去除方法。这项工件由采集系统决定(显微镜技术),可能需要复杂的算法来恢复丢失的数据。工件通常分为两类:

1. 模糊或焦点外区域

2. 不平衡的前景和背景(使用直方图修改正确)

分割

对于本文,我们使用Otsu 的方法分割,使用中位数滤波器平滑图像后,然后验证结果。只要分段结果是二进制的,就可以对任何分段算法使用相同的验证方法。这些算法包括但不限于考虑不同颜色空间的各种循环阈值方法。

一些示例包括:

1. 李阈值

2. 依赖于局部强度的自适应阈值方法

3. 在生物医学图像分割中常用的Unet等深度学习算法

4. 在语义上对图像进行分段的深度学习方法

验证

我们从已手动分割的基础数据集开始。为了量化分段算法的性能,我们将真实数据与预测数据的二进制分段进行比较,同时显示准确性和更有效的指标。尽管真阳性 (TP) 或假阴性 (FN) 数量较低,但精度可能异常高。在这种情况下,F1 分数和 MCC是二进制分类的更好量化指标。稍后我们将详细介绍这些指标的优缺点。

为了定性验证,我们叠加混淆矩阵结果,即真正的正极、真负数、假阳性、假负数像素正好在灰度图像上。此验证也可以应用于二进制图像分割结果上的颜色图像,尽管本文中使用的数据是灰度图像。最后,我们将介绍整个实现过程。现在,让我们看看数据和用于处理这些数据的工具。

Loading and visualizing data

我们将使用以下模块加载、可视化和转换数据。这些对于图像处理和计算机视觉算法非常有用,具有简单而复杂的数组数学。如果单独安装,括号中的模块名称会有所帮助。

如果在运行示例代码中,遇到 matplotlib 后端的问题,请通过删除 plt.ion() 调用来禁用交互式模式,或是通过取消注释示例代码中的建议调用来在每个部分的末尾调用 plt.show()。"Agg"或"TkAgg"将作为图像显示的后端。绘图将显示在文章中。

代码导入

import cv2
 import matplotlib.pyplot as plt
 import numpy as np
 import scipy.misc
 import scipy.ndimage
 import skimage.filters
 import sklearn.metrics
 # Turn on interactive mode. Turn off with plt.ioff()
 plt.ion()

在本节中,我们将加载可视化数据。数据是小老鼠脑组织与印度墨水染色的图像,由显微镜(KESM)生成。此 512 x 512 图像是一个子集,称为图块。完整的数据集为 17480 x 8026 像素,深度为 799,大小为 10gb。因此,我们将编写算法来处理大小为 512 x 512 的图块,该图块只有 150 KB。

各个图块可以映射为在多处理/多线程(即分布式基础结构)上运行,然后再缝合在一起即获得完整的分段图像。我们不介绍具体的缝合方法。简而言之,拼接涉及对整个矩阵的索引并根据该索引将图块重新组合。可以使用map-reduce进行,Map-Reduce的指标例如所有图块的所有F1分数之和等。我们只需将结果添加到列表中,然后执行统计摘要即可。

左侧的黑色椭圆形结构是血管,其余的是组织。因此,此数据集中的两个类是:

• 前景(船只)—标记为255

• 背景(组织)—标记为0

右下方的最后一个图像是真实图像。通过绘制轮廓并填充轮廓以手动方式对其进行追踪,通过病理学家获得真实情况。我们可以使用专家提供的类似示例来训练深度学习网络,并进行大规模验证。我们还可以通过将这些示例提供给其他平台并让他们以更

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 OpenCV 的图像分割项目实战 的相关文章

随机推荐

  • Lua 随机数生成问题

    原文链接 http blog csdn net zhangxaochen article details 8095007 Lua 生成随机数需要用到两个函数 math randomseed xx math random n m 1 math
  • Win10开启热点共享后断网怎么解决?

    描述 关闭热点一切正常 打开热点以后电脑浏览器无法联网 最后发现可能是windows更新导致的 卸载了2022 06 17的更新就好了 因为没有去看dism 是什么东西 怕有木马啥的 就选择方法二卸载了2022 06 17的更新就好了 参考
  • QCustomPlot 使用——绘制折线图

    初始化数据 QVector
  • 检测模型设计准则

    作者 小书童 编辑 集智书童 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 目标检测 技术交流群 后台回复 2D检测综述 获取鱼眼检测 实时检测 通用2D检测等近5年内所有综述 设计高效 高质
  • 电路板布局

    一 PCB布局要求 1 可制造性设计 DFM 可装配性 DFA 可维修性 DFS 可测试性 DFT 2 电气性能实现 ccc fcc ce认证 EMC SI PI及散热要求 3 合理的成本 层数也多成本越高 4 美观度 二 布局的一般原则
  • uni封装ajax,uni-app封装ajax请求方法

    位置项目根目录index js 定义了两种请求get和post import baseconfig from common baseconfig js const httpClient request function method url
  • 求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

    求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows 大家好我是艾西 最近研究了下 l4d2 求生之路2 这款游戏的搭建以及架设过程 今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器 毕竟自己当服主是热
  • C语言指针学习 课堂记录

    定义指针变量 类型名 指针变量名 pa和pb是自定义名 char pa 定义一个指向字符型的指针变量 int pb 定义一个指向整型的指针变量 取地址运算符和取值运算符 一 如果需要获取某个变量的内存地址 可以使用取地址运算符 char p
  • 如何获取虚函数表指针?虚函数表地址?虚函数地址?

    include
  • SOLIDWORKS PDM&Manage升级SOP——服务器篇

    SOLIDWORKS产品数据管理 PDM 解决方案可帮助您控制设计数据 并且从本质上改进您的团队就产品开发进行管理和协作的方式 使用 SOLIDWORKS PDM Professional 您的团队能够 1 安全地存储和索引设计数据以实现快
  • react 中常见API

    跟着大佬的步伐真好 参考 React进阶 React全部api解读 基础实践大全 夯实基础2万字总结
  • Java实现一个单号生成工具类

    在项目开发的过程中 如果一个系统存在多种不同类型的单据 单号生成就比较难以处理 为此 创造出一个单号生成的工具类就很有必要 直接上代码 实体类 数据库字段同下 public class SerialNumber TableId type I
  • python编程求三角形面积公式_python编程 输入三角形的三条边,计算三角形的面积\...

    展开全部 coding UTF 8 Filename test py author by www runoob com a float input 输入三角62616964757a686964616fe59b9ee7ad9431333433
  • 数据字典包括六个部分

    数据字典包括六个部分 数据字典要包括在以下六个部分吧 1 编写数据项 数据项描述 数据项名 数据项含义说明 别名 数据类型 长度 取值范围 取值含义 与其他数据项的逻辑关系 其中 取值范围 与其他数据项的逻辑关系 定义了数据的完整性约束条件
  • VirtualBox如何配置Bridge和Host-Only虚拟网卡

    VirtualBox安装OpenWRT虚拟机以后 需要为虚拟机配置两块虚拟网卡才能保证虚拟机的正常开发环境 一块设为Bridge模式 连接虚拟机网卡与Host网卡的Internet网络 另一块设为Host Only模式 用于Host主机访问
  • Python 第二代非支配排序遗传算法(NSGA-II)求解多目标高次函数的帕累托前沿

    系列文章目录 目录 系列文章目录 前言 一 模型的建立 二 算法的步骤 三 代码的实现 四 输出的结果 总结 前言 在项目进度管理中 NSGA II是常用的求解多目标项目进度管理优化问题的算法 虽然NSGA III也出来了些日子 但是目前主
  • C/C++中#,##,__FILE__,__LINE__等的用法

    在Win 7 GCC下测试通过 include
  • Open3D (C++) 点云按ID序号进行赋色

    目录 一 概述 二 代码实现 三 结果展示 一 概述 直接调用Open3D中的颜色渲染函数根据点云的ID信息为点云中的每个点附上颜色 并保存颜色渲染结果至 pcd文件 二 代码实现 include
  • C++ primer 第14章 操作重载与类型转换

    文章目录 基本概念 直接调用一个重载的运算符函数 某些运算符不应该被重载 使用与内置类型一致的含义 选择作为成员或者非成员 输入和输出运算符 重载输出运算符 lt lt 输出运算符尽量减少格式化操作 输入输出运算符必须是非成员函数 重载输入
  • 基于 OpenCV 的图像分割项目实战

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本期我们将一起来实现一个有趣的问题 图像分割的算法 本文的示例代码可以在以下链接中找到 https github com kiteco kite python blog