在 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) 进行无监督图像分割的指南的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2193051.html

(0)
上一篇 2025年2月25日 19:50:47
下一篇 2025年2月25日 19:51:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python数据库操作:必须使用ORM吗?

    Python数据库操作:ORM并非唯一选择 许多Python开发者习惯使用ORM(对象关系映射)工具,例如SQLAlchemy,来操作数据库。 但一个常见问题是:是否必须为每个数据库表都创建对应的ORM映射?尤其面对大量表时,这种方法显得冗…

    2025年3月28日
    100
  • mySQL下载完安装不了

    mysql安装失败的原因主要有:1. 权限问题,需以管理员身份运行或使用sudo命令;2. 依赖项缺失,需安装相关开发包;3. 端口冲突,需关闭占用3306端口的程序或修改配置文件;4. 安装包损坏,需重新下载并验证完整性;5. 环境变量配…

    2025年3月28日
    100
  • 币安Alpha是什么

    安币Alpha是币安平台上为专业交易者和投资者提供的工具和服务聚合平台。它的核心功能包括:1.策略广场,汇集不同交易策略;2.策略构建器,允许自定义交易策略;3.高级数据分析,提供市场分析工具;4.机构级服务,满足专业投资者的需求。 币安作…

    2025年3月28日
    100
  • python写火车票抢票软件下载

    可以下载 Python 火车票抢票软件来解决抢票难题,最常用的软件是 12306 抢票助手。下载步骤: 1. 访问 GitHub 项目。2. 下载 ZIP 文件。3. 解压文件。使用步骤: 1. 运行“run.py”。2. 输入账号密码。3…

    2025年3月14日
    200
  • 小红书水印怎么批量去掉

    小红书水印批量去除方法:使用在线工具(水印云、智图、Apowersoft)使用第三方软件(VideoProc、VSDC、FonePaw)使用脚本(需了解 Python 或 JavaScript) 小红书水印如何批量去除? 批量去除小红书水印…

    2025年3月14日
    200
  • 微信支付“统一下单”接口返回数据乱码,如何解决?

    微信“统一下单”接口返回数据乱码探因及解决 在使用微信支付“统一下单”接口时,部分开发者可能遇到返回数据乱码的情况。这通常是由返回数据编码与预期不一致导致的。 问题原因 微信支付“统一下单”接口返回的是 xml 格式数据。如果返回的 htt…

    2025年3月14日
    200
  • atom编辑器怎么运行

    要在 Atom 编辑器中运行代码,需要安装 “atom-runner” 包:转到 “Packages”(包)> “Install Packages”(安装包)或使…

    2025年3月13日
    200
  • apache属于什么服务

    Apache是互联网幕后的英雄,不仅是Web服务器,更是一个支持巨大流量、提供动态内容的强大平台。它通过模块化设计提供极高的灵活性,可根据需要扩展各种功能。然而,模块化也带来配置和性能方面的挑战,需要谨慎管理。Apache适合需要高度可定制…

    2025年3月13日
    200
  • docker是干啥的 docker是用来干什么的

    通过使用 Docker,你可以轻松地打包和部署应用程序,确保在任何环境中都能一致地运行。Docker 的核心概念是镜像(只读模板)和容器(镜像的运行实例),它提供了轻量级且高效的虚拟化,避免了部署问题,简化了应用程序管理。 Docker?那…

    2025年3月13日
    200
  • apache服务器的作用

    Apache服务器是一个HTTP守护程序,负责接收和处理来自用户的HTTP请求,并将服务器上的相应文件(如HTML页面)发送给用户,完成网络交互。它支持动态内容生成、安全性控制和负载均衡等功能,理解HTTP协议是理解Apache工作原理的关…

    2025年3月13日
    200

发表回复

登录后才能评论