Hugin trunk 0.1
Loading...
Searching...
No Matches
threshold.h
Go to the documentation of this file.
1
21#include <vector>
22
23#include <vigra/stdimage.hxx>
24#include <vigra/transformimage.hxx>
25
26#include "deghosting.h"
27
30
41std::vector<deghosting::BImagePtr> threshold(const std::vector<deghosting::FImagePtr> &inputImages, const double threshold, const uint16_t flags) {
42 std::vector<deghosting::BImagePtr> retVal;
43 const uint8_t minValue = 0;
44 const uint8_t maxValue = 255;
45
46 // don't care about masking
48 for (unsigned int i=0; i < inputImages.size(); ++i) {
49 deghosting::BImagePtr tmpImg(new vigra::BImage(inputImages[i]->size()));
50 vigra::transformImage(vigra::srcImageRange(*tmpImg), vigra::destImage(*tmpImg),
51 vigra::Threshold<vigra::FImage::PixelType, vigra::BImage::PixelType>(threshold, 255, 0, 255));
52 retVal.push_back(tmpImg);
53 }
54 return retVal;
55 }
56
57 // arrays with iterators
58 std::vector<vigra::FImage::traverser> siterators(inputImages.size());
59 std::vector<vigra::BImage::traverser> diterators(inputImages.size());
60 // iterator to the end
61 vigra::FImage::traverser send = inputImages[0]->lowerRight();
62 // fill iterators and retVal
63 for (unsigned int i=0; i < inputImages.size(); ++i) {
64 // fill retVal
65 deghosting::BImagePtr tmpImg(new vigra::BImage(inputImages[i]->size()));
66 retVal.push_back(tmpImg);
67 // fill iterators
68 siterators[i] = inputImages[i]->upperLeft();
69 diterators[i] = retVal[i]->upperLeft();
70 }
71
72 // leave pixels not masked in at least one image
73 // this is DEFAULT
74 // loop over row
75 while (siterators[0].y != send.y) {
76 // array with column iterators
77 std::vector<vigra::FImage::traverser> siteratorsX(inputImages.size());
78 std::vector<vigra::BImage::traverser> diteratorsX(inputImages.size());
79 for (unsigned int i=0; i < inputImages.size(); ++i) {
82 }
83 // now we can loop over the same pixels in all images at once
84 while (siteratorsX[0].x != send.x) {
85 // image with highest weight for the pixel
86 unsigned int highestI = 0;
87 for (unsigned int i=0; i<inputImages.size(); ++i) {
88 // apply threshold
89 if (*(siteratorsX[i]) < threshold)
90 *(diteratorsX[i]) = minValue;
91 else
92 *(diteratorsX[i]) = maxValue;
93 // highest search
95 }
96 // set the highest one to maxValue;
97 *(diteratorsX[highestI]) = maxValue;
98
99 // move all iterators by one pixel to the right
100 for (unsigned int i=0; i<inputImages.size(); ++i) {
101 ++siteratorsX[i].x;
102 ++diteratorsX[i].x;
103 }
104 }
105 // move all iterators to the next row
106 for (unsigned int i=0; i<inputImages.size(); ++i) {
107 ++siterators[i].y;
108 ++diterators[i].y;
109 }
110 }
111
112 return retVal;
113}
static uint16_t flags
std::shared_ptr< vigra::BImage > BImagePtr
Definition deghosting.h:45
const uint16_t THRESHOLD_DONTCARE
Definition threshold.h:29
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.
Definition threshold.h:41
const uint16_t ONE_UNMASKED
Advanced threshold Copyright (C) 2009 Lukáš Jirkovský l.jirkovsky@gmail.com
Definition threshold.h:28