33#include <vigra/copyimage.hxx>
34#include <vigra/pixelneighborhood.hxx>
46 vigra::BImage line(
input.size());
48 vigra::copyImage(
input.upperLeft() + vigra::Diff2D(1, 1),
input.lowerRight() - vigra::Diff2D(1, 1),
input.accessor(),
edge.upperLeft(),
edge.accessor());
50 int width =
input.width(),
51 height =
input.height();
53 vigra::BImage::traverser
eul,
lul;
61 eul =
edge.upperLeft() + vigra::Diff2D(1, 1);
62 for(
int y=1; y<height-1; ++y, ++
eul.y )
64 vigra::BImage::traverser
ix =
eul;
65 for(
int x=1; x<width-1; ++x, ++
ix.x )
71 int nh = 0,
nv = 0, nu = 0,
nd = 0;
73 if(
ix( 1, -1 ) !=
N8_bg ) ++nu, ++
n;
77 if(
ix( -1, 1 ) !=
N8_bg ) ++nu, ++
n;
81 if(
nh == 1 &&
nv == 1 &&
n > 1 &&
n < 5 )
98 eul = (
edge.upperLeft() + vigra::Diff2D(1, 1));
99 lul = (line.upperLeft() + vigra::Diff2D(1, 1));
102 for(
int y=1; y<height-1; ++y, ++
eul.y, ++
lul.y)
104 vigra::BImage::traverser
ix =
eul;
105 vigra::BImage::traverser
ox =
lul;
106 for(
int x=1; x<width-1; ++x, ++
ix.x, ++
ox.x)
111 int nh = 0,
nv = 0, nu = 0,
nd = 0;
114 if(
ix( 1, -1 ) !=
N8_bg ) ++nu, ++
n;
118 if(
ix( -1, 1 ) !=
N8_bg ) ++nu, ++
n;
127 else if( nu )
code = 3;
135 else if( nu == 2 )
code = 3;
136 else if(
nv == 2 )
code = 5;
137 else if(
nd == 2 )
code = 7;
138 else if(
nh && nu )
code = 2;
140 else if(
nv && nu )
code = 4;
153 lul = (line.upperLeft() + vigra::Diff2D(1, 1));
155 for(
int y=1; y<height-1; ++y, ++
lul.y)
157 vigra::BImage::traverser
ix =
lul;
158 for(
int x=1; x<width-1; ++x, ++
ix.x )
165 vigra::NeighborhoodCirculator<vigra::BImage::traverser, vigra::EightNeighborCode>
195 lul = (line.upperLeft() + vigra::Diff2D(1, 1));
197 for(
int y=1; y<height-1; ++y, ++
lul.y)
199 vigra::BImage::traverser
ix =
lul;
200 for(
int x=1; x<width-1; ++x, ++
ix.x )
206 vigra::NeighborhoodCirculator<vigra::BImage::traverser, vigra::EightNeighborCode>
circulator(
ix);
207 vigra::NeighborhoodCirculator<vigra::BImage::traverser, vigra::EightNeighborCode> end(
circulator);
217 else if(
n == 1 ) *
ix = 1;
227 lul = (line.upperLeft() + vigra::Diff2D(1, 1));
228 eul = (
edge.upperLeft() + vigra::Diff2D(1, 1));
231 for(
int y=1; y<height-1; ++y, ++
lul.y, ++
eul.y )
233 vigra::BImage::traverser
ox =
eul;
234 vigra::BImage::traverser
ix =
lul;
235 for(
int x=1; x<width-1; ++x, ++
ix.x, ++
ox.x )
241 vigra::NeighborhoodCirculator<vigra::BImage::traverser, vigra::EightNeighborCode>
circulator(
ix);
242 vigra::NeighborhoodCirculator<vigra::BImage::traverser, vigra::EightNeighborCode> end(
circulator);
248 if( c == 1 &&
nc == 1 ) c = 0;
273 dx =
abs(dx); dy =
abs(dy);
274 return float(std::max(dx,dy)) +
float(0.41421 * std::min(dx,dy));
280 float x = dx, y = dy;
281 return sqrt( x*x + y*y );
287inline float scurv(vigra::Point2D & l, vigra::Point2D & m, vigra::Point2D & r)
296inline void vcurv(vigra::Point2D & l, vigra::Point2D & m, vigra::Point2D & r,
float &
vx,
float &
vy)
298 vx = 0.5 * (l.x + r.x) -
float( m.x );
299 vy = 0.5 * (l.y + r.y) -
float( m.y );
323 const double crcmin = 0.20;
325 const double cvrmax = 3.0;
335 double x0 =
pts.at(0).x,
337 double dx =
pts.at(
n-1).x -
x0,
362 double C =
r90 * (1 -
sqrt( 1 -
S *
S ));
399 static vigra::Diff2D
offs[8] = {
401 vigra::Diff2D(1, -1),
402 vigra::Diff2D(0, -1),
403 vigra::Diff2D(-1, -1),
404 vigra::Diff2D(-1, 0),
405 vigra::Diff2D(-1, 1),
412 const float maxacd = 2.0f;
416 int width = img.width(),
417 height = img.height();
418 double xcen = 0.5 * width,
422 vigra::BImage::traverser
ul(img.upperLeft() + vigra::Diff2D(1, 1));
423 for(
int y=1; y<height-1; ++y, ++
ul.y)
425 vigra::BImage::traverser
ix =
ul;
426 for(
int x=1; x<width-1; ++x, ++
ix.x )
432 vigra::BImage::traverser
tr =
ix;
433 vigra::Point2D
pos(x, y);
434 std::vector<vigra::Point2D>
pts;
468 std::vector<vigra::Point2D> tmp;
471 int xl =
pts.at( 0 ).x,
473 float dx =
pts.at(span-1).x -
xl,
474 dy =
pts.at(span-1).y -
yl;
490 for(
int i = 0;
i < span;
i++ )
492 tmp.push_back(vigra::Point2D(
pts.at(
i).x,
pts.at(
i).y));
533 lines.push_back(line);
550 lines.push_back(line);
557 lines.push_back(line);
declaration of find lines algorithm
void vcurv(vigra::Point2D &l, vigra::Point2D &m, vigra::Point2D &r, float &vx, float &vy)
static int lineFilter(std::vector< vigra::Point2D > &pts, int lmin, double flpix, double xcen, double ycen)
float ccdist(int dx, int dy)
vigra::BImage edgeMap2linePts(vigra::BImage &input)
marks line point
std::vector< SingleLine > Lines
vector of extracted lines from image
int linePts2lineList(vigra::BImage &img, int minsize, double flpix, Lines &lines)
converts a linePts image to a list of lines
float eudist(int dx, int dy)
float scurv(vigra::Point2D &l, vigra::Point2D &m, vigra::Point2D &r)
a single line extracted from image
std::vector< vigra::Point2D > line
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.