在 Python 中使用标准化剪切 (NCut) 进行无监督图像分割的指南

在 python 中使用标准化剪切 (ncut) 进行无监督图像分割的指南

介绍

图像分割在理解和分析视觉数据方面起着至关重要的作用,而归一化剪切(ncut)是一种广泛使用的基于图的分割方法。在本文中,我们将探索如何使用 microsoft research 的数据集在 python 中应用 ncut 进行无监督图像分割,重点是使用超像素提高分割质量。
数据集概述
用于此任务的数据集可以从以下链接下载:msrc 对象类别图像数据库。该数据集包含原始图像及其语义分割为九个对象类(由以“_gt”结尾的图像文件表示)。这些图像被分组为主题子集,其中文件名中的第一个数字指的是类别子集。该数据集非常适合试验分割任务。

问题陈述

我们使用 ncut 算法对数据集中的图像进行图像分割。像素级分割的计算成本很高,而且通常有噪声。为了克服这个问题,我们使用 slic(简单线性迭代聚类)来生成超像素,它将相似的像素分组并减少问题大小。为了评估分割的准确性,可以使用不同的指标(例如,并集交集、ssim、兰德指数)。

执行

1。安装所需的库
我们使用 skimage 进行图像处理,使用 numpy 进行数值计算,使用 matplotlib 进行可视化。

pip install numpy matplotlibpip install scikit-image==0.24.0**2. load and preprocess the dataset**

下载并提取数据集后,加载图像和地面实况分割:

wget http://download.microsoft.com/download/a/1/1/a116cd80-5b79-407e-b5ce-3d5c6ed8b0d5/msrc_objcategimagedatabase_v1.zip -o msrc_objcategimagedatabase_v1.zipunzip msrc_objcategimagedatabase_v1.ziprm msrc_objcategimagedatabase_v1.zip

现在我们准备开始编码了。

from skimage import io, segmentation, color, measurefrom skimage import graphimport numpy as npimport matplotlib.pyplot as plt# load the image and its ground truthimage = io.imread('/content/msrc_objcategimagedatabase_v1/1_16_s.bmp')ground_truth = io.imread('/content/msrc_objcategimagedatabase_v1/1_16_s_gt.bmp')# show images side by sidefig, ax = plt.subplots(1, 2, figsize=(10, 5))ax[0].imshow(image)ax[0].set_title('image')ax[1].imshow(ground_truth)ax[1].set_title('ground truth')plt.show()

3。使用 slic 生成超像素并创建区域邻接图

在应用 ncut 之前,我们使用 slic 算法来计算超像素。使用生成的超像素,我们基于平均颜色相似度构建区域邻接图(rag):

