Matplotlib imshow,基于缩放动态重采样

2024-01-23

我试图在 matplotlib 中复制 MATLAB imagesc() 调用的行为 - 具体来说: - 对于非常大的图像,减少图像 - 当用户放大时,以较少的抽取显示图像。

我已经编写了一个可以做到这一点的类,但我的解决方案似乎过于复杂。有人知道更好的方法吗?

提前致谢,

Brian


OP的回答,从问题中删除:

这是我的解决方案:

基本思想是:

  • 捕获 xlim_changed 或 ylim_changed 事件
  • 根据图像大小和所需的像素数计算所需的步幅
  • Draw

https://github.com/flailingsquirrel/cmake_scipy_ctypes_example/blob/master/src/python/FastImshow.py https://github.com/flailingsquirrel/cmake_scipy_ctypes_example/blob/master/src/python/FastImshow.py

#!/usr/bin/env python

'''
Fast Plotter for Large Images - Resamples Images to a target resolution on each zoom.
Example::
    sz = (10000,20000) # rows, cols
    buf = np.arange(sz[0]*sz[1]).reshape(sz)
    extent = (100,150,1000,2000)
    fig = plt.figure()
    ax  = fig.add_subplot(111)
    im = FastImshow(buf,extent,ax)
    im.show()
    plt.show()
'''

import numpy as np
import matplotlib.pyplot as plt


class FastImshow:
    '''
    Fast plotter for large image buffers
    Example::
        sz = (10000,20000) # rows, cols
        buf = np.arange(sz[0]*sz[1]).reshape(sz)
        extent = (100,150,1000,2000)
        fig = plt.figure()
        ax  = fig.add_subplot(111)
        im = FastImshow(buf,extent,ax)
        im.show()
        plt.show()
    '''
    def __init__(self,buf,ax,extent=None,tgt_res=512):
        '''
        [in] img buffer
        [in] extent
        [in] axis to plot on
        [in] tgt_res(default=512) : target resolution
        '''
        self.buf = buf
        self.sz = self.buf.shape
        self.tgt_res = tgt_res
        self.ax = ax

        # Members required to account for mapping extent to buf coordinates
        if extent:
            self.extent = extent
        else:
            self.extent = [ 0, self.sz[1], 0, self.sz[0] ]
        self.startx = self.extent[0]
        self.starty = self.extent[2]
        self.dx = self.sz[1] / (self.extent[1] - self.startx ) # extent dx
        self.dy = self.sz[0] / (self.extent[3] - self.starty ) # extent dy

    # end __init__

    def get_strides( self,xstart=0, xend=-1, ystart=0, yend=-1, tgt_res=512 ):
        '''
        Get sampling strides for a given bounding region. If none is provided,
           use the full buffer size
        '''
        # size = (rows,columns)
        if xend == -1:
            xend = self.sz[1]
        if yend == -1:
            yend = self.sz[0]
        if (xend-xstart) <= self.tgt_res:
            stridex = 1
        else:
            stridex = max(int((xend - xstart) / self.tgt_res),1)

        if (yend-ystart) <= self.tgt_res:
            stridey = 1
        else:
            stridey = max(int((yend - ystart) / self.tgt_res),1)

        return stridex,stridey
    # end get_strides

    def ax_update(self, ax):
        '''
        Event handler for re-plotting on zoom
        - gets bounds in img extent coordinates
        - converts to buffer coordinates
        - calculates appropriate strides
        - sets new data in the axis
        '''
        ax.set_autoscale_on(False)  # Otherwise, infinite loop

        # Get the range for the new area
        xstart, ystart, xdelta, ydelta = ax.viewLim.bounds
        xend = xstart + xdelta
        yend = ystart + ydelta

        xbin_start = int(self.dx * ( xstart - self.startx ))
        xbin_end   = int(self.dx * ( xend - self.startx ))
        ybin_start = int(self.dy * ( ystart - self.starty ))
        ybin_end   = int(self.dy * ( yend - self.starty ))

        # Update the image object with our new data and extent
        im = ax.images[-1]

        stridex,stridey = self.get_strides( xbin_start,xbin_end,ybin_start,ybin_end)

        im.set_data( self.buf[ybin_start:ybin_end:stridey,xbin_start:xbin_end:stridex] )

        im.set_extent((xstart, xend, ystart, yend))

        ax.figure.canvas.draw_idle()
    # end ax_update

    def show(self):
        '''
        Initial plotter for buffer
        '''
        stridex, stridey = self.get_strides()
        self.ax.imshow( buf[::stridex,::stridey],extent=self.extent,origin='lower',aspect='auto' )
        self.ax.figure.canvas.draw_idle() 

        self.ax.callbacks.connect('xlim_changed', self.ax_update)
        self.ax.callbacks.connect('ylim_changed', self.ax_update)
    # end show

# end ImgDisplay

if __name__=="__main__":
    sz = (10000,20000) # rows, cols
    buf = np.arange(sz[0]*sz[1]).reshape(sz)
    extent = (100,150,1000,2000)
    fig = plt.figure()
    ax  = fig.add_subplot(111)
    im = FastImshow(buf,ax,extent=extent,tgt_res=1024)
    im.show()

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

Matplotlib imshow,基于缩放动态重采样 的相关文章

