<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Hi Henry,</div><div class="gmail_quote"><br></div><div class="gmail_quote">A "flat file" is a file whose layout on disk is identical to the needed</div><div class="gmail_quote">layout of the data in memory.  A flat file can be "memory mapped"</div><div class="gmail_quote">so that data in the file can be accessed via a C/C++ pointer, even</div><div class="gmail_quote">without loading the whole file into memory.</div><div class="gmail_quote"><br></div><div class="gmail_quote">Memory mapping and flat files are not part of VTK, so you have</div><div class="gmail_quote">to create the flat file and memory-map it _before_ you pass the</div><div class="gmail_quote">memory pointer to VTK.  For more information on memory mapping,</div><div class="gmail_quote">see e.g. <a href="https://en.wikipedia.org/wiki/Memory-mapped_file">https://en.wikipedia.org/wiki/Memory-mapped_file</a></div><div class="gmail_quote"><br></div><div class="gmail_quote">As an example, here is how I use a flat file with VTK in Python,</div><div class="gmail_quote">in order to display a very large RGB image:</div><div class="gmail_quote"><br></div><div class="gmail_quote">    import mmap</div><div class="gmail_quote">    import vtk</div><div class="gmail_quote">    </div><div class="gmail_quote">    f = open("earth.21601x10801.bin","rb")</div><div class="gmail_quote">    memory = mmap.mmap(f.fileno(),0,mmap.MAP_PRIVATE,mmap.PROT_READ)</div><div class="gmail_quote">    </div><div class="gmail_quote">    importer = vtk.vtkImageImport()</div><div class="gmail_quote">    importer.SetImportVoidPointer(memory)</div><div class="gmail_quote">    importer.SetDataScalarTypeToUnsignedChar()</div><div class="gmail_quote">    importer.SetNumberOfScalarComponents(3)</div><div class="gmail_quote">    importer.SetDataExtent(0,21600,0,10800,0,0)</div><div class="gmail_quote">    importer.SetWholeExtent(0,21600,0,10800,0,0)</div><div class="gmail_quote">    importer.SetDataOrigin(0,0,0)</div><div class="gmail_quote">    importer.SetDataSpacing(1,1,1)</div><div class="gmail_quote">    </div><div class="gmail_quote">    reslice = vtkImageReslice()</div><div class="gmail_quote">    reslice.SetInputConnection(importer.GetOutputPort())</div><div class="gmail_quote">    # etcetera</div><div class="gmail_quote"><br></div><div class="gmail_quote">The same concept can be used in C++, you just need to store your</div><div class="gmail_quote">entire data set as a huge flat file, use "mmap" (or an equivalent</div><div class="gmail_quote">function) to map the file to memory, and then use vtkImageImport</div><div class="gmail_quote">to allow the VTK pipeline to use the file as virtual memory.</div><div class="gmail_quote"><br></div><div class="gmail_quote">My advice is to read as much as you can about memory mapping</div><div class="gmail_quote">and about how computers use virtual memory.  This will be very</div><div class="gmail_quote">useful knowledge if you are using a computer with limited memory.</div><div class="gmail_quote"><br></div><div class="gmail_quote"> - David</div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote"><br></div><div class="gmail_quote">On Fri, Nov 6, 2015 at 8:52 AM, Henry Blanco <span dir="ltr"><<a href="mailto:henry.blanco@cbiomed.cu" target="_blank">henry.blanco@cbiomed.cu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hello David, thanks for your help and sorry for the late reply, I've<br>
been absent for a couple of days.<br>
Well we're newbies on vtk, ... therefore it would nice if you give us<br>
more details on:<br>
1- How to create a flat file from several images. I guess we have to use<br>
some vtk classes, but we don't know which one.<br>
2- How to achieve the mapping from the flat file memory address to the<br>
vtkImageData.<br>
<br>
Thanks in advance,<br>
<br>
Henry<br>
<div class=""><div class="h5"><br>
On mar, 2015-11-03 at 11:03 -0700, David Gobbi wrote:<br>
> Hi Henry,<br>
><br>
><br>
> Please reply to the vtk list, not just to me.<br>
><br>
><br>
> You're requirement of rendering "thousands of medical images" is<br>
> way too vague.  Do you need to render them all simultaneously,<br>
> i.e. will they all be on screen at the same time?  I really do not<br>
> understand what you are trying to do.<br>
><br>
><br>
> The vtkImageDataStreamer will be no help to you, because it always<br>
> loads the entire volume.  It's job is to pull the data through the<br>
> pipeline<br>
> in small chunks, but the end result is still that the whole volume<br>
> ends<br>
> up in memory.<br>
><br>
><br>
> Yes, vtkImageReslice can show a sagittal or coronal view by only<br>
> streaming a small part of the volume into memory, but this will only<br>
> work with certain reader classes.  For example, the vtkTIFFReader<br>
> always reads entire slices, so it cannot read just one row of a<br>
> slice that vtkImageReslice can then incorporate into a sagittal view.<br>
> In fact, I think that only vtkImageReader2 can stream individual<br>
> rows or columns of an image from disk.  The other readers can<br>
> only stream the data slice-by-slice.<br>
><br>
><br>
> You should seriously consider my recommendation of using memory<br>
> mapping.  If you simply map a flat file to a memory address and then<br>
> use that memory address as a pixel data inside a vtkImageData, then<br>
> the operating system can make all the decisions about how and when<br>
> to load the data from disk.<br>
><br>
><br>
>  - David<br>
><br>
><br>
><br>
> On Tue, Nov 3, 2015 at 10:33 AM, Henry Blanco<br>
> <<a href="mailto:henry.blanco@cbiomed.cu">henry.blanco@cbiomed.cu</a>> wrote:<br>
>         Thanks David for your soon reply. Ok, my problem is to load<br>
>         and render thousands of medical images,<br>
>         organized into series, by using VTK, but considering strong<br>
>         limitations<br>
>         in terms of RAM (e.g., only 128 or 256 MB of RAM available).<br>
><br>
>         To achieve this task, we have tried to use the<br>
>         "vtkImageDataStreamer"<br>
>         class, but we have failed. This class seems to load the whole<br>
>         volume into<br>
>         memory, therefore loading 2000 CT images (1GB) into memory may<br>
>         fail if<br>
>         we consider just 128 MB of RAM.<br>
><br>
>         We are thinking to partition the whole volume into K blocks<br>
>         and to load<br>
>         a block of images into memory just when it's needed. The<br>
>         illusion of<br>
>         having the whole volume loaded in memory could be achieved by<br>
>         uploading/downloading one or more blocks of images to/from<br>
>         memory when<br>
>         needed. I'm wondering whether exist some vtk classes which can<br>
>         be used<br>
>         to picture a different view than the original (e.g., sagittal,<br>
>         coronal,<br>
>         or even oblique) without loading the whole volume of images.<br>
><br>
>         Henry<br>
><br>
>         On lun, 2015-11-02 at 17:29 -0700, David Gobbi wrote:<br>
>         > What kind of views will you need?  Do you just have to view<br>
>         the<br>
>         > original<br>
>         > slices?  If so, then the VTK pipeline's streaming will make<br>
>         the job<br>
>         > easy.<br>
>         > If you need orthogonal or oblique views, things are more<br>
>         difficult.<br>
>         > Also,<br>
>         > how is the data stored on disk?  If the whole volume is<br>
>         stored on disk<br>
>         > as a single flat file, then you can memory map the file.<br>
>         ><br>
>         ><br>
>         >  - David<br>
>         ><br>
>         > On Mon, Nov 2, 2015 at 4:10 PM, Henry Blanco<br>
>         <<a href="mailto:henry.blanco@cbiomed.cu">henry.blanco@cbiomed.cu</a>><br>
>         > wrote:<br>
>         >         Hello guys, I need some hints on how to render a<br>
>         large amount<br>
>         >         of images<br>
>         >         (e.g., thousands of images) using just few RAM<br>
>         resources<br>
>         >         (e.g., 128 MB)<br>
>         >         using the vtkImageReslice class for the whole<br>
>         volume.<br>
>         ><br>
>         >         Thanks in advance<br>
>         ><br>
>         >         Henry<br>
><br>
><br>
><br>
><br>
><br>
><br>
<br>
<br>
</div></div><div class=""><div class="h5">_______________________________________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=vtkusers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a><br>
</div></div></blockquote></div><br></div></div>