使用 skimage 从多边形中提取图像片段

2024-04-13

我想获得通过剪切图像内的多边形而产生的子图像。

我在 skimage 中有一个图像,在 matplotlib.patches 中有一个多边形。

怎么做?

以下是我尝试过的。我不一定在寻找类似于下面的方法,我正在寻找最干净、最有效的实现。


使用此代码,多边形正确地覆盖了我想要提取的图像部分(但不提取感兴趣的部分):

import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygon

I = io.imread(fp) # fp is path to image
plt.imshow(I)
ax = plt.gca()

polygons, color = [], []   
c = np.random.random((1, 3)).tolist()[0]
for seg in ann['segmentation']:
    poly = np.array(seg).reshape((len(seg)/2, 2))
    polygons.append(Polygon(poly, True,alpha=0.4))
    color.append(c)
p = PatchCollection(polygons, facecolors=color, edgecolors=(0,0,0,1), linewidths=3, alpha=0.4)

ax.add_collection(p)

但是当我尝试使用此代码获取分段图像时,叠加层显示错误:

fig, ax = plt.subplots()
im = ax.imshow(I)
im.set_clip_path(polygon)
plt.axis('off')
plt.show()

看起来多边形的 Y 坐标只需要翻转(特别是因为上图显示 Y 轴以相反的方式排序),但事实并非如此:

a = polygons[0].xy.copy()
a[:,1] = im._A.shape[0] - a[:,1]
newPoly = Polygon(a, True,alpha=0.4)
fig, ax = plt.subplots()
im = ax.imshow(I)
im.set_clip_path(newPoly)
plt.axis('off')
plt.show()

(其实不只是X坐标有偏移问题,Y坐标也有比例问题,我也不知道为什么)


我也无法解释这种奇怪的行为。无论如何,最近在另一个问题 https://stackoverflow.com/questions/37123322/how-to-plot-an-amoeba-like-figure-on-matplotlib/37149163#37149163我建议了一个可能在这里有所帮助的食谱(尽管我不会称其为最干净的解决方案)。用这个(不是很漂亮)代码:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from matplotlib import path

class LineBuilder:
    def __init__(self, line,ax,color):
        self.line = line
        self.ax = ax
        self.color = color
        self.xs = []
        self.ys = []
        self.cid = line.figure.canvas.mpl_connect('button_press_event', self)
        self.counter = 0
        self.shape_counter = 0
        self.shape = {}
        self.precision = 10

    def __call__(self, event):
        if event.inaxes!=self.line.axes: return
        if self.counter == 0:
            self.xs.append(event.xdata)
            self.ys.append(event.ydata)
        if np.abs(event.xdata-self.xs[0])<=self.precision and np.abs(event.ydata-self.ys[0])<=self.precision and self.counter != 0:
            self.xs.append(self.xs[0])
            self.ys.append(self.ys[0])
            self.ax.scatter(self.xs,self.ys,s=120,color=self.color)
            self.ax.scatter(self.xs[0],self.ys[0],s=80,color='blue')
            self.ax.plot(self.xs,self.ys,color=self.color)
            self.line.figure.canvas.draw()
            self.shape[self.shape_counter] = [self.xs,self.ys]
            self.shape_counter = self.shape_counter + 1
            self.xs = []
            self.ys = []
            self.counter = 0
        else:
            if self.counter != 0:
                self.xs.append(event.xdata)
                self.ys.append(event.ydata)
            self.ax.scatter(self.xs,self.ys,s=120,color=self.color)
            self.ax.plot(self.xs,self.ys,color=self.color)
            self.line.figure.canvas.draw()
            self.counter = self.counter + 1

def create_shape_on_image(data,cmap='jet'):
    def change_shapes(shapes):
        new_shapes = {}
        for i in range(len(shapes)):
            l = len(shapes[i][1])
            new_shapes[i] = np.zeros((l,2),dtype='int')
            for j in range(l):
                new_shapes[i][j,0] = shapes[i][0][j]
                new_shapes[i][j,1] = shapes[i][1][j]
        return new_shapes
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.set_title('click to include shape markers (10 pixel precision to close the shape)')
    line = ax.imshow(data) 
    ax.set_xlim(0,data[:,:,0].shape[1])
    ax.set_ylim(0,data[:,:,0].shape[0])
    linebuilder = LineBuilder(line,ax,'red')
    plt.gca().invert_yaxis()
    plt.show()
    new_shapes = change_shapes(linebuilder.shape)
    return new_shapes

img = mpimg.imread('wm4HA.png')

shapes = create_shape_on_image(img)[0]

xx,yy = np.meshgrid(range(img.shape[0]),range(img.shape[1]))
shapes = np.hstack((shapes[:,1][:,np.newaxis],shapes[:,0][:,np.newaxis]))
p = path.Path(shapes)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if not p.contains_point((i,j)):
            img[i,j,:] = np.array([0,0,0,0])

