Another option - you can possibly embed your data in an hdf5 file, and then read / downsample the hdf5 file on demand based on your range settings. You can look at the "HDF5 big data" example in pyqtgraph.examples to see it done with a line plot. I am working on a similar problem, and will post an example if I get a good solution.
On Wednesday, October 31, 2018 at 8:19:07 PM UTC-6, Dennis Norton wrote: > > Thanks again for your response. > > I did think about creating a custom class which would have the attributes > ImageView is looking for, or just create a custom ImageView-esque class > which would handle a generator. > > I'll look into the array link you sent. > > Best regards. > > On Wed, Oct 31, 2018 at 7:32 PM Patrick <[email protected] > <javascript:>> wrote: > >> Hi Dennis, >> >> Yes, that makes sense now... and unfortunately I can't see an easy way to >> plumb that into the ImageView widget. An idea though, if you look at the >> code for ImageView ( >> http://www.pyqtgraph.org/documentation/_modules/pyqtgraph/imageview/ImageView.html#ImageView.setImage) >> >> the image provided does not strictly need to be an numpy array (just needs >> certain attributes), so perhaps you could make a shim class which >> extends/mimics a numpy ndarray, catching calls to these attributes and >> mapping to the appropriate disk image file. >> Of course, maybe someone has already made something like this... >> http://docs.dask.org/en/latest/array.html looks interesting, though I've >> never used it. >> >> Good luck! >> Patrick >> >> On Wednesday, 31 October 2018 10:59:55 UTC+10:30, Dennis Norton wrote: >>> >>> Thanks, Patrick. >>> >>> I should have been more explicit about what I was asking. The method >>> you outlined I was aware of. >>> >>> What I'm asking has to do if you have such a large number of files or a >>> single file that is so large it can't be (or is impractical to be) read >>> into memory. >>> >>> The idea I tried, and works thus far is to use a numpy memmap object. >>> >>> So imagine a file "VeryLargeImageFile.img", which consists of the binary >>> data of type unsigned integer (uint16). Let's say this was captured with a >>> camera of format frame shape (512,640), and there are 10,000 frames stored >>> in the file. >>> >>> fp = np.memmap('VeryLargeImageFile.img', dtype='unt16', mode='r', >>> offset=0, shape=(10000,512,640)) >>> >>> The variable can be passed to ImageView item by imv.setImage(fp). >>> >>> However, for 32-bit operating systems, fp would still be limited to 2Gb. >>> >>> So my real question is if there is a method to pass a generator which >>> reads a frame at a time to the ImageView or, if I had a large list of >>> binary files, could I create a generator which will cycle through reading >>> each file and return a numpy array of the data read for each file. >>> >>> Is what I'm asking making more sense, now? If not, let me know and I'll >>> try to clarify by uploading my current code. >>> >>> Thanks again. >>> >>> -Dennis >>> >>> On Mon, Oct 29, 2018 at 11:47 PM Patrick <[email protected]> wrote: >>> >>>> Hi, >>>> >>>> You can load images into numpy arrays (usable by ImageItem, ImageView >>>> etc) using the scipy.ndimage.imread function. I think it relies on having >>>> the Python Image Library (PIL) installed. A more modern version of that >>>> library is Pillow, which you could also use to load image data. >>>> >>>> Limitations are though that the ImageView expects each image to have >>>> the same dimensions. >>>> >>>> Simple modification of ImageView example to demonstrate (specify your >>>> image files on command line). >>>> >>>> #!/usr/bin/env python3 >>>> >>>> >>>> import numpy as np >>>> from pyqtgraph.Qt import QtCore, QtGui >>>> import pyqtgraph as pg >>>> from argparse import ArgumentParser >>>> from scipy.ndimage import imread >>>> >>>> argparser = ArgumentParser(description='Load images and display using >>>> pyqtgraph ImageView widget.') >>>> argparser.add_argument('input_images', help='Input filename(s) of >>>> images', nargs='+') >>>> args = argparser.parse_args() >>>> >>>> imagelist = [] >>>> for filename in args.input_images: >>>> print("Loading {}...".format(filename)) >>>> image = imread(filename) >>>> imagelist.append(image) >>>> print('Image shape: {}{}'.format(imagelist[len(imagelist)-1].shape, >>>> '' if imagelist[len(imagelist)-1].shape == imagelist[0].shape else ' *' >>>> )) >>>> data=np.stack([ i for i in imagelist if i.shape==imagelist[0].shape ], >>>> 0) >>>> if len(args.input_images) != data.shape[0]: >>>> print('Warning: Shape of all input files must match. Those marked >>>> with * are skipped.') >>>> >>>> # Interpret image data as row-major instead of col-major >>>> pg.setConfigOptions(imageAxisOrder='row-major') >>>> >>>> app = QtGui.QApplication([]) >>>> >>>> ## Create window with ImageView widget >>>> win = QtGui.QMainWindow() >>>> win.resize(800,800) >>>> imv = pg.ImageView() >>>> win.setCentralWidget(imv) >>>> win.show() >>>> win.setWindowTitle('pyqtgraph example: ImageView') >>>> >>>> ## Display the data >>>> imv.setImage(data) >>>> >>>> ## Set a custom color map >>>> colors = [ >>>> (0, 0, 0), >>>> (45, 5, 61), >>>> (84, 42, 55), >>>> (150, 87, 60), >>>> (208, 171, 141), >>>> (255, 255, 255) >>>> ] >>>> cmap = pg.ColorMap(pos=np.linspace(0.0, 1.0, 6), color=colors) >>>> imv.setColorMap(cmap) >>>> >>>> ## Start Qt event loop unless running in interactive mode. >>>> if __name__ == '__main__': >>>> import sys >>>> if (sys.flags.interactive != 1) or not hasattr(QtCore, >>>> 'PYQT_VERSION'): >>>> QtGui.QApplication.instance().exec_() >>>> >>>> >>>> >>>> >>>> On Monday, 29 October 2018 15:20:41 UTC+10:30, Dennis Norton wrote: >>>>> >>>>> I'm wondering if there is a convenient way to use the ImageView class >>>>> to display images either from a list of files in a directory or from a >>>>> large binary file consisting of multiple frames. >>>>> >>>>> Could we create a generator which yields the numpy arrays to display? >>>>> >>>>> Thanks. >>>>> >>>>> -- >>>> You received this message because you are subscribed to a topic in the >>>> Google Groups "pyqtgraph" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/pyqtgraph/1PuRof6NA5w/unsubscribe. >>>> To unsubscribe from this group and all its topics, send an email to >>>> [email protected]. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/pyqtgraph/d1681786-8d9c-4a97-a3b5-78f32223e481%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/pyqtgraph/d1681786-8d9c-4a97-a3b5-78f32223e481%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >>> -- >>> -Dennis >>> >>> >>> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "pyqtgraph" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/pyqtgraph/1PuRof6NA5w/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> [email protected] <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/pyqtgraph/4a8bb184-c59f-4bbc-ae0d-2c8138fc0f9b%40googlegroups.com >> >> <https://groups.google.com/d/msgid/pyqtgraph/4a8bb184-c59f-4bbc-ae0d-2c8138fc0f9b%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > > > -- > -Dennis > > > -- You received this message because you are subscribed to the Google Groups "pyqtgraph" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/pyqtgraph/c08e08ab-d60a-423a-9e1c-1cb865c29204%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