随机推荐

  • 使用按钮打开另一个模块表单视图

    我正在尝试打开另一个模型表单视图 但收到错误外部 ID 未找到 在 py文件中 class ru assignments models Model name ru assignments class ru assignments sub m
  • 0022 和 022 之间的 umask 区别 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 umask 和 umask 有什么区别吗0022 and 022 我想将我的 umask 更改为022 我该怎么做 umask 没有区别0022和 u
  • 如何在 Azure 移动服务部署上使用最新的 npm

    我当前使用的 Azure 移动服务映像已锁定到 npm 版本 1 2 30 映像上安装了最新的 npm 版本 位于 Program Files x86 npm 下 但是 npm 被锁定到版本 1 2 30 因为它是与 node js 一起安
  • 当我想要存储从下拉列表中选择或用户输入的值时,数据库设计的最佳实践是什么?

    我正在尝试找到设计数据库的最佳方法 以便允许出现以下情况 向用户呈现大学的下拉列表 例如 用户从列表中选择他 她的大学 如果存在 如果该大学不存在 他应该在文本框中输入自己的大学 有点像其他 例如 考虑到我可能想使用大学 ID 进行排序 可
  • Tensorflowdynamic_rnn参数含义

    我正在努力理解神秘的 RNN 文档 任何有关以下内容的帮助将不胜感激 tf nn dynamic rnn cell inputs sequence length None initial state None dtype None para
  • 有构建 Xcode 4 插件的文档吗?

    最近我注意到几个项目github http github com通过插件扩展 Xcode 4 的功能 两个项目为例 olemoritz http twitter com olemoritz 迷你Xcode https github com
  • 当时间更改或结束时,Firefox 会在视频上触发“暂停”事件

    我在网站上嵌入了一个视频 但我在 Firefox 中遇到了一些奇怪的行为 每次我通过单击时间滑块更改播放位置时 pause事件被触发 同样 每次视频结束时pause事件被触发 甚至在ended event 我首先想知道我编写的一些JS是否有
  • 是否可以使用标准 android api 在屏幕上移动组件?

    我想制作一个android用户界面 允许用户移动添加components widgets通过选择它们然后拖动它们来在屏幕上移动 使用标准的 android api 可以吗 是的 这取决于您想要实现的目标 可以办到using标准 API 但此
  • 我需要打开哪些防火墙端口才能允许 Sinch 和 WebRTC 工作?

    Sinch 在互联网和各种 NAT 网络上运行得非常好 但我刚刚尝试了企业防火墙后面的设备 突然我们无法拨打电话 更具体地说 设备可以互相呼叫 但是当调用 onCallEstablished 时 音频流已连接 呼叫就会中断 听不到来自远端的
  • 防止渲染阻塞 CSS

    我有一个从 CDN 引用 Bootstrap 4 的网页 在里面head在我的 HTML 页面中 我有以下内容 这是我引用的唯一 CSS 然而 当我运行 Google 的 PageSpeed 工具时 出现以下错误 消除首屏内容中阻碍渲染的
  • 如何使用 JavaScript 按钮删除 gridview 上的一行并保留在同一页面上

    我正在通过 gridview 显示一组记录 并且edit and delete旁边的按钮 我在记录删除部分遇到问题 我想要的行为如下 用户单击按钮 调用 JavaScript 验证函数 单击按钮后记录将被删除 但用户与其余记录仍保留在同一页
  • 如何以编程方式操作 Windows 桌面图标位置?

    几年前 我天真地尝试编写一个小应用程序来保存我战术性放置的桌面图标 因为当某些事件重置它们时 我厌倦了将它们拖回原来的位置 在花费了太多时间未能找到一种方法来查询 更不用说保存和重置 我的图标的桌面位置后 我放弃了 有人知道 Windows
  • 如何使用 Rust 从 stdin 创建高效的字符迭代器?

    现在既然Read chars https doc rust lang org nightly std io trait Read html method chars迭代器已被正式弃用 https github com rust lang r
  • 如何从字符串中删除所有子字符串

    如何从字符串中删除该模式的所有实例 string str red tuna blue tuna black tuna one tuna string pattern tuna 从字符串中删除该模式的所有实例 include
  • java中抽象类和接口的最佳实践

    因此 您已经有了一个接口和一个实现接口中方法的子集的抽象类 您还拥有一些继承抽象类并提供抽象类未提供的方法的实现的类 那么这里的最佳实践是什么 我正在谈论这样的问题 1 抽象类应该实现接口还是它的子类 每节课都应该吗 在我看来 抽象类就应该
  • 将 MS Word 表格单元格提取为图像?

    我需要将表格单元格提取为图像 单元格可能包含混合内容 文本 图像 我需要将其合并为单个图像 我能够获得核心文本 但我不知道如何获得图像 文本 不确定 Apac POI 是否有帮助 之前有人做过类似的事情吗 public static voi
  • 使用 WPF 时的数据绑定问题

    我一直在努力学习Visual C 最近 我一直在关注WPF 这是我一直在制作的教程的链接 http msdn microsoft com en us library vstudio ms752299 v vs 110 aspx http m
  • JavaScript 加载顺序导致问题

    我在标头中有一个 JS 文件 这是用于 Google DFP 的 在 我发现如果头 JS 文件没有在底部文件之前加载 我会在 Chrome 控制台中收到此错误 Uncaught TypeError Object has no method
  • SQL Server - 缺少 NATURAL JOIN / x JOIN y USING(字段)

    我刚刚阅读了 NATURAL JOIN USING SQL92 功能 这些功能 遗憾的是 在 SQL Server 当前的功能中缺失了 有没有人从支持这些的 DBMS 转到 SQL Server 或其他不支持的 DBMS 它们是否像听起来那
  • Matplotlib imshow,基于缩放动态重采样

    我试图在 matplotlib 中复制 MATLAB imagesc 调用的行为 具体来说 对于非常大的图像 减少图像 当用户放大时 以较少的抽取显示图像 我已经编写了一个可以做到这一点的类 但我的解决方案似乎过于复杂 有人知道更好的方法吗