from skimage.util import img_as_ubyte, img_as_float, img_as_uint, img_as_float64compactness=30 n_segments=100 labels = segmentation.slic(image, compactness=compactness, n_segments=n_segments, enforce_connectivity=true)image_with_boundaries = segmentation.mark_boundaries(image, labels, color=(0, 0, 0))image_with_boundaries = img_as_ubyte(image_with_boundaries)pixel_labels = color.label2rgb(labels, image_with_boundaries, kind='avg', bg_label=0

紧凑性控制形成超像素时像素的颜色相似度和空间接近度之间的平衡。它决定了对保持超像素紧凑(在空间方面更接近)与确保它们按颜色更均匀分组的重视程度。
较高的值:较高的紧凑度值会导致算法优先创建空间紧凑且大小均匀的超像素,而较少关注颜色相似性。这可能会导致超像素对边缘或颜色渐变不太敏感。
较低的值:较低的紧凑度值允许超像素在空间尺寸上变化更大,以便更准确地考虑颜色差异。这通常会导致超像素更紧密地遵循图像中对象的边界。

n_segments 控制 slic 算法尝试在图像中生成的超像素(或段)的数量。本质上,它设置了分割的分辨率。
较高的值:较高的 n_segments 值会创建更多的超像素,这意味着每个超像素会更小,分割会更细粒度。当图像具有复杂纹理或小物体时,这会很有用。
较低的值:较低的 n_segments 值会产生更少、更大的超像素。当您想要对图像进行粗分割,将较大的区域分组为单个超像素时,这非常有用。

4。应用标准化剪切 (ncut) 并可视化结果

# using the labels found with the superpixeled image# compute the region adjacency graph using mean colorsg = graph.rag_mean_color(image, labels, mode='similarity')# perform normalized graph cut on the region adjacency graphlabels2 = graph.cut_normalized(labels, g)segmented_image = color.label2rgb(labels2, image, kind='avg')f, axarr = plt.subplots(nrows=1, ncols=4, figsize=(25, 20))axarr[0].imshow(image)axarr[0].set_title("original")#plot boundariesaxarr[1].imshow(image_with_boundaries)axarr[1].set_title("superpixels boundaries")#plot labelsaxarr[2].imshow(pixel_labels)axarr[2].set_title('superpixel labels')#compute segmentationaxarr[3].imshow(segmented_image)axarr[3].set_title('segmented image (normalized cut)')

5。评估指标
无监督分割的关键挑战是 ncut 不知道图像中类别的确切数量。 ncut 找到的分段数量可能超过实际的地面实况区域数量。因此,我们需要强大的指标来评估细分质量。

并集交集 (iou) 是一种广泛使用的评估分割任务的指标,特别是在计算机视觉领域。它测量预测分割区域和地面真实区域之间的重叠。具体来说,iou 计算预测分割和真实数据之间的重叠面积与其并集面积的比率。

结构相似性指数 (ssim) 是一种用于通过比较两个图像的亮度、对比度和结构来评估图像感知质量的指标。

立即学习“Python免费学习笔记(深入)”;

要应用这些指标,我们需要预测和地面实况图像具有相同的标签。为了计算标签,我们在地面上计算一个掩模,并在预测时为图像上找到的每种颜色分配一个 id
然而,使用 ncut 进行分割可能会发现比真实情况更多的区域,这会降低准确性。

def compute_mask(image):  color_dict = {}  # get the shape of the image  height,width,_ = image.shape  # create an empty array for labels  labels = np.zeros((height,width),dtype=int)  id=0  # loop over each pixel  for i in range(height):      for j in range(width):          # get the color of the pixel          color = tuple(image[i,j])          # check if it is in the dictionary          if color in color_dict:              # assign the label from the dictionary              labels[i,j] = color_dict[color]          else:              color_dict[color]=id              labels[i,j] = id              id+=1  return(labels)def show_img(prediction, groundtruth):  f, axarr = plt.subplots(nrows=1, ncols=2, figsize=(15, 10))  axarr[0].imshow(groundtruth)  axarr[0].set_title("groundtruth")  axarr[1].imshow(prediction)  axarr[1].set_title(f"prediction")prediction_mask = compute_mask(segmented_image)groundtruth_mask = compute_mask(ground_truth)#usign the original image as baseline to convert from labels to colorprediction_img = color.label2rgb(prediction_mask, image, kind='avg', bg_label=0)groundtruth_img = color.label2rgb(groundtruth_mask, image, kind='avg', bg_label=0)show_img(prediction_img, groundtruth_img)

现在我们计算准确度分数

from sklearn.metrics import jaccard_scorefrom skimage.metrics import structural_similarity as ssimssim_score = ssim(prediction_img, groundtruth_img, channel_axis=2)print(f"SSIM SCORE: {ssim_score}")jac = jaccard_score(y_true=np.asarray(groundtruth_mask).flatten(),                        y_pred=np.asarray(prediction_mask).flatten(),                        average = None)# compute mean IoU score across all classesmean_iou = np.mean(jac)print(f"Mean IoU: {mean_iou}")

结论

归一化切割是一种强大的无监督图像分割方法,但它也面临着过度分割和调整参数等挑战。通过合并超像素并使用适当的指标评估性能,ncut 可以有效地分割复杂图像。 iou 和 rand 指数指标为分割质量提供了有意义的见解,但需要进一步细化才能有效处理多类场景。
最后,我的笔记本中提供了一个完整的示例。

以上就是在 Python 中使用标准化剪切 (NCut) 进行无监督图像分割的指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1349922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 13:47:57
下一篇 2025年12月13日 13:48:10

相关推荐

  • python程序源代码

    在 Python 中,函数可用于定义数据结构,使用函数语法创建自定义数据类型,定义其属性和行为:定义函数语法:def 名称(参数列表):定义属性和行为:在代码块中使用 self 关键字。创建数据结构:调用函数并传入参数。使用数据结构:像使用其他 Python 对象一样使用,访问属性和调用方法。优点:…

    好文分享 2025年12月13日
    000
  • python人马兽系列有哪几个

    Python 人马兽系列包含《人马兽少女方纫灵》系列五部作品:分别讲述方纫灵成为人马兽少女、寻回故乡、加入反抗军和最终命运的故事。 相关阅读推荐: python人马兽最简单处理 python中的split怎么用 Python 人马兽系列 立即学习“Python免费学习笔记(深入)”; 有哪些? Py…

    2025年12月13日
    000
  • python人马兽最简单处理

    Python中处理人马兽数据的两种方法:使用自定义函数解析数据并存储在数据结构中。使用外部库(如csv)解析和写入CSV文件中的数据。 相关阅读推荐: python人马兽系列有哪几个 python中的split怎么用 Python人马兽处理指南 立即学习“Python免费学习笔记(深入)”; 人马兽…

    2025年12月13日
    000
  • Python 中的重载函数

    函数重载是指定义多个具有相同名称但不同签名的函数的能力,这意味着它们具有不同数量或类型的参数。编译器或解释器会根据函数调用期间传递的参数数量和类型自动选择函数的正确版本。 java 和 c++++ 等语言本身就支持此功能。 虽然 python 本身不支持函数重载,因为它是一种动态类型语言,但可以使用…

    2025年12月13日
    000
  • 具有依赖注入的 FastAPI 身份验证

    fastapi 是一个用于在 python 中构建 api 的现代 web 框架。它是我个人最喜欢的 web 框架之一,因为它内置了对 openapi 规范的支持(这意味着您可以编写后端代码并从中生成所有内容),并且它支持依赖注入。 在这篇文章中,我们将简要介绍一下 fastapi 的 depend…

    2025年12月13日
    000
  • python抢火车票票源代码

    利用 Python 脚本可自动化抢火车票流程,提升抢票概率:安装 schedule 和 selenium 库。准备浏览器驱动。编写抢票脚本。模拟浏览器操作,包括打开网站、输入信息。定位车次列表。筛选车次,选择目标车次。提交订单,填写信息并付款。设置定时任务,在特定时间自动运行脚本。 Python 抢…

    2025年12月13日
    100
  • python12306抢票教程

    本教程提供使用 Python 抢购 12306 火车票的详细步骤:安装 Python 和相关库。获取 12306 网站的 cookie。登录 12306 网站。查询车次信息。解析车次信息,筛选出有余票的车次。打印有余票的车次信息。根据需要自定义抢票代码。 Python 12306 抢票教程 一、前提…

    2025年12月13日
    000
  • python抢车票教程

    使用 Python 抢车票包含以下步骤:安装 requests、BeautifulSoup 和 webdriver 库。查找车次信息,包括车次、发车时间和购票链接。使用 Python 代码设置浏览器选项、创建浏览器实例并持续刷新购票页面。找到目标车票并自动下单,包括填写购票信息和提交订单。 Pyth…

    2025年12月13日
    000
  • python抢东西脚本

    Python 抢东西脚本是一种利用 Python 编程语言编写的自动化工具,用于快速抢购限量或稀缺商品。它通过模拟浏览器行为、解析网站 HTML、在商品可购买时自动提交订单来工作。 Python 抢东西脚本的好处包括极快的速度、自动化和提高成功率。但需要注意使用风险、道德问题和技术的限制。 Pyth…

    2025年12月13日
    000
  • python抢票属于什么类型

    Python 抢票属于自动化脚本类型,其特点包括:自动化、快速、高效和可定制,主要用于抢购热门火车票或特定日期的火车票。 Python 抢票属于什么类型 Python 抢票属于自动化脚本类型。 详细解释 自动化脚本是一种使用编程语言编写的计算机程序,能够自动化执行重复性的任务。Python 抢票脚本…

    2025年12月13日
    000
  • 编程语言难题

    作为一名程序员,我们所有人一生中都至少面临过一次这样的场景:首先学习什么编程语言(对于新手)或者对于有经验的工程师接下来学习什么语言。本文试图让您更好地理解如何做同样的事情。 Python:做任何事第二好的语言如果您是一个正在尝试学习编程的新手,那么最好的选择之一就是使用 python,因为它的简单…

    2025年12月13日
    000
  • 构建 RustyNum:使用 Rust 和 Python 的 NumPy 替代方案

    嘿开发社区! 我想分享一个我一直在做的副项目,叫做 RustyNum。作为每天使用 NumPy 进行数据处理和科学计算的人,我经常想知道使用 Rust 和 Python 从头开始​​创建一个类似的库会有多大的挑战性。这种好奇心激发了 RustyNum 的开发——它是 NumPy 的轻量级替代品,利用…

    2025年12月13日
    000
  • 如何构建您的第一个 Python 游戏:使用 PyGame 创建简单射击游戏的分步指南

    亲爱的读者们大家好, 你有没有想过创建自己的视频游戏?也许您已经考虑过构建一款简单的射击游戏,您可以在其中四处移动、躲避来袭的敌人并攻击目标。好吧,今天是你的幸运日!我们将深入了解 pygame 的奇妙世界,这是一个出色的 python 库,即使您只涉足 python 和基本的控制台应用程序,它也可…

    2025年12月13日
    000
  • 代码、咖啡因和梦想:数据冒险日

    嘿,开发者社区! 我是 Shubham(叫我 Shaggy),很高兴能在这里开始我的数据之旅! 第一天更新:今天,我深入研究了 Python 使用内置函数的文件处理和数据预处理。作为一名前 Java 爱好者,我喜欢 Python 的简单性! 亮点: 轻松处理文本文件强大的内置功能 今天没有可以分享的…

    2025年12月13日
    000
  • 了解紫外线

    uv 是用 Rust 为 python 编写的新项目管理器。既然有这么多可用的选择,为什么还要选择新的选择呢?很久以前我开始使用pipenv,但它最终变得毫无用处。然后我转向诗歌,我现在的公司也使用诗歌。这是一个进步,但并不能说服我 。 对于 uv 想要实现的目标,Python 中没有明确的解决方案…

    2025年12月13日
    000
  • 如何使用 Python 将您的设备变成简单的服务器

    作者:特里克斯·赛勒斯 让我们创建一个从您的设备托管的 python 服务器。 开始.. 创建一个名为server的目录 mkdir server 创建一个名为 server.py 的文件 nano server.py 粘贴以下代码。 import http.serverimport sockets…

    2025年12月13日
    000
  • python免费看电影的软件

    使用 Python 免费观看电影的软件:Popcorn Time:通过种子技术免费流媒体电影和电视节目。Stremio:访问各种流媒体服务,包括免费内容。MediaPortal:通过插件集成免费流媒体服务。Kodi:通过附加组件访问免费电影流媒体。Plex:通过频道访问免费流媒体内容。Jellyfi…

    2025年12月13日
    000
  • python源码怎么转换成软件

    将 Python 源码转换为软件的步骤:安装 Python 编译器,如 PyInstaller。创建包含编译信息的规范文件。运行编译器将其编译为可执行文件。分发可执行文件或安装程序。 如何将 Python 源码转换成软件 Python 是一种解释性语言,这意味着它需要一个解释器才能运行。将其转换为软…

    2025年12月13日
    000
  • python代码大全免费版

    Python 代码大全的免费版可在官方网站下载,提供 PDF、代码示例、Vagrant 配置文件和 Dockerfile。本书是一本编写干净、高效且可维护 Python 代码的最佳实践指南,涵盖广泛主题,包括代码样式、数据结构、测试、并发编程等。使用本书可提高代码质量,减少错误,促进团队协作。充分利…

    2025年12月13日
    000
  • python电影系统

    python电影系统 一、简介 Python电影系统是一个利用Python语言搭建的电影管理系统,它能够帮助用户轻松管理、分类和查找电影信息。 二、功能 电影管理:添加、删除、编辑和搜索电影信息,包括电影标题、演员表、发行日期和评分。类别管理:创建、删除和编辑电影类别,以便轻松对电影进行分类。搜索功…

    好文分享 2025年12月13日
    000

发表回复

登录后才能评论
关注微信