[ VIGRA Homepage | Class Index | Function Index | File Index | Main Page ]

details vigra/multi_impex.hxx VIGRA

00001 /************************************************************************/
00002 /*                                                                      */
00003 /*               Copyright 2003 by Gunnar Kedenburg                     */
00004 /*       Cognitive Systems Group, University of Hamburg, Germany        */
00005 /*                                                                      */
00006 /*    This file is part of the VIGRA computer vision library.           */
00007 /*    ( Version 1.4.0, Dec 21 2005 )                                    */
00008 /*    The VIGRA Website is                                              */
00009 /*        http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/      */
00010 /*    Please direct questions, bug reports, and contributions to        */
00011 /*        koethe@informatik.uni-hamburg.de          or                  */
00012 /*        vigra@kogs1.informatik.uni-hamburg.de                         */
00013 /*                                                                      */
00014 /*    Permission is hereby granted, free of charge, to any person       */
00015 /*    obtaining a copy of this software and associated documentation    */
00016 /*    files (the "Software"), to deal in the Software without           */
00017 /*    restriction, including without limitation the rights to use,      */
00018 /*    copy, modify, merge, publish, distribute, sublicense, and/or      */
00019 /*    sell copies of the Software, and to permit persons to whom the    */
00020 /*    Software is furnished to do so, subject to the following          */
00021 /*    conditions:                                                       */
00022 /*                                                                      */
00023 /*    The above copyright notice and this permission notice shall be    */
00024 /*    included in all copies or substantial portions of the             */
00025 /*    Software.                                                         */
00026 /*                                                                      */
00027 /*    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND    */
00028 /*    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES   */
00029 /*    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND          */
00030 /*    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT       */
00031 /*    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,      */
00032 /*    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING      */
00033 /*    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR     */
00034 /*    OTHER DEALINGS IN THE SOFTWARE.                                   */                
00035 /*                                                                      */
00036 /************************************************************************/
00037 
00038 
00039 #ifndef VIGRA_MULTI_IMPEX_HXX
00040 #define VIGRA_MULTI_IMPEX_HXX
00041 
00042 #include <memory>
00043 #include <iomanip>
00044 #include <sstream>
00045 #include <iostream>
00046 #include <string>
00047 #include "vigra/basicimageview.hxx"
00048 #include "vigra/impex.hxx"
00049 #include "vigra/multi_array.hxx"
00050 
00051 namespace vigra {
00052 
00053 void findImageSequence(const std::string &name_base,
00054                        const std::string &name_ext,
00055                        std::vector<std::string> & numbers);
00056                        
00057 /** \addtogroup VolumeImpex Import/export of volume data.
00058 */
00059 
00060 //@{
00061 
00062 /********************************************************/
00063 /*                                                      */
00064 /*                    importVolume                      */
00065 /*                                                      */
00066 /********************************************************/
00067 
00068 /** \brief Function for importing a 3D volume.
00069 
00070     The data are expected to be stored in a by-slice manner,
00071     where the slices are enumerated from <tt>name_base+"[0-9]+"+name_ext</tt>.
00072     <tt>name_base</tt> may contain a path. All slice files with the same name base and 
00073     extension are considered part of the same volume. Slice numbers must be non-negative,
00074     but can otherwise start anywhere and need not be successive. Slices will be read 
00075     in ascending numerical (not lexicographic) order. All slices must have the 
00076     same size. The <tt>volume</tt> will be reshaped to match the count and 
00077     size of the slices found. 
00078 
00079     <b>\#include</b>
00080     "<a href="multi__impex_8hxx-source.html">vigra/multi_impex.hxx</a>"
00081 
00082     Namespace: vigra
00083 */
00084 template <class T, class Allocator>
00085 void importVolume (MultiArray <3, T, Allocator> & volume,
00086                    const std::string &name_base,
00087                    const std::string &name_ext)
00088 {
00089     std::vector<std::string> numbers;
00090     findImageSequence(name_base, name_ext, numbers);
00091     
00092     std::string message("importVolume(): No files matching '");
00093     message += name_base + "[0-9]+" + name_ext + "' found.";
00094     vigra_precondition(numbers.size() > 0, message.c_str());
00095           
00096     for (unsigned int i = 0; i < numbers.size(); ++i) 
00097     {
00098         // build the filename
00099         std::string name = name_base + numbers[i] + name_ext;
00100 
00101         // import the image
00102         ImageImportInfo info (name.c_str ());
00103         
00104         // reshape the array according to size of first image
00105         if(i == 0)
00106         {
00107             typedef typename MultiArray <3, T>::difference_type Size;
00108             volume.reshape(Size(info.width(), info.height(), numbers.size()));
00109         }
00110 
00111         // generate a basic image view to the current layer
00112         MultiArrayView <2, T> array_view (volume.bindOuter (i));
00113         BasicImageView <T> view = makeBasicImageView (array_view);
00114         vigra_precondition(view.size() == info.size(),
00115             "importVolume(): image size mismatch.");
00116             
00117         importImage (info, destImage(view));
00118     }
00119 }
00120 
00121 
00122 /********************************************************/
00123 /*                                                      */
00124 /*                    exportVolume                      */
00125 /*                                                      */
00126 /********************************************************/
00127 
00128 /** \brief Function for exporting a 3D volume.
00129 
00130     The volume is exported in a by-slice manner, where the number of slices equals
00131     the depth of the volume. The file names will be enumerated like 
00132     <tt>name_base+"000"+name_ext</tt>, <tt>name_base+"001"+name_ext</tt> etc.
00133     (the actual number of zeros depends on the depth).
00134 
00135     <b>\#include</b>
00136     "<a href="multi__impex_8hxx-source.html">vigra/multi_impex.hxx</a>"
00137 
00138     Namespace: vigra
00139 */
00140 template <class T, class Tag>
00141 void exportVolume (MultiArrayView <3, T, Tag> const & volume,
00142                    const std::string &name_base,
00143                    const std::string &name_ext)
00144 {
00145     
00146     const unsigned int depth = volume.shape (2);
00147     int numlen = static_cast <int> (std::ceil (std::log10 ((double)depth)));
00148     for (unsigned int i = 0; i < depth; ++i) 
00149     {
00150 
00151         // build the filename
00152         std::stringstream stream;
00153         stream << std::setfill ('0') << std::setw (numlen) << i;
00154         std::string name_num;
00155         stream >> name_num;
00156         std::string name = name_base + name_num + name_ext;
00157 
00158         // generate a basic image view to the current layer
00159         MultiArrayView <2, T, Tag> array_view (volume.bindOuter (i));
00160         BasicImageView <T> view = makeBasicImageView (array_view);
00161 
00162         // import the image
00163         ImageExportInfo info (name.c_str ());
00164         exportImage (srcImageRange(view), info);
00165     }
00166 }
00167 
00168 //@}
00169 
00170 } // namespace vigra
00171 
00172 #endif // VIGRA_MULTI_IMPEX_HXX

© Ullrich Köthe (koethe@informatik.uni-hamburg.de)
Cognitive Systems Group, University of Hamburg, Germany

html generated using doxygen and Python
VIGRA 1.4.0 (21 Dec 2005)