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]> 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]. > 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/CA%2B5Jw8CZ3Ek3tgKU-V8PFjHnOHi6iZEkyZ6A37EA6iZuUFgVnA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