plt.imshow(img)

plt.show()

我可以构建您想要的结果:

对您来说最重要的代码是:

img = mpimg.imread('wm4HA.png')

shapes = create_shape_on_image(img)[0] # Here I'm calling a function to build a polygon.

xx,yy = np.meshgrid(range(img.shape[0]),range(img.shape[1]))
shapes = np.hstack((shapes[:,1][:,np.newaxis],shapes[:,0][:,np.newaxis]))
p = path.Path(shapes)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if not p.contains_point((i,j)):
            img[i,j,:] = np.array([0,0,0,0])

plt.imshow(img)

plt.show()

在本例中,我使用了一个方法通过点击来构建多边形:

使用该多边形,我将 alpha 通道(在 RGBA 中,我认为 JPEG 只是 RGB)设置为 0 以实现透明度。

我知道它并不完美,但我希望它有所帮助。

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

使用 skimage 从多边形中提取图像片段 的相关文章

  • 在 Pandas 中,如何从基于另一个数据框的数据框中删除行?

    我有 2 个数据框 一个名为 USERS 另一个名为 EXCLUDE 他们都有一个名为 电子邮件 的字段 基本上 我想删除 USERS 中包含 EXCLUDE 中包含电子邮件的每一行 我该怎么做 您可以使用boolean indexing
  • 如何使用 colorchecker 在 opencv 中进行颜色校准?

    我有数码相机获取的色彩检查器图像 我如何使用它来使用 opencv 校准图像 按照以下颜色检查器图像操作 您是想问如何进行颜色校准或如何使用 OpenCV 进行校准 为了进行颜色校准 您可以使用校准板的最后一行 灰色调 以下是您应该逐步进行
  • 从sklearn PCA获取特征值和向量

    如何获取 PCA 应用程序的特征值和特征向量 from sklearn decomposition import PCA clf PCA 0 98 whiten True converse 98 variance X train clf f
  • Python 是解释型的还是编译型的,或者两者兼而有之?

    据我了解 An 解释的语言是由解释器 将高级语言转换为机器代码然后执行的程序 实时运行和执行的高级语言 它一次处理一点程序 A compiled语言是一种高级语言 其代码首先由编译器 将高级语言转换为机器代码的程序 转换为机器代码 然后由执
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • 如何使用 Bokeh 动态隐藏字形和图例项

    我正在尝试在散景中实现复选框 其中每个复选框应显示 隐藏与其关联的行 我知道可以通过图例来实现这一点 但我希望这种效果同时在两个图中发生 此外 图例也应该更新 在下面的示例中 出现了复选框 但不执行任何操作 我显然不明白如何更新用作源的数据
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • 以编程方式使用 Sphinx 特定指令解析 .rst 文件

    我希望能够在 Python 中解析基于 sphinx 的 rst 以便进一步处理和检查 就像是 import sphinx p sphinx parse path to file rst do something with p 似乎在 do
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • 带有 RotatingFileHandler 的 Python 3 记录器超出 maxBytes 限制

    我使用以下代码来限制日志文件的大小 最小示例 import logging from logging handlers import RotatingFileHandler Set up logfile and message loggin
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我
  • 导入错误:无法导入名称“时间戳”

    我使用以下代码在 python 3 6 3 中成功安装了 ggplot conda install c conda forge ggplot 但是当我使用下面的代码将其导入笔记本时 出现错误 from ggplot import Impor
  • 操作错误:(sqlite3.OperationalError) SQL 变量太多,同时将 SQL 与数据帧一起使用

    我有一个熊猫数据框 如下所示 activity User Id 0 VIEWED MOVIE 158d292ec18a49 1 VIEWED MOVIE 158d292ec18a49 2 VIEWED MOVIE 158d292ec18a4
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • 使用 Python 将对象列表转为 JSON

    我在转换时遇到问题Object实例到 JSON ob Object list name scaping myObj base url u number page for ob in list name json string json du

