26#ifndef _NONA_STITCHER_H
27#define _NONA_STITCHER_H
30#include <vigra/windows.h>
39#include <vigra/stdimage.hxx>
40#include <vigra/rgbvalue.hxx>
41#include <vigra/tiff.hxx>
43#include <vigra/impex.hxx>
45#include <vigra/copyimage.hxx>
69template <
typename ImageType,
typename AlphaType>
86 const UIntSet & images,
const std::string & file,
103 std::vector<vigra::Rect2D>::iterator
itr =
m_rois.begin();
105 if (!
itr->isEmpty()) {
127 template<
typename ImageType,
typename AlphaType>
129 unsigned int imgNr,
unsigned int nImg,
131 const std::string& basename,
132 const bool useBigTIFF,
140 if (
remapped.boundingBox().isEmpty())
149 greyname << basename << std::setfill(
'0') << std::setw(4) << imgNr <<
"_gray.pgm";
153 alpha.resize(opts.
getROI().size());
161 vigra::exportImage(srcImageRange(alpha),
exinfo1);
171 progress->setMessage(
"Calculating mask");
180 alpha.resize(opts.
getROI().size());
203 std::ostringstream filename;
204 filename << basename << std::setfill(
'0') << std::setw(4) << imgNr <<
"." +
ext;
208 vigra::ImageExportInfo
exinfo(filename.str().c_str(), useBigTIFF ?
"w8" :
"w");
209 exinfo.setXResolution(150);
210 exinfo.setYResolution(150);
235 std::ostringstream quality;
236 quality <<
"JPEG QUALITY=" << opts.
quality;
237 exinfo.setCompression(quality.str().c_str());
254template <
typename ImageType,
typename AlphaType>
272 const std::string & basename,
291 for (UIntSet::const_iterator
it = images.begin();
292 it != images.end(); ++
it)
306 }
catch (vigra::PreconditionViolation & e) {
309 std::cerr << e.what();
327 unsigned int imgNr,
unsigned int nImg,
334 vigra::UInt16Image
xImg;
335 vigra::UInt16Image
yImg;
340 vigra::UInt16Image
dist;
343 vigra::copyImage(srcImageRange(
xImg),
350 exinfo.setXResolution(150);
351 exinfo.setYResolution(150);
353 vigra::exportImage(srcImageRange(
dist),
exinfo);
356 vigra::copyImage(srcImageRange(
yImg),
371 exinfo.setXResolution(150);
372 exinfo.setYResolution(150);
374 vigra::exportImage(srcImageRange(
xImg),
exinfo);
398template <
typename ImageType,
typename AlphaImageType>
417 DEBUG_DEBUG(
"Layering image into a multi image tif file " << filename);
425 unsigned int imgNr,
unsigned int nImg,
429 if (
remapped.boundingBox().isEmpty())
459template <
typename ImageType,
typename AlphaType>
474 const std::string & filename,
490 std::copy(
imgSet.begin(),
imgSet.end(), std::back_inserter(images));
496 for (UIntVector::const_iterator
it = images.begin();
it != images.end(); ++
it)
531 }
catch (vigra::PreconditionViolation & e) {
532 DEBUG_ERROR(
"exception during stitching" << e.what());
549 const std::string & filename,
555 std::string basename = filename;
565 std::transform(
cext.begin(),
cext.end(),
cext.begin(), (
int(*)(
int))std::tolower);
584 exinfo.setXResolution(150);
585 exinfo.setYResolution(150);
593 std::ostringstream quality;
594 quality <<
"JPEG QUALITY=" << opts.
quality;
595 exinfo.setCompression(quality.str().c_str());
599 exinfo.setPixelType(
"UINT8");
603 exinfo.setCanvasSize(pano.size());
608 exinfo.setPixelType(
"FLOAT");
609 vigra::exportImage(srcImageRange(pano),
exinfo);
636template<
class VALUETYPE>
641 typedef typename vigra::NumericTraits<argument_type>
Traits;
652 sum = vigra::NumericTraits<float_type>::zero();
656 template<
class T,
class M>
668 typedef typename std::vector<float_type>::const_iterator
Iter;
671 float_type error = vigra::NumericTraits<float_type>::zero();
673 error += vigra::abs(*
it-
mean);
688template <
typename ImageType,
typename AlphaType>
703 template <
class FUNCTOR>
705 const std::string & filename,
712 std::string basename = filename;
736 exinfo.setXResolution(150);
737 exinfo.setYResolution(150);
741 std::ostringstream quality;
742 quality <<
"JPEG QUALITY=" << opts.
quality;
743 exinfo.setCompression(quality.str().c_str());
744 vigra::exportImage(srcImageRange(pano),
exinfo);
750 vigra::exportImage(srcImageRange(pano),
exinfo);
767 vigra::triple<ImgIter, ImgIter, ImgAccessor> pano,
768 std::pair<AlphaIter, AlphaAccessor> alpha,
772 typedef typename vigra::NumericTraits<typename ImageType::value_type> Traits;
773 typedef typename AlphaAccessor::value_type MaskType;
778 typedef std::vector<RemappedPanoImage<ImageType, AlphaType> *>
RemappedVector;
789 for (UIntSet::const_iterator
it =
imgSet.begin();
803 vigra::Diff2D size = pano.second - pano.first;
807 for (
int y=0; y < size.y; y++) {
808 for (
int x=0; x < size.x; x++) {
811 for (
unsigned int i=0;
i<
nImg;
i++) {
818 pano.third.set(Traits::fromRealPromote(reduce()),
output, vigra::Diff2D(x,y));
819 alpha.second.set(
maskRes, alpha.first, vigra::Diff2D(x,y));
823 for (
typename RemappedVector::iterator
it=
remapped.begin();
836template <
typename ImageType,
typename AlphaType>
855 vigra::triple<ImgIter, ImgIter, ImgAccessor> pano,
856 std::pair<AlphaIter, AlphaAccessor> alpha,
869 for (UIntSet::reverse_iterator
it =
imgSet.rbegin();
886 }
catch (vigra::PreconditionViolation & e) {
889 std::cerr << e.what();
898 template <
class BlendFunctor>
900 const std::string & filename,
904 std::string basename = filename;
924 exinfo.setXResolution(150);
925 exinfo.setYResolution(150);
929 std::ostringstream quality;
930 quality <<
"JPEG QUALITY=" << opts.
quality;
931 exinfo.setCompression(quality.str().c_str());
932 vigra::exportImage(srcImageRange(pano),
exinfo);
934 exinfo.setCompression(
"DEFLATE");
968 vigra::triple<PanoIter, PanoIter, PanoAccessor> pano,
969 std::pair<AlphaIter, AlphaAccessor> alpha,
976 DEBUG_DEBUG(
"size of panorama: " << pano.second - pano.first);
979 vigra::Rect2D
fullPano(vigra::Size2D(pano.second-pano.first));
993template<
typename ImageType,
typename AlphaType>
997 const std::string & basename,
1040 DEBUG_ERROR(
"multi mask stitching not implemented!");
1057 const std::string & basename,
1067 const std::string & basename,
1075 const std::string & basename,
1084 const std::string & basename,
1092 const std::string & basename,
declaration of functions to handle stacks and layers
Contains functions to transform whole images.
Helper class for storing different options.
void setMessage(const std::string &message, const std::string &filename="")
sets the message to given string
void taskFinished()
call when a task has finished and the status message should be cleared
static std::vector< vigra::Rect2D > computeROIS(const PanoramaData &panorama, const PanoramaOptions &opts, const UIntSet &images)
functor to create a remapped image, loads image from disk
remap a set of images, and store the individual remapped files.
virtual void stitch(const PanoramaOptions &opts, const UIntSet &images, const std::string &basename, SingleImageRemapper< ImageType, AlphaType > &remapper, const AdvancedOptions &advOptions)
virtual void finalizeOutputFile(const PanoramaOptions &opts)
MultiImageRemapper(const PanoramaData &pano, AppBase::ProgressDisplay *progress)
virtual void saveRemapped(RemappedPanoImage< ImageType, AlphaType > &remapped, unsigned int imgNr, unsigned int nImg, const PanoramaOptions &opts, const AdvancedOptions &advOptions)
save a remapped image, or layer
virtual ~MultiImageRemapper()
Stitcher< ImageType, AlphaType > Base
virtual void prepareOutputFile(const PanoramaOptions &opts, const AdvancedOptions &advOptions)
prepare the output file (setup file structures etc.)
create a panorama using the reduce operation on all overlapping pixels.
ReduceStitcher(const PanoramaData &pano, AppBase::ProgressDisplay *progress)
Stitcher< ImageType, AlphaType > Base
void stitch(const PanoramaOptions &opts, const UIntSet &imgSet, vigra::triple< ImgIter, ImgIter, ImgAccessor > pano, std::pair< AlphaIter, AlphaAccessor > alpha, SingleImageRemapper< ImageType, AlphaType > &remapper, FUNCTOR &reduce)
virtual ~ReduceStitcher()
vigra::ImageImportInfo::ICCProfile iccProfile
void stitch(const PanoramaOptions &opts, const UIntSet &imgSet, const std::string &filename, SingleImageRemapper< ImageType, AlphaType > &remapper, FUNCTOR &reduce, const AdvancedOptions &advOptions)
struct to hold a image state for stitching
vigra::ImageImportInfo::ICCProfile m_ICCProfile
A stitcher without seaming, just copies the images over each other.
vigra::ImageExportInfo::ICCProfile iccProfile
Stitcher< ImageType, AlphaType > Base
SimpleStitcher(const PanoramaData &pano, AppBase::ProgressDisplay *progress)
void stitch(const PanoramaOptions &opts, const UIntSet &imgSet, const std::string &filename, SingleImageRemapper< ImageType, AlphaType > &remapper, BlendFunctor &blend)
virtual ~SimpleStitcher()
void stitch(const PanoramaOptions &opts, const UIntSet &imgSet, vigra::triple< ImgIter, ImgIter, ImgAccessor > pano, std::pair< AlphaIter, AlphaAccessor > alpha, SingleImageRemapper< ImageType, AlphaType > &remapper, BlendFunctor &blend)
functor to create a remapped image
void setAdvancedOptions(const HuginBase::Nona::AdvancedOptions advancedOptions)
virtual void release(RemappedPanoImage< ImageType, AlphaType > *d)=0
virtual RemappedPanoImage< ImageType, AlphaType > * getRemapped(const PanoramaData &pano, const PanoramaOptions &opts, unsigned int imgNr, vigra::Rect2D outputROI, AppBase::ProgressDisplay *progress)=0
create a remapped pano image.
implements a stitching algorithm
std::vector< vigra::Rect2D > m_rois
void init(const PanoramaOptions &opts, const UIntSet &images)
Stitcher(const PanoramaData &pano, AppBase::ProgressDisplay *progress)
create a stitcher for the given panorama
const PanoramaData & m_pano
virtual void calcOutputROIS(const PanoramaOptions &opts, const UIntSet &images)
virtual UIntSet getUsedImages()
AppBase::ProgressDisplay * m_progress
virtual void stitch(const PanoramaOptions &opts, const UIntSet &images, const std::string &file, SingleImageRemapper< ImageType, AlphaType > &remapper)
Stitch some images into a panorama file.
TiffMultiLayerRemapper(const PanoramaData &pano, AppBase::ProgressDisplay *progress)
virtual void finalizeOutputFile(const PanoramaOptions &opts)
close the tiff file
MultiImageRemapper< ImageType, AlphaImageType > Base
virtual void saveRemapped(RemappedPanoImage< ImageType, AlphaImageType > &remapped, unsigned int imgNr, unsigned int nImg, const PanoramaOptions &opts, const AdvancedOptions &advOptions)
save the remapped image in a partial tiff layer
vigra::TiffImage * m_tiff
virtual ~TiffMultiLayerRemapper()
virtual void prepareOutputFile(const PanoramaOptions &opts, const AdvancedOptions &advOptions)
prepare the output file (setup file structures etc.)
vigra::ImageImportInfo::ICCProfile GetICCProfile() const
void stitch(const PanoramaOptions &opts, const UIntSet &imgSet, const std::string &filename, SingleImageRemapper< ImageType, AlphaType > &remapper, const AdvancedOptions &advOptions)
WeightedStitcher(const PanoramaData &pano, AppBase::ProgressDisplay *progress)
vigra::ImageImportInfo::ICCProfile iccProfile
vigra::Rect2D GetPanoROI() const
virtual ~WeightedStitcher()
void stitch(const PanoramaOptions &opts, const UIntSet &imgSet, const std::string &filename, ImageType &panoImage, AlphaType &alpha, SingleImageRemapper< ImageType, AlphaType > &remapper, const AdvancedOptions &advOptions)
Stitcher< ImageType, AlphaType > Base
virtual const SrcPanoImage & getImage(std::size_t nr) const =0
get a panorama image, counting starts with 0
static const std::string & getFormatName(FileFormat f)
return string name of output file format
const std::string & getOutputExtension() const
return the extension used by the current output format
const vigra::Rect2D & getROI() const
unsigned int getWidth() const
std::string tiffCompression
std::string outputPixelType
unsigned int getHeight() const
get panorama height
unsigned int colorReferenceImage
vigra::Rect2D & boundingBox()
class AlphaIterator class AlphaAccessor inline void exportImageAlpha(ImageIterator image_upper_left, ImageIterator image_lower_right, ImageAccessor image_accessor, AlphaIterator alpha_upper_left, AlphaAccessor alpha_accessor, const ImageExportInfo &export_info)
vigra::FRGBImage ImageType
#define DEBUG_ASSERT(cond)
void saveRemapped(RemappedPanoImage< ImageType, AlphaType > &remapped, unsigned int imgNr, unsigned int nImg, const PanoramaOptions &opts, const std::string &basename, const bool useBigTIFF, AppBase::ProgressDisplay *progress)
void stitchPanoRGB_32_float(const PanoramaData &pano, const PanoramaOptions &opts, AppBase::ProgressDisplay *progress, const std::string &basename, const UIntSet &usedImgs, const char *pixelType, const AdvancedOptions &advOptions)
void stitchPanoGray_32_float(const PanoramaData &pano, const PanoramaOptions &opts, AppBase::ProgressDisplay *progress, const std::string &basename, const UIntSet &usedImgs, const char *pixelType, const AdvancedOptions &advOptions)
std::map< std::string, std::string > AdvancedOptions
void stitchPanorama(const PanoramaData &pano, const PanoramaOptions &opt, AppBase::ProgressDisplay *progress, const std::string &basename, const UIntSet &usedImgs, const AdvancedOptions &advOptions)
The main stitching function.
void stitchPanoRGB_8_16(const PanoramaData &pano, const PanoramaOptions &opts, AppBase::ProgressDisplay *progress, const std::string &basename, const UIntSet &usedImgs, const char *pixelType, const AdvancedOptions &advOptions)
static void stitchPanoIntern(const PanoramaData &pano, const PanoramaOptions &opts, AppBase::ProgressDisplay *progress, const std::string &basename, UIntSet imgs, const AdvancedOptions &advOptions)
bool GetAdvancedOption(const AdvancedOptions &opts, const std::string &name, const bool defaultValue)
check if given option is saved and return its boolean value, otherwise return defaultValue
void stitchPanoGray_8_16(const PanoramaData &pano, const PanoramaOptions &opts, AppBase::ProgressDisplay *progress, const std::string &basename, const UIntSet &usedImgs, const char *pixelType, const AdvancedOptions &advOptions)
mainly consists of wrapper around the pano tools library, to assist in ressource management and to pr...
std::vector< unsigned int > UIntVector
UIntVector getEstimatedBlendingOrder(const PanoramaData &pano, const UIntSet &images, const unsigned int referenceImage)
returns vector of image numbers for blending in approbiate order
std::set< unsigned int > UIntSet
std::string stripExtension(const std::string &basename2)
remove extension of a filename
std::string getExtension(const std::string &basename2)
Get extension of a filename.
std::string tolower(const std::string &s)
convert a string to lowercase
std::string stripPath(const std::string &filename)
remove the path of a filename (mainly useful for gui display of filenames)
void createTiffDirectory(vigra::TiffImage *tiff, const std::string &pagename, const std::string &documentname, const std::string comp, uint16_t page, uint16_t nImg, vigra::Diff2D offset, vigra::Size2D fullSize, const vigra::ImageExportInfo::ICCProfile &icc)
write a new Tiff directory, for a new layer
void createAlphaTiffImage(ImageIterator upperleft, ImageIterator lowerright, ImageAccessor a, AlphaIterator alphaUpperleft, AlphaAccessor alphaA, vigra::TiffImage *tiff)
void ConvertTo8Bit(ImageType &image)
converts to given image to fit into 0..255
vigra::pair< typename ROIImage< Image, Alpha >::mask_const_traverser, typename ROIImage< Image, Alpha >::MaskConstAccessor > srcMask(const ROIImage< Image, Alpha > &img)
vigra::triple< typename ROIImage< Image, Mask >::image_const_traverser, typename ROIImage< Image, Mask >::image_const_traverser, typename ROIImage< Image, Mask >::ImageConstAccessor > srcImageRange(const ROIImage< Image, Mask > &img)
helper function for ROIImages
vigra::triple< typename ROIImage< Image, Alpha >::mask_const_traverser, typename ROIImage< Image, Alpha >::mask_const_traverser, typename ROIImage< Image, Alpha >::MaskConstAccessor > srcMaskRange(const ROIImage< Image, Alpha > &img)
vigra::triple< ImgIter, ImgIter, ImgAcc > applyRect(vigra::Rect2D &r, vigra::triple< ImgIter, ImgIter, ImgAcc > img)
apply a roi to an image area
Difference reduce functor.
float_type operator()() const
return the result
Traits::RealPromote float_type
std::vector< float_type > values
vigra::NumericTraits< argument_type > Traits
ReduceToDifferenceFunctor()
blend images, by simply stacking them, without soft blending or boundary calculation
void operator()(RemappedPanoImage< ImageType, AlphaType > &img, vigra::triple< PanoIter, PanoIter, PanoAccessor > pano, std::pair< AlphaIter, AlphaAccessor > alpha, const vigra::Rect2D &panoROI)
blend img into pano, using alpha mask and panoROI
std::vector< deghosting::BImagePtr > threshold(const std::vector< deghosting::FImagePtr > &inputImages, const double threshold, const uint16_t flags)
Threshold function used for creating alpha masks for images.
Some functions to create tiff images with masks.