随机推荐

  • 如何在Vue.js中添加一堆全局过滤器?

    我想在 Vue js 应用程序中使用一些全局过滤器 我知道我需要在主 Vue 实例之前定义它们 但从代码组织的角度来看 将它们全部放在 main js 文件中对我来说似乎并不正确 我怎样才能将定义放在一个单独的文件中 导入到 main js
  • GitHub API v3:确定用户是否是组织的所有者

    很容易确定用户是否是团队成员如果你知道id http developer github com v3 orgs teams get team member GET teams id members user 但如何才能轻松确定每个组织都拥有
  • Perl 字符串是不可变的吗?

    当我对字符串进行串联时 幕后发生了什么 my short short short cake Perl 是否有效地创建一个新字符串 然后为其分配正确的变量引用 或者 Perl 字符串本质上总是可变的 这个问题的动机来自我与一位同事的讨论 他说
  • 模板构造函数优先于普通复制和移动构造函数?

    以下程序的输出 include
  • 如何检查 VBA DAO 记录集中是否为空?

    我在数据库中有一个可选字段 我正在使用 DAO 记录集提取该字段 在将字段与其他字段连接之前 我需要检查该字段是否已设置 到目前为止 我已经尝试过以下代码片段Is and 这是明显错误的语法 Is 无济于事 看来如果我使用 它不会正确地与N
  • 添加资源文件到VC6 dll

    我有许多 VC 6 0 项目 DSP 它们构建到没有资源文件的 dll 中 知道如何将资源添加到现有项目中吗 该项目很快就会发布一个主要版本 我想为那些目前缺少的 dll 添加一个文件版本 dll 将在发布之前重新编译 因此我只是尝试使这些
  • Active Directory 是否支持事务?

    简单的问题 但我在任何地方都找不到答案 Active Directory 是否支持事务 换句话说 以下更改是否会回滚 因为我没有调用scope Complete using var scope new TransactionScope Di
  • 是否可以定义一个符合协议的Class类型的属性?

    例如 我有MyFancyData协议 如何指定 MyFancyDataClass 属性仅接受符合此协议的类 interface MyObject NSObject property Class MyFancyDataClass proper
  • 头文件中的内存分配

    我工作的公司有针对嵌入式目标的 C 开发的开发规则 一是 建议不要在头文件中分配任何存储空间 我不确定这意味着什么 写它的人不在身边 其他开发人员也不在乎 所以我在这里问 我的理解是 我不应该在头文件中声明变量 因此在 h 中不鼓励类似的操
  • 使用 caseInSensitive 在 Firebase 中保存和/或查询用户显示名称?

    我正在将我的项目从 Swift 转移到 Firebase Firebase 用户没有用户名 但我允许他们保存显示名称 该名称更像是属性而不是实际对象 如何让用户在敏感文本中使用大小写来查询其他用户 朋友 您可以轻松完成此任务 我们不知道您当
  • 如何缓存 sbt TaskKey 的结果?

    我有一项昂贵的任务需要在测试中参考 lazy val exampleSources TaskKey Seq File exampleSources for use in tests exampleSources updateClassifi
  • 空指针与悬挂指针

    空指针和悬空指针之间有有意义的区别吗 看起来这两个术语都用于表示不指向任何内容的指针 是一个悬空指针的想法used引用某些东西 但现在没有 其中空指针只是一个不引用任何东西的指针 无论它过去指向什么 指针术语 悬空 或野 指针 指向某处的指
  • 如何发光最小。最大和关闭按钮?

    我按照以下指南使用 DWM API 创建自定义 Aero 框架 My work void CMainFrame OnActivate UINT nState CWnd pWndOther BOOL bMinimized CFrameWnd
  • 将数据库与 Elastic beanstalk 一起使用

    我一直在尝试在 AWS 上部署基于 Django 的问卷应用程序 就此而言 我对 AWS 和 Web 应用程序完全陌生 当我构建我的应用程序时 它在本地服务器上运行良好 我在 settings py 中使用了它 DATABASES defa
  • 在后台执行 Laravel/Symfony/Artisan 命令

    我需要在后台执行 Laravel 长时间运行的进程来使用 Twitter Streaming API 实际上 我需要运行的 php artisan CLI 命令是 nohup php artisan startStreaming gt de
  • 如何从 Django/postgreSQL 数据库中获取一个随机项目?

    所以我得到了database objects all 和database objects get name 但是我如何从数据库中获取一个随机项目 我无法弄清楚如何获得它并选择一个随机项目 从所有数据库对象的列表中选择随机元素并不是一个好的解
  • Sass 是连接而不是添加? [复制]

    这个问题在这里已经有答案了 我需要在 SCSS 代码中定义宽度 如下所示 example width currentWidth 349 important Where currentWidth由循环定义 然而 Sass 最终总是连接两个数字
  • Mac OSX:使用 dtruss?

    我正在尝试在 Mac OSX Catalina 中 dtruss 进程 但是 dtrace 报告错误 sudo dtruss whoami dtrace system integrity protection is on some feat
  • 如何调试 lxml.etree.XSLTParseError:无效的表达式错误

    我试图找出为什么 lxml 无法解析由带有各种内容的 根 文档组成的 XSL 文档xml includes 我收到错误 Traceback most recent call last File s py line 10 in
  • 使用 skimage 从多边形中提取图像片段

    我想获得通过剪切图像内的多边形而产生的子图像 我在 skimage 中有一个图像 在 matplotlib patches 中有一个多边形 怎么做 以下是我尝试过的 我不一定在寻找类似于下面的方法 我正在寻找最干净 最有效的实现 使用此代码