tabula-extractor 0.6.6-java → 0.7.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS.md +1 -0
  3. data/README.md +27 -11
  4. data/bin/tabula +61 -19
  5. data/ext/liblsd-linux32.so +0 -0
  6. data/ext/liblsd-linux64.so +0 -0
  7. data/ext/liblsd.dll +0 -0
  8. data/ext/liblsd.dylib +0 -0
  9. data/ext/liblsd64.dll +0 -0
  10. data/ext/lsd.c +137 -137
  11. data/ext/lsd.h +9 -9
  12. data/lib/tabula.rb +20 -3
  13. data/lib/tabula/core_ext.rb +261 -0
  14. data/lib/tabula/entities.rb +11 -456
  15. data/lib/tabula/entities/cell.rb +42 -0
  16. data/lib/tabula/entities/has_cells.rb +244 -0
  17. data/lib/tabula/entities/line.rb +39 -0
  18. data/lib/tabula/entities/page.rb +269 -0
  19. data/lib/tabula/entities/page_area.rb +7 -0
  20. data/lib/tabula/entities/ruling.rb +300 -0
  21. data/lib/tabula/entities/spreadsheet.rb +92 -0
  22. data/lib/tabula/entities/table.rb +81 -0
  23. data/lib/tabula/entities/text_chunk.rb +114 -0
  24. data/lib/tabula/entities/text_element.rb +112 -0
  25. data/lib/tabula/entities/zone_entity.rb +57 -0
  26. data/lib/tabula/extraction.rb +327 -0
  27. data/lib/tabula/line_segment_detector.rb +9 -7
  28. data/lib/tabula/pdf_line_extractor.rb +319 -0
  29. data/lib/tabula/pdf_render.rb +1 -5
  30. data/lib/tabula/spreadsheet_extractor.rb +52 -0
  31. data/lib/tabula/table_extractor.rb +50 -348
  32. data/lib/tabula/table_guesser.rb +21 -23
  33. data/lib/tabula/version.rb +1 -1
  34. data/lib/tabula/writers.rb +5 -6
  35. data/tabula-extractor.gemspec +1 -0
  36. data/target/pdfbox-app-2.0.0-SNAPSHOT.jar +0 -0
  37. data/test/data/47008204D_USA.page4.pdf +0 -0
  38. data/test/data/560015757GV_China.page1.pdf +0 -0
  39. data/test/data/GSK_2012_Q4.page437.pdf +0 -0
  40. data/test/data/S2MNCEbirdisland.pdf +0 -0
  41. data/test/data/campaign_donors.pdf +0 -0
  42. data/test/data/frx_2012_disclosure.tsv +88 -0
  43. data/test/data/no_tables.pdf +0 -0
  44. data/test/data/puertos1.pdf +0 -0
  45. data/test/data/spanning_cells.csv +21 -0
  46. data/test/data/spanning_cells.pdf +0 -0
  47. data/test/data/strongschools.pdf +0 -0
  48. data/{vertical_rulings_bug.pdf → test/data/vertical_rulings_bug.pdf} +0 -0
  49. data/test/data/vietnam3.pdf +0 -0
  50. data/test/heuristic-test-set/original/560015757GV_China.page1.pdf +0 -0
  51. data/test/heuristic-test-set/original/S2MNCEbirdisland.pdf +0 -0
  52. data/test/heuristic-test-set/original/bo_page24.pdf +0 -0
  53. data/test/heuristic-test-set/original/campaign_donors.pdf +0 -0
  54. data/test/heuristic-test-set/spreadsheet/47008204D_USA.page4.pdf +0 -0
  55. data/test/heuristic-test-set/spreadsheet/GSK_2012_Q4.page437.pdf +0 -0
  56. data/test/heuristic-test-set/spreadsheet/strongschools.pdf +0 -0
  57. data/test/heuristic-test-set/spreadsheet/tabla_subsidios.pdf +0 -0
  58. data/test/heuristic.rb +50 -0
  59. data/test/test_bin_tabula.sh +7 -0
  60. data/test/tests.rb +476 -63
  61. metadata +79 -28
  62. data/lib/geom/point.rb +0 -21
  63. data/lib/geom/rectangle.rb +0 -101
  64. data/lib/geom/segment.rb +0 -82
  65. data/lib/tabula/pdf_dump.rb +0 -132
  66. data/lib/tabula/whitespace.rb +0 -50
  67. data/vertical_rulings_bug.rb +0 -29
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fa69052647e565cd996f92f1c73e6d00deceea54
4
+ data.tar.gz: 7d76ccc9b445e9138f65920cd0a401fbee3ababf
5
+ SHA512:
6
+ metadata.gz: d17ad7e967407711d60d9b30e8d231ab9adef313b8ede84e1960e35f24c5374f472a500e7f7148cc485408f796f1d7a67e96393d0fc5331e0f3f88971dad76c4
7
+ data.tar.gz: 84121390715280e86fb3ff1dd82533863dfabbb0b27582fb0d3bf9ad088f8d05e4c8f7dfbcfd2f621c232accd6145968e263a4e0e081431cf941939974999b20
data/AUTHORS.md CHANGED
@@ -13,3 +13,4 @@ Special thanks to these organizations:
13
13
  * Knight-Mozilla OpenNews <http://www.mozillaopennews.org/>
14
14
  * ProPublica <http://propublica.org>
15
15
  * La Nación <http://www.lanacion.com.ar>
16
+ * The New York Times <http://www.nytimes.com>
data/README.md CHANGED
@@ -17,25 +17,41 @@ jruby -S gem install tabula-extractor
17
17
  ## Usage
18
18
 
19
19
  ```
20
- $ tabula --help
21
20
  Tabula helps you extract tables from PDFs
22
21
 
23
22
  Usage:
24
23
  tabula [options] <pdf_file>
25
24
  where [options] are:
26
- --page, -p <i>: Page number (default: 1)
27
- --area, -a <s>: Portion of the page to analyze (top, left, bottom,
28
- right). Example: --area '269.875, 12.75, 790.5, 561'.
29
- Default is entire page
30
- --format, -f <s>: Output format (CSV,TSV,HTML,JSON) (default: CSV)
31
- --outfile, -o <s>: Write output to <file> instead of STDOUT (default: -)
32
- --version, -v: Print version and exit
33
- --help, -h: Show this message
25
+ Tabula helps you extract tables from PDFs
26
+ --pages, -p <s>: Comma separated list of ranges. Examples: --pages
27
+ 1-3,5-7 or --pages 3. Default is --pages 1 (default:
28
+ 1)
29
+ --area, -a <s>: Portion of the page to analyze
30
+ (top,left,bottom,right). Example: --area
31
+ 269.875,12.75,790.5,561. Default is entire page
32
+ --columns, -c <s>: X coordinates of column boundaries. Example --columns
33
+ 10.1,20.2,30.3
34
+ --password, -s <s>: Password to decrypt document. Default is empty
35
+ (default: )
36
+ --guess, -g: Guess the portion of the page to analyze per page.
37
+ --debug, -d: Print detected table areas instead of processing.
38
+ --format, -f <s>: Output format (CSV,TSV,HTML,JSON) (default: CSV)
39
+ --outfile, -o <s>: Write output to <file> instead of STDOUT (default: -)
40
+ --spreadsheet, -r: Force PDF to be extracted using spreadsheet-style
41
+ extraction (if there are ruling lines separating each
42
+ cell, as in a PDF of an Excel spreadsheet)
43
+ --no-spreadsheet, -n: Force PDF not to be extracted using spreadsheet-style
44
+ extraction (if there are ruling lines separating each
45
+ cell, as in a PDF of an Excel spreadsheet)
46
+ --silent, -i: Suppress all stderr output.
47
+ --version, -v: Print version and exit
48
+ --help, -h: Show this message
34
49
  ```
35
50
 
36
- Want to integrate `tabula-extractor` into your own application? We don't have docs yet, but [the tests](test/tests.rb) are a good source of information.
51
+ ## Scripting examples
52
+
53
+ `tabula-extractor` is a RubyGem that you can use to programmatically extract tabular data, using the Tabula engine, in your scripts or applications. We don't have docs yet, but [the tests](test/tests.rb) are a good source of information.
37
54
 
38
55
  ## Notes
39
56
 
40
57
  `tabula-extractor` uses [LSD: a Line Segment Detector](http://www.ipol.im/pub/art/2012/gjmr-lsd/) by Rafael Grompone von Gioi, Jérémie Jakubowicz, Jean-Michel Morel and Gregory Randall.
41
-
data/bin/tabula CHANGED
@@ -34,11 +34,20 @@ EOS
34
34
 
35
35
  opt :pages, 'Comma separated list of ranges. Examples: --pages 1-3,5-7 or --pages 3. Default is --pages 1', :default => '1', :type => String
36
36
  opt :area, 'Portion of the page to analyze (top,left,bottom,right). Example: --area 269.875,12.75,790.5,561. Default is entire page', :type => String, :default => nil
37
+ opt :columns, 'X coordinates of column boundaries. Example --columns 10.1,20.2,30.3', :default => nil, :type => String
37
38
  opt :password, 'Password to decrypt document. Default is empty', :default => ''
38
- opt :guess, 'Guess the portion of the page to analyze per page. Slow.'
39
+ opt :guess, 'Guess the portion of the page to analyze per page.'
39
40
  opt :debug, 'Print detected table areas instead of processing.'
40
41
  opt :format, "Output format (#{FORMATS.join(",")})", :default => 'CSV'
41
42
  opt :outfile, 'Write output to <file> instead of STDOUT', :default => '-'
43
+ opt :spreadsheet, "Force PDF to be extracted using spreadsheet-style extraction (if there are ruling lines separating each cell, as in a PDF of an Excel spreadsheet)"
44
+ opt :no_spreadsheet, "Force PDF not to be extracted using spreadsheet-style extraction (if there are ruling lines separating each cell, as in a PDF of an Excel spreadsheet)"
45
+ opt :silent, 'Suppress all stderr output.'
46
+ end
47
+
48
+ if !opts[:columns].nil?
49
+ c = opts[:columns].split(',')
50
+ Trollop::die :columns, "is invalid" unless c.all? { |x| x.strip =~ /(\d+\.?\d*)/ }
42
51
  end
43
52
 
44
53
  if !opts[:area].nil?
@@ -56,31 +65,64 @@ EOS
56
65
  return opts, pdf_filename
57
66
  end
58
67
 
68
+ def rulings_from_columns(page, area, vertical_rulings)
69
+ top = area.nil? ? page.top : area.top
70
+ vertical_rulings.map do |vr|
71
+ Tabula::Ruling.new(top, vr, 0, page.height)
72
+ end
73
+ end
74
+
75
+ def heuristic_to_decide_whether_to_use_spreadsheet_extraction
76
+ false #TODO
77
+ end
78
+
59
79
  def main
60
80
  opts, filename = parse_command_line
61
81
 
62
- area = opts[:area].nil? ? nil : opts[:area].split(',').map(&:to_f)
63
- out = opts[:outfile] == '-' ? $stdout : File.new(opts[:outfile], 'w')
64
- extractor = Tabula::Extraction::CharacterExtractor.new(filename, parse_pages_arg(opts[:pages]), opts[:password])
65
- extractor.extract.each_with_index do |page, page_index|
66
- if opts[:guess]
67
- lines = Tabula::Ruling::clean_rulings(Tabula::LSD::detect_lines_in_pdf_page(filename, page_index))
68
- page_areas = Tabula::TableGuesser::find_rects_from_lines(lines)
69
- page_areas.map!{|rect| rect.dims(:top, :left, :bottom, :right)}
70
- else
71
- page_areas = [area]
82
+ area_input = opts[:area].nil? ? nil : opts[:area].split(',').map(&:to_f)
83
+ vertical_rulings = opts[:columns].nil? ? nil : opts[:columns].split(',').map(&:to_f)
84
+ out = opts[:outfile] == '-' ? $stdout : File.new(opts[:outfile], 'wb')
85
+
86
+ use_spreadsheet_extraction = if opts[:spreadsheet]
87
+ true
88
+ elsif opts[:no_spreadsheet] || opts[:columns] || opts[:area] || opts[:guess]
89
+ false
90
+ else
91
+ nil
92
+ end
93
+ extractor = Tabula::Extraction::ObjectExtractor.new(filename, parse_pages_arg(opts[:pages]), opts[:password])
94
+ extractor.extract.each_with_index do |pdf_page, page_index|
95
+
96
+ #do the heuristic here
97
+ if use_spreadsheet_extraction.nil?
98
+ use_spreadsheet_extraction = pdf_page.is_tabular?
99
+ #TODO: tell the user what we're doing, so they can force the other way.
100
+ STDERR.puts "Using #{use_spreadsheet_extraction ? "spreadsheet": "no_spreadsheet"} extraction method.\n" +
101
+ "If the output looks wrong, re-run tabula with the #{use_spreadsheet_extraction ? "--no-spreadsheet": "--spreadsheet"} switch." unless opts[:silent]
72
102
  end
73
103
 
74
- page_areas.each do |page_area|
75
- if opts[:guess] && opts[:debug]
76
- puts (page_index + 1).to_s + ', ' + page_area.to_s
104
+ if use_spreadsheet_extraction
105
+ if opts[:debug]
106
+ pdf_page.spreadsheets.each do |spreadsheet|
107
+ STDERR.puts "Page #{pdf_page.number(:one_indexed)}: #{spreadsheet.dims(:top, :left, :bottom, :right)}"
108
+ end
109
+ end
110
+ tables = pdf_page.spreadsheets.map(&:rows)
111
+ else
112
+ STDERR.puts "Page #{pdf_page.number(:one_indexed)}: #{page_area.to_s}" if opts[:debug]
113
+ if opts[:guess]
114
+ page_areas = pdf_page.spreadsheets.map{|rect| pdf_page.get_area(rect.dims(:top, :left, :bottom, :right))}
115
+ elsif area_input
116
+ page_areas = [pdf_page.get_area(area_input)]
77
117
  else
78
- text = page.get_text( page_area )
79
- Tabula::Writers.send(opts[:format].to_sym,
80
- Tabula.make_table(text),
81
- out)
118
+ page_areas = [pdf_page]
82
119
  end
83
-
120
+ tables = page_areas.map{|page_area| page_area.make_table(vertical_rulings.nil? ? {} : { :vertical_rulings => rulings_from_columns(pdf_page, page_area, vertical_rulings) })}
121
+ end
122
+ tables.each do |table|
123
+ Tabula::Writers.send(opts[:format].to_sym,
124
+ table,
125
+ out)
84
126
  end
85
127
  end
86
128
  out.close
Binary file
Binary file
data/ext/liblsd.dll CHANGED
Binary file
data/ext/liblsd.dylib CHANGED
Binary file
data/ext/liblsd64.dll CHANGED
Binary file
data/ext/lsd.c CHANGED
@@ -189,9 +189,9 @@ static void error(char * msg)
189
189
  should be related to the cumulated rounding error in the chain of
190
190
  computation. Here, as a simplification, a fixed factor is used.
191
191
  */
192
- static int double_equal(double a, double b)
192
+ static int double_equal(float a, float b)
193
193
  {
194
- double abs_diff,aa,bb,abs_max;
194
+ float abs_diff,aa,bb,abs_max;
195
195
 
196
196
  /* trivial case */
197
197
  if( a == b ) return TRUE;
@@ -215,7 +215,7 @@ static int double_equal(double a, double b)
215
215
  /*----------------------------------------------------------------------------*/
216
216
  /** Computes Euclidean distance between point (x1,y1) and point (x2,y2).
217
217
  */
218
- static double dist(double x1, double y1, double x2, double y2)
218
+ static float dist(float x1, float y1, float x2, float y2)
219
219
  {
220
220
  return sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
221
221
  }
@@ -251,7 +251,7 @@ typedef struct ntuple_list_s
251
251
  unsigned int size;
252
252
  unsigned int max_size;
253
253
  unsigned int dim;
254
- double * values;
254
+ float * values;
255
255
  } * ntuple_list;
256
256
 
257
257
  /*----------------------------------------------------------------------------*/
@@ -286,7 +286,7 @@ static ntuple_list new_ntuple_list(unsigned int dim)
286
286
  n_tuple->dim = dim;
287
287
 
288
288
  /* get memory for tuples */
289
- n_tuple->values = (double *) malloc( dim*n_tuple->max_size * sizeof(double) );
289
+ n_tuple->values = (float *) malloc( dim*n_tuple->max_size * sizeof(float) );
290
290
  if( n_tuple->values == NULL ) error("not enough memory.");
291
291
 
292
292
  return n_tuple;
@@ -305,16 +305,16 @@ static void enlarge_ntuple_list(ntuple_list n_tuple)
305
305
  n_tuple->max_size *= 2;
306
306
 
307
307
  /* realloc memory */
308
- n_tuple->values = (double *) realloc( (void *) n_tuple->values,
309
- n_tuple->dim * n_tuple->max_size * sizeof(double) );
308
+ n_tuple->values = (float *) realloc( (void *) n_tuple->values,
309
+ n_tuple->dim * n_tuple->max_size * sizeof(float) );
310
310
  if( n_tuple->values == NULL ) error("not enough memory.");
311
311
  }
312
312
 
313
313
  /*----------------------------------------------------------------------------*/
314
314
  /** Add a 7-tuple to an n-tuple list.
315
315
  */
316
- static void add_7tuple( ntuple_list out, double v1, double v2, double v3,
317
- double v4, double v5, double v6, double v7 )
316
+ static void add_7tuple( ntuple_list out, float v1, float v2, float v3,
317
+ float v4, float v5, float v6, float v7 )
318
318
  {
319
319
  /* check parameters */
320
320
  if( out == NULL ) error("add_7tuple: invalid n-tuple input.");
@@ -479,7 +479,7 @@ static image_int new_image_int_ini( unsigned int xsize, unsigned int ysize,
479
479
  */
480
480
  typedef struct image_double_s
481
481
  {
482
- double * data;
482
+ float * data;
483
483
  unsigned int xsize,ysize;
484
484
  } * image_double;
485
485
 
@@ -507,7 +507,7 @@ static image_double new_image_double(unsigned int xsize, unsigned int ysize)
507
507
  /* get memory */
508
508
  image = (image_double) malloc( sizeof(struct image_double_s) );
509
509
  if( image == NULL ) error("not enough memory.");
510
- image->data = (double *) calloc( (size_t) (xsize*ysize), sizeof(double) );
510
+ image->data = (float *) calloc( (size_t) (xsize*ysize), sizeof(float) );
511
511
  if( image->data == NULL ) error("not enough memory.");
512
512
 
513
513
  /* set image size */
@@ -522,7 +522,7 @@ static image_double new_image_double(unsigned int xsize, unsigned int ysize)
522
522
  with the data pointed by 'data'.
523
523
  */
524
524
  static image_double new_image_double_ptr( unsigned int xsize,
525
- unsigned int ysize, double * data )
525
+ unsigned int ysize, float * data )
526
526
  {
527
527
  image_double image;
528
528
 
@@ -556,10 +556,10 @@ static image_double new_image_double_ptr( unsigned int xsize,
556
556
  in the middle point between values 'kernel->values[0]'
557
557
  and 'kernel->values[1]'.
558
558
  */
559
- static void gaussian_kernel(ntuple_list kernel, double sigma, double mean)
559
+ static void gaussian_kernel(ntuple_list kernel, float sigma, float mean)
560
560
  {
561
- double sum = 0.0;
562
- double val;
561
+ float sum = 0.0;
562
+ float val;
563
563
  unsigned int i;
564
564
 
565
565
  /* check parameters */
@@ -572,7 +572,7 @@ static void gaussian_kernel(ntuple_list kernel, double sigma, double mean)
572
572
  kernel->size = 1;
573
573
  for(i=0;i<kernel->dim;i++)
574
574
  {
575
- val = ( (double) i - mean ) / sigma;
575
+ val = ( (float) i - mean ) / sigma;
576
576
  kernel->values[i] = exp( -0.5 * val * val );
577
577
  sum += kernel->values[i];
578
578
  }
@@ -619,14 +619,14 @@ static void gaussian_kernel(ntuple_list kernel, double sigma, double mean)
619
619
  in the x axis, and then the combined Gaussian kernel and sampling
620
620
  in the y axis.
621
621
  */
622
- static image_double gaussian_sampler( image_double in, double scale,
623
- double sigma_scale )
622
+ static image_double gaussian_sampler( image_double in, float scale,
623
+ float sigma_scale )
624
624
  {
625
625
  image_double aux,out;
626
626
  ntuple_list kernel;
627
627
  unsigned int N,M,h,n,x,y,i;
628
628
  int xc,yc,j,double_x_size,double_y_size;
629
- double sigma,xx,yy,sum,prec;
629
+ float sigma,xx,yy,sum,prec;
630
630
 
631
631
  /* check parameters */
632
632
  if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
@@ -636,8 +636,8 @@ static image_double gaussian_sampler( image_double in, double scale,
636
636
  error("gaussian_sampler: 'sigma_scale' must be positive.");
637
637
 
638
638
  /* compute new image size and get memory for images */
639
- if( in->xsize * scale > (double) UINT_MAX ||
640
- in->ysize * scale > (double) UINT_MAX )
639
+ if( in->xsize * scale > (float) UINT_MAX ||
640
+ in->ysize * scale > (float) UINT_MAX )
641
641
  error("gaussian_sampler: the output image size exceeds the handled size.");
642
642
  N = (unsigned int) ceil( in->xsize * scale );
643
643
  M = (unsigned int) ceil( in->ysize * scale );
@@ -671,11 +671,11 @@ static image_double gaussian_sampler( image_double in, double scale,
671
671
  xx is the corresponding x-value in the original size image.
672
672
  xc is the integer value, the pixel coordinate of xx.
673
673
  */
674
- xx = (double) x / scale;
674
+ xx = (float) x / scale;
675
675
  /* coordinate (0.0,0.0) is in the center of pixel (0,0),
676
676
  so the pixel with xc=0 get the values of xx from -0.5 to 0.5 */
677
677
  xc = (int) floor( xx + 0.5 );
678
- gaussian_kernel( kernel, sigma, (double) h + xx - (double) xc );
678
+ gaussian_kernel( kernel, sigma, (float) h + xx - (float) xc );
679
679
  /* the kernel must be computed for each x because the fine
680
680
  offset xx-xc is different in each case */
681
681
 
@@ -705,11 +705,11 @@ static image_double gaussian_sampler( image_double in, double scale,
705
705
  yy is the corresponding x-value in the original size image.
706
706
  yc is the integer value, the pixel coordinate of xx.
707
707
  */
708
- yy = (double) y / scale;
708
+ yy = (float) y / scale;
709
709
  /* coordinate (0.0,0.0) is in the center of pixel (0,0),
710
710
  so the pixel with yc=0 get the values of yy from -0.5 to 0.5 */
711
711
  yc = (int) floor( yy + 0.5 );
712
- gaussian_kernel( kernel, sigma, (double) h + yy - (double) yc );
712
+ gaussian_kernel( kernel, sigma, (float) h + yy - (float) yc );
713
713
  /* the kernel must be computed for each y because the fine
714
714
  offset yy-yc is different in each case */
715
715
 
@@ -760,13 +760,13 @@ static image_double gaussian_sampler( image_double in, double scale,
760
760
  - a pointer 'mem_p' to the memory used by 'list_p' to be able to
761
761
  free the memory when it is not used anymore.
762
762
  */
763
- static image_double ll_angle( image_double in, double threshold,
763
+ static image_double ll_angle( image_double in, float threshold,
764
764
  struct coorlist ** list_p, void ** mem_p,
765
765
  image_double * modgrad, unsigned int n_bins )
766
766
  {
767
767
  image_double g;
768
768
  unsigned int n,p,x,y,adr,i;
769
- double com1,com2,gx,gy,norm,norm2;
769
+ float com1,com2,gx,gy,norm,norm2;
770
770
  /* the rest of the variables are used for pseudo-ordering
771
771
  the gradient magnitude values */
772
772
  int list_count = 0;
@@ -775,7 +775,7 @@ static image_double ll_angle( image_double in, double threshold,
775
775
  struct coorlist ** range_l_e; /* array of pointers to end of bin list */
776
776
  struct coorlist * start;
777
777
  struct coorlist * end;
778
- double max_grad = 0.0;
778
+ float max_grad = 0.0;
779
779
 
780
780
  /* check parameters */
781
781
  if( in == NULL || in->data == NULL || in->xsize == 0 || in->ysize == 0 )
@@ -858,7 +858,7 @@ static image_double ll_angle( image_double in, double threshold,
858
858
  norm = (*modgrad)->data[y*p+x];
859
859
 
860
860
  /* store the point in the right bin according to its norm */
861
- i = (unsigned int) (norm * (double) n_bins / max_grad);
861
+ i = (unsigned int) (norm * (float) n_bins / max_grad);
862
862
  if( i >= n_bins ) i = n_bins-1;
863
863
  if( range_l_e[i] == NULL )
864
864
  range_l_s[i] = range_l_e[i] = list+list_count++;
@@ -902,10 +902,10 @@ static image_double ll_angle( image_double in, double threshold,
902
902
  /*----------------------------------------------------------------------------*/
903
903
  /** Is point (x,y) aligned to angle theta, up to precision 'prec'?
904
904
  */
905
- static int isaligned( int x, int y, image_double angles, double theta,
906
- double prec )
905
+ static int isaligned( int x, int y, image_double angles, float theta,
906
+ float prec )
907
907
  {
908
- double a;
908
+ float a;
909
909
 
910
910
  /* check parameters */
911
911
  if( angles == NULL || angles->data == NULL )
@@ -940,7 +940,7 @@ static int isaligned( int x, int y, image_double angles, double theta,
940
940
  /*----------------------------------------------------------------------------*/
941
941
  /** Absolute value angle difference.
942
942
  */
943
- static double angle_diff(double a, double b)
943
+ static double angle_diff(float a, float b)
944
944
  {
945
945
  a -= b;
946
946
  while( a <= -M_PI ) a += M_2__PI;
@@ -952,7 +952,7 @@ static double angle_diff(double a, double b)
952
952
  /*----------------------------------------------------------------------------*/
953
953
  /** Signed angle difference.
954
954
  */
955
- static double angle_diff_signed(double a, double b)
955
+ static double angle_diff_signed(float a, float b)
956
956
  {
957
957
  a -= b;
958
958
  while( a <= -M_PI ) a += M_2__PI;
@@ -989,19 +989,19 @@ static double angle_diff_signed(double a, double b)
989
989
  q5 = 83.8676043424,
990
990
  q6 = 2.50662827511.
991
991
  */
992
- static double log_gamma_lanczos(double x)
992
+ static double log_gamma_lanczos(float x)
993
993
  {
994
- static double q[7] = { 75122.6331530, 80916.6278952, 36308.2951477,
994
+ static float q[7] = { 75122.6331530, 80916.6278952, 36308.2951477,
995
995
  8687.24529705, 1168.92649479, 83.8676043424,
996
996
  2.50662827511 };
997
- double a = (x+0.5) * log(x+5.5) - (x+5.5);
998
- double b = 0.0;
997
+ float a = (x+0.5) * log(x+5.5) - (x+5.5);
998
+ float b = 0.0;
999
999
  int n;
1000
1000
 
1001
1001
  for(n=0;n<7;n++)
1002
1002
  {
1003
- a -= log( x + (double) n );
1004
- b += q[n] * pow( x, (double) n );
1003
+ a -= log( x + (float) n );
1004
+ b += q[n] * pow( x, (float) n );
1005
1005
  }
1006
1006
  return a + log(b);
1007
1007
  }
@@ -1023,7 +1023,7 @@ static double log_gamma_lanczos(double x)
1023
1023
  @f]
1024
1024
  This formula is a good approximation when x > 15.
1025
1025
  */
1026
- static double log_gamma_windschitl(double x)
1026
+ static double log_gamma_windschitl(float x)
1027
1027
  {
1028
1028
  return 0.918938533204673 + (x-0.5)*log(x) - x
1029
1029
  + 0.5*x*log( x*sinh(1/x) + 1/(810.0*pow(x,6.0)) );
@@ -1083,11 +1083,11 @@ static double log_gamma_windschitl(double x)
1083
1083
  of the terms are neglected based on a bound to the error obtained
1084
1084
  (an error of 10% in the result is accepted).
1085
1085
  */
1086
- static double nfa(int n, int k, double p, double logNT)
1086
+ static double nfa(int n, int k, float p, float logNT)
1087
1087
  {
1088
- static double inv[TABSIZE]; /* table to keep computed inverse values */
1089
- double tolerance = 0.1; /* an error of 10% in the result is accepted */
1090
- double log1term,term,bin_term,mult_term,bin_tail,err,p_term;
1088
+ static float inv[TABSIZE]; /* table to keep computed inverse values */
1089
+ float tolerance = 0.1; /* an error of 10% in the result is accepted */
1090
+ float log1term,term,bin_term,mult_term,bin_tail,err,p_term;
1091
1091
  int i;
1092
1092
 
1093
1093
  /* check parameters */
@@ -1096,7 +1096,7 @@ static double nfa(int n, int k, double p, double logNT)
1096
1096
 
1097
1097
  /* trivial cases */
1098
1098
  if( n==0 || k==0 ) return -logNT;
1099
- if( n==k ) return -logNT - (double) n * log10(p);
1099
+ if( n==k ) return -logNT - (float) n * log10(p);
1100
1100
 
1101
1101
  /* probability term */
1102
1102
  p_term = p / (1.0-p);
@@ -1109,15 +1109,15 @@ static double nfa(int n, int k, double p, double logNT)
1109
1109
  bincoef(n,k) = gamma(n+1) / ( gamma(k+1) * gamma(n-k+1) ).
1110
1110
  We use this to compute the first term. Actually the log of it.
1111
1111
  */
1112
- log1term = log_gamma( (double) n + 1.0 ) - log_gamma( (double) k + 1.0 )
1113
- - log_gamma( (double) (n-k) + 1.0 )
1114
- + (double) k * log(p) + (double) (n-k) * log(1.0-p);
1112
+ log1term = log_gamma( (float) n + 1.0 ) - log_gamma( (float) k + 1.0 )
1113
+ - log_gamma( (float) (n-k) + 1.0 )
1114
+ + (float) k * log(p) + (float) (n-k) * log(1.0-p);
1115
1115
  term = exp(log1term);
1116
1116
 
1117
1117
  /* in some cases no more computations are needed */
1118
1118
  if( double_equal(term,0.0) ) /* the first term is almost zero */
1119
1119
  {
1120
- if( (double) k > (double) n * p ) /* at begin or end of the tail? */
1120
+ if( (float) k > (float) n * p ) /* at begin or end of the tail? */
1121
1121
  return -log1term / M_LN10 - logNT; /* end: use just the first term */
1122
1122
  else
1123
1123
  return -logNT; /* begin: the tail is roughly 1 */
@@ -1140,9 +1140,9 @@ static double nfa(int n, int k, double p, double logNT)
1140
1140
  because divisions are expensive.
1141
1141
  p/(1-p) is computed only once and stored in 'p_term'.
1142
1142
  */
1143
- bin_term = (double) (n-i+1) * ( i<TABSIZE ?
1144
- ( inv[i]!=0.0 ? inv[i] : ( inv[i] = 1.0 / (double) i ) ) :
1145
- 1.0 / (double) i );
1143
+ bin_term = (float) (n-i+1) * ( i<TABSIZE ?
1144
+ ( inv[i]!=0.0 ? inv[i] : ( inv[i] = 1.0 / (float) i ) ) :
1145
+ 1.0 / (float) i );
1146
1146
 
1147
1147
  mult_term = bin_term * p_term;
1148
1148
  term *= mult_term;
@@ -1153,7 +1153,7 @@ static double nfa(int n, int k, double p, double logNT)
1153
1153
  Then, the error on the binomial tail when truncated at
1154
1154
  the i term can be bounded by a geometric series of form
1155
1155
  term_i * sum mult_term_i^j. */
1156
- err = term * ( ( 1.0 - pow( mult_term, (double) (n-i+1) ) ) /
1156
+ err = term * ( ( 1.0 - pow( mult_term, (float) (n-i+1) ) ) /
1157
1157
  (1.0-mult_term) - 1.0 );
1158
1158
 
1159
1159
  /* One wants an error at most of tolerance*final_result, or:
@@ -1180,13 +1180,13 @@ static double nfa(int n, int k, double p, double logNT)
1180
1180
  */
1181
1181
  struct rect
1182
1182
  {
1183
- double x1,y1,x2,y2; /* first and second point of the line segment */
1184
- double width; /* rectangle width */
1185
- double x,y; /* center of the rectangle */
1186
- double theta; /* angle */
1187
- double dx,dy; /* (dx,dy) is vector oriented as the line segment */
1188
- double prec; /* tolerance angle */
1189
- double p; /* probability of a point with angle within 'prec' */
1183
+ float x1,y1,x2,y2; /* first and second point of the line segment */
1184
+ float width; /* rectangle width */
1185
+ float x,y; /* center of the rectangle */
1186
+ float theta; /* angle */
1187
+ float dx,dy; /* (dx,dy) is vector oriented as the line segment */
1188
+ float prec; /* tolerance angle */
1189
+ float p; /* probability of a point with angle within 'prec' */
1190
1190
  };
1191
1191
 
1192
1192
  /*----------------------------------------------------------------------------*/
@@ -1270,9 +1270,9 @@ static void rect_copy(struct rect * in, struct rect * out)
1270
1270
  */
1271
1271
  typedef struct
1272
1272
  {
1273
- double vx[4]; /* rectangle's corner X coordinates in circular order */
1274
- double vy[4]; /* rectangle's corner Y coordinates in circular order */
1275
- double ys,ye; /* start and end Y values of current 'column' */
1273
+ float vx[4]; /* rectangle's corner X coordinates in circular order */
1274
+ float vy[4]; /* rectangle's corner Y coordinates in circular order */
1275
+ float ys,ye; /* start and end Y values of current 'column' */
1276
1276
  int x,y; /* coordinates of currently explored pixel */
1277
1277
  } rect_iter;
1278
1278
 
@@ -1286,7 +1286,7 @@ typedef struct
1286
1286
  - x1 <= x
1287
1287
  - x <= x2
1288
1288
  */
1289
- static double inter_low(double x, double x1, double y1, double x2, double y2)
1289
+ static double inter_low(float x, float x1, float y1, float x2, float y2)
1290
1290
  {
1291
1291
  /* check parameters */
1292
1292
  if( x1 > x2 || x < x1 || x > x2 )
@@ -1308,7 +1308,7 @@ static double inter_low(double x, double x1, double y1, double x2, double y2)
1308
1308
  - x1 <= x
1309
1309
  - x <= x2
1310
1310
  */
1311
- static double inter_hi(double x, double x1, double y1, double x2, double y2)
1311
+ static double inter_hi(float x, float x1, float y1, float x2, float y2)
1312
1312
  {
1313
1313
  /* check parameters */
1314
1314
  if( x1 > x2 || x < x1 || x > x2 )
@@ -1342,7 +1342,7 @@ static int ri_end(rect_iter * i)
1342
1342
  /* if the current x value is larger than the largest
1343
1343
  x value in the rectangle (vx[2]), we know the full
1344
1344
  exploration of the rectangle is finished. */
1345
- return (double)(i->x) > i->vx[2];
1345
+ return (float)(i->x) > i->vx[2];
1346
1346
  }
1347
1347
 
1348
1348
  /*----------------------------------------------------------------------------*/
@@ -1362,7 +1362,7 @@ static void ri_inc(rect_iter * i)
1362
1362
  /* if the end of the current 'column' is reached,
1363
1363
  and it is not the end of exploration,
1364
1364
  advance to the next 'column' */
1365
- while( (double) (i->y) > i->ye && !ri_end(i) )
1365
+ while( (float) (i->y) > i->ye && !ri_end(i) )
1366
1366
  {
1367
1367
  /* increase x, next 'column' */
1368
1368
  i->x++;
@@ -1385,10 +1385,10 @@ static void ri_inc(rect_iter * i)
1385
1385
  or last 'columns') then we pick the lower value of the side
1386
1386
  by using 'inter_low'.
1387
1387
  */
1388
- if( (double) i->x < i->vx[3] )
1389
- i->ys = inter_low((double)i->x,i->vx[0],i->vy[0],i->vx[3],i->vy[3]);
1388
+ if( (float) i->x < i->vx[3] )
1389
+ i->ys = inter_low((float)i->x,i->vx[0],i->vy[0],i->vx[3],i->vy[3]);
1390
1390
  else
1391
- i->ys = inter_low((double)i->x,i->vx[3],i->vy[3],i->vx[2],i->vy[2]);
1391
+ i->ys = inter_low((float)i->x,i->vx[3],i->vy[3],i->vx[2],i->vy[2]);
1392
1392
 
1393
1393
  /* update upper y limit (end) for the new 'column'.
1394
1394
 
@@ -1405,10 +1405,10 @@ static void ri_inc(rect_iter * i)
1405
1405
  or last 'columns') then we pick the lower value of the side
1406
1406
  by using 'inter_low'.
1407
1407
  */
1408
- if( (double)i->x < i->vx[1] )
1409
- i->ye = inter_hi((double)i->x,i->vx[0],i->vy[0],i->vx[1],i->vy[1]);
1408
+ if( (float)i->x < i->vx[1] )
1409
+ i->ye = inter_hi((float)i->x,i->vx[0],i->vy[0],i->vx[1],i->vy[1]);
1410
1410
  else
1411
- i->ye = inter_hi((double)i->x,i->vx[1],i->vy[1],i->vx[2],i->vy[2]);
1411
+ i->ye = inter_hi((float)i->x,i->vx[1],i->vy[1],i->vx[2],i->vy[2]);
1412
1412
 
1413
1413
  /* new y */
1414
1414
  i->y = (int) ceil(i->ys);
@@ -1422,7 +1422,7 @@ static void ri_inc(rect_iter * i)
1422
1422
  */
1423
1423
  static rect_iter * ri_ini(struct rect * r)
1424
1424
  {
1425
- double vx[4],vy[4];
1425
+ float vx[4],vy[4];
1426
1426
  int n,offset;
1427
1427
  rect_iter * i;
1428
1428
 
@@ -1491,7 +1491,7 @@ static rect_iter * ri_ini(struct rect * r)
1491
1491
  /*----------------------------------------------------------------------------*/
1492
1492
  /** Compute a rectangle's NFA value.
1493
1493
  */
1494
- static double rect_nfa(struct rect * rec, image_double angles, double logNT)
1494
+ static float rect_nfa(struct rect * rec, image_double angles, float logNT)
1495
1495
  {
1496
1496
  rect_iter * i;
1497
1497
  int pts = 0;
@@ -1577,13 +1577,13 @@ static double rect_nfa(struct rect * rec, image_double angles, double logNT)
1577
1577
  When |Ixx| > |Iyy| we use the first, otherwise the second (just to
1578
1578
  get better numeric precision).
1579
1579
  */
1580
- static double get_theta( struct point * reg, int reg_size, double x, double y,
1581
- image_double modgrad, double reg_angle, double prec )
1580
+ static float get_theta( struct point * reg, int reg_size, float x, float y,
1581
+ image_double modgrad, float reg_angle, float prec )
1582
1582
  {
1583
- double lambda,theta,weight;
1584
- double Ixx = 0.0;
1585
- double Iyy = 0.0;
1586
- double Ixy = 0.0;
1583
+ float lambda,theta,weight;
1584
+ float Ixx = 0.0;
1585
+ float Iyy = 0.0;
1586
+ float Ixy = 0.0;
1587
1587
  int i;
1588
1588
 
1589
1589
  /* check parameters */
@@ -1597,9 +1597,9 @@ static double get_theta( struct point * reg, int reg_size, double x, double y,
1597
1597
  for(i=0; i<reg_size; i++)
1598
1598
  {
1599
1599
  weight = modgrad->data[ reg[i].x + reg[i].y * modgrad->xsize ];
1600
- Ixx += ( (double) reg[i].y - y ) * ( (double) reg[i].y - y ) * weight;
1601
- Iyy += ( (double) reg[i].x - x ) * ( (double) reg[i].x - x ) * weight;
1602
- Ixy -= ( (double) reg[i].x - x ) * ( (double) reg[i].y - y ) * weight;
1600
+ Ixx += ( (float) reg[i].y - y ) * ( (float) reg[i].y - y ) * weight;
1601
+ Iyy += ( (float) reg[i].x - x ) * ( (float) reg[i].x - x ) * weight;
1602
+ Ixy -= ( (float) reg[i].x - x ) * ( (float) reg[i].y - y ) * weight;
1603
1603
  }
1604
1604
  if( double_equal(Ixx,0.0) && double_equal(Iyy,0.0) && double_equal(Ixy,0.0) )
1605
1605
  error("get_theta: null inertia matrix.");
@@ -1621,10 +1621,10 @@ static double get_theta( struct point * reg, int reg_size, double x, double y,
1621
1621
  /** Computes a rectangle that covers a region of points.
1622
1622
  */
1623
1623
  static void region2rect( struct point * reg, int reg_size,
1624
- image_double modgrad, double reg_angle,
1625
- double prec, double p, struct rect * rec )
1624
+ image_double modgrad, float reg_angle,
1625
+ float prec, float p, struct rect * rec )
1626
1626
  {
1627
- double x,y,dx,dy,l,w,theta,weight,sum,l_min,l_max,w_min,w_max;
1627
+ float x,y,dx,dy,l,w,theta,weight,sum,l_min,l_max,w_min,w_max;
1628
1628
  int i;
1629
1629
 
1630
1630
  /* check parameters */
@@ -1648,8 +1648,8 @@ static void region2rect( struct point * reg, int reg_size,
1648
1648
  for(i=0; i<reg_size; i++)
1649
1649
  {
1650
1650
  weight = modgrad->data[ reg[i].x + reg[i].y * modgrad->xsize ];
1651
- x += (double) reg[i].x * weight;
1652
- y += (double) reg[i].y * weight;
1651
+ x += (float) reg[i].x * weight;
1652
+ y += (float) reg[i].y * weight;
1653
1653
  sum += weight;
1654
1654
  }
1655
1655
  if( sum <= 0.0 ) error("region2rect: weights sum equal to zero.");
@@ -1676,8 +1676,8 @@ static void region2rect( struct point * reg, int reg_size,
1676
1676
  l_min = l_max = w_min = w_max = 0.0;
1677
1677
  for(i=0; i<reg_size; i++)
1678
1678
  {
1679
- l = ( (double) reg[i].x - x) * dx + ( (double) reg[i].y - y) * dy;
1680
- w = -( (double) reg[i].x - x) * dy + ( (double) reg[i].y - y) * dx;
1679
+ l = ( (float) reg[i].x - x) * dx + ( (float) reg[i].y - y) * dy;
1680
+ w = -( (float) reg[i].x - x) * dy + ( (float) reg[i].y - y) * dx;
1681
1681
 
1682
1682
  if( l > l_max ) l_max = l;
1683
1683
  if( l < l_min ) l_min = l;
@@ -1714,10 +1714,10 @@ static void region2rect( struct point * reg, int reg_size,
1714
1714
  tolerance 'prec', starting at point (x,y).
1715
1715
  */
1716
1716
  static void region_grow( int x, int y, image_double angles, struct point * reg,
1717
- int * reg_size, double * reg_angle, image_char used,
1718
- double prec )
1717
+ int * reg_size, float * reg_angle, image_char used,
1718
+ float prec )
1719
1719
  {
1720
- double sumdx,sumdy;
1720
+ float sumdx,sumdy;
1721
1721
  int xx,yy,i;
1722
1722
 
1723
1723
  /* check parameters */
@@ -1765,13 +1765,13 @@ static void region_grow( int x, int y, image_double angles, struct point * reg,
1765
1765
  /** Try some rectangles variations to improve NFA value. Only if the
1766
1766
  rectangle is not meaningful (i.e., log_nfa <= log_eps).
1767
1767
  */
1768
- static double rect_improve( struct rect * rec, image_double angles,
1769
- double logNT, double log_eps )
1768
+ static float rect_improve( struct rect * rec, image_double angles,
1769
+ float logNT, float log_eps )
1770
1770
  {
1771
1771
  struct rect r;
1772
- double log_nfa,log_nfa_new;
1773
- double delta = 0.5;
1774
- double delta_2 = delta / 2.0;
1772
+ float log_nfa,log_nfa_new;
1773
+ float delta = 0.5;
1774
+ float delta_2 = delta / 2.0;
1775
1775
  int n;
1776
1776
 
1777
1777
  log_nfa = rect_nfa(rec,angles,logNT);
@@ -1879,12 +1879,12 @@ static double rect_improve( struct rect * rec, image_double angles,
1879
1879
  density of region points or to discard the region if too small.
1880
1880
  */
1881
1881
  static int reduce_region_radius( struct point * reg, int * reg_size,
1882
- image_double modgrad, double reg_angle,
1883
- double prec, double p, struct rect * rec,
1882
+ image_double modgrad, float reg_angle,
1883
+ float prec, float p, struct rect * rec,
1884
1884
  image_char used, image_double angles,
1885
- double density_th )
1885
+ float density_th )
1886
1886
  {
1887
- double density,rad1,rad2,rad,xc,yc;
1887
+ float density,rad1,rad2,rad,xc,yc;
1888
1888
  int i;
1889
1889
 
1890
1890
  /* check parameters */
@@ -1899,15 +1899,15 @@ static int reduce_region_radius( struct point * reg, int * reg_size,
1899
1899
  error("reduce_region_radius: invalid image 'angles'.");
1900
1900
 
1901
1901
  /* compute region points density */
1902
- density = (double) *reg_size /
1902
+ density = (float) *reg_size /
1903
1903
  ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
1904
1904
 
1905
1905
  /* if the density criterion is satisfied there is nothing to do */
1906
1906
  if( density >= density_th ) return TRUE;
1907
1907
 
1908
1908
  /* compute region's radius */
1909
- xc = (double) reg[0].x;
1910
- yc = (double) reg[0].y;
1909
+ xc = (float) reg[0].x;
1910
+ yc = (float) reg[0].y;
1911
1911
  rad1 = dist( xc, yc, rec->x1, rec->y1 );
1912
1912
  rad2 = dist( xc, yc, rec->x2, rec->y2 );
1913
1913
  rad = rad1 > rad2 ? rad1 : rad2;
@@ -1919,7 +1919,7 @@ static int reduce_region_radius( struct point * reg, int * reg_size,
1919
1919
 
1920
1920
  /* remove points from the region and update 'used' map */
1921
1921
  for(i=0; i<*reg_size; i++)
1922
- if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) > rad )
1922
+ if( dist( xc, yc, (float) reg[i].x, (float) reg[i].y ) > rad )
1923
1923
  {
1924
1924
  /* point not kept, mark it as NOTUSED */
1925
1925
  used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
@@ -1938,7 +1938,7 @@ static int reduce_region_radius( struct point * reg, int * reg_size,
1938
1938
  region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
1939
1939
 
1940
1940
  /* re-compute region points density */
1941
- density = (double) *reg_size /
1941
+ density = (float) *reg_size /
1942
1942
  ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
1943
1943
  }
1944
1944
 
@@ -1957,10 +1957,10 @@ static int reduce_region_radius( struct point * reg, int * reg_size,
1957
1957
  'reduce_region_radius' is called to try to satisfy this condition.
1958
1958
  */
1959
1959
  static int refine( struct point * reg, int * reg_size, image_double modgrad,
1960
- double reg_angle, double prec, double p, struct rect * rec,
1961
- image_char used, image_double angles, double density_th )
1960
+ float reg_angle, float prec, float p, struct rect * rec,
1961
+ image_char used, image_double angles, float density_th )
1962
1962
  {
1963
- double angle,ang_d,mean_angle,tau,density,xc,yc,ang_c,sum,s_sum;
1963
+ float angle,ang_d,mean_angle,tau,density,xc,yc,ang_c,sum,s_sum;
1964
1964
  int i,n;
1965
1965
 
1966
1966
  /* check parameters */
@@ -1974,7 +1974,7 @@ static int refine( struct point * reg, int * reg_size, image_double modgrad,
1974
1974
  error("refine: invalid image 'angles'.");
1975
1975
 
1976
1976
  /* compute region points density */
1977
- density = (double) *reg_size /
1977
+ density = (float) *reg_size /
1978
1978
  ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
1979
1979
 
1980
1980
  /* if the density criterion is satisfied there is nothing to do */
@@ -1983,15 +1983,15 @@ static int refine( struct point * reg, int * reg_size, image_double modgrad,
1983
1983
  /*------ First try: reduce angle tolerance ------*/
1984
1984
 
1985
1985
  /* compute the new mean angle and tolerance */
1986
- xc = (double) reg[0].x;
1987
- yc = (double) reg[0].y;
1986
+ xc = (float) reg[0].x;
1987
+ yc = (float) reg[0].y;
1988
1988
  ang_c = angles->data[ reg[0].x + reg[0].y * angles->xsize ];
1989
1989
  sum = s_sum = 0.0;
1990
1990
  n = 0;
1991
1991
  for(i=0; i<*reg_size; i++)
1992
1992
  {
1993
1993
  used->data[ reg[i].x + reg[i].y * used->xsize ] = NOTUSED;
1994
- if( dist( xc, yc, (double) reg[i].x, (double) reg[i].y ) < rec->width )
1994
+ if( dist( xc, yc, (float) reg[i].x, (float) reg[i].y ) < rec->width )
1995
1995
  {
1996
1996
  angle = angles->data[ reg[i].x + reg[i].y * angles->xsize ];
1997
1997
  ang_d = angle_diff_signed(angle,ang_c);
@@ -2000,8 +2000,8 @@ static int refine( struct point * reg, int * reg_size, image_double modgrad,
2000
2000
  ++n;
2001
2001
  }
2002
2002
  }
2003
- mean_angle = sum / (double) n;
2004
- tau = 2.0 * sqrt( (s_sum - 2.0 * mean_angle * sum) / (double) n
2003
+ mean_angle = sum / (float) n;
2004
+ tau = 2.0 * sqrt( (s_sum - 2.0 * mean_angle * sum) / (float) n
2005
2005
  + mean_angle*mean_angle ); /* 2 * standard deviation */
2006
2006
 
2007
2007
  /* find a new region from the same starting point and new angle tolerance */
@@ -2014,7 +2014,7 @@ static int refine( struct point * reg, int * reg_size, image_double modgrad,
2014
2014
  region2rect(reg,*reg_size,modgrad,reg_angle,prec,p,rec);
2015
2015
 
2016
2016
  /* re-compute region points density */
2017
- density = (double) *reg_size /
2017
+ density = (float) *reg_size /
2018
2018
  ( dist(rec->x1,rec->y1,rec->x2,rec->y2) * rec->width );
2019
2019
 
2020
2020
  /*------ Second try: reduce region radius ------*/
@@ -2034,16 +2034,16 @@ static int refine( struct point * reg, int * reg_size, image_double modgrad,
2034
2034
  /*----------------------------------------------------------------------------*/
2035
2035
  /** LSD full interface.
2036
2036
  */
2037
- double * LineSegmentDetection( int * n_out,
2038
- double * img, int X, int Y,
2039
- double scale, double sigma_scale, double quant,
2040
- double ang_th, double log_eps, double density_th,
2037
+ float * LineSegmentDetection( int * n_out,
2038
+ float * img, int X, int Y,
2039
+ float scale, float sigma_scale, float quant,
2040
+ float ang_th, float log_eps, float density_th,
2041
2041
  int n_bins,
2042
2042
  int ** reg_img, int * reg_x, int * reg_y )
2043
2043
  {
2044
2044
  image_double image;
2045
2045
  ntuple_list out = new_ntuple_list(7);
2046
- double * return_value;
2046
+ float * return_value;
2047
2047
  image_double scaled_image,angles,modgrad;
2048
2048
  image_char used;
2049
2049
  image_int region = NULL;
@@ -2053,7 +2053,7 @@ double * LineSegmentDetection( int * n_out,
2053
2053
  struct point * reg;
2054
2054
  int reg_size,min_reg_size,i;
2055
2055
  unsigned int xsize,ysize;
2056
- double rho,reg_angle,prec,p,log_nfa,logNT;
2056
+ float rho,reg_angle,prec,p,log_nfa,logNT;
2057
2057
  int ls_count = 0; /* line segments are numbered 1,2,3,... */
2058
2058
 
2059
2059
 
@@ -2103,7 +2103,7 @@ double * LineSegmentDetection( int * n_out,
2103
2103
  whose logarithm value is
2104
2104
  log10(11) + 5/2 * (log10(X) + log10(Y)).
2105
2105
  */
2106
- logNT = 5.0 * ( log10( (double) xsize ) + log10( (double) ysize ) ) / 2.0
2106
+ logNT = 5.0 * ( log10( (float) xsize ) + log10( (float) ysize ) ) / 2.0
2107
2107
  + log10(11.0);
2108
2108
  min_reg_size = (int) (-logNT/log10(p)); /* minimal number of points in region
2109
2109
  that can give a meaningful event */
@@ -2221,18 +2221,18 @@ double * LineSegmentDetection( int * n_out,
2221
2221
  /*----------------------------------------------------------------------------*/
2222
2222
  /** LSD Simple Interface with Scale and Region output.
2223
2223
  */
2224
- double * lsd_scale_region( int * n_out,
2225
- double * img, int X, int Y, double scale,
2224
+ float * lsd_scale_region( int * n_out,
2225
+ float * img, int X, int Y, float scale,
2226
2226
  int ** reg_img, int * reg_x, int * reg_y )
2227
2227
  {
2228
2228
  /* LSD parameters */
2229
- double sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as
2229
+ float sigma_scale = 0.6; /* Sigma for Gaussian filter is computed as
2230
2230
  sigma = sigma_scale/scale. */
2231
- double quant = 2.0; /* Bound to the quantization error on the
2231
+ float quant = 2.0; /* Bound to the quantization error on the
2232
2232
  gradient norm. */
2233
- double ang_th = 22.5; /* Gradient angle tolerance in degrees. */
2234
- double log_eps = 0.0; /* Detection threshold: -log10(NFA) > log_eps */
2235
- double density_th = 0.7; /* Minimal density of region points in rectangle. */
2233
+ float ang_th = 22.5; /* Gradient angle tolerance in degrees. */
2234
+ float log_eps = 0.0; /* Detection threshold: -log10(NFA) > log_eps */
2235
+ float density_th = 0.7; /* Minimal density of region points in rectangle. */
2236
2236
  int n_bins = 1024; /* Number of bins in pseudo-ordering of gradient
2237
2237
  modulus. */
2238
2238
 
@@ -2244,7 +2244,7 @@ double * lsd_scale_region( int * n_out,
2244
2244
  /*----------------------------------------------------------------------------*/
2245
2245
  /** LSD Simple Interface with Scale.
2246
2246
  */
2247
- double * lsd_scale(int * n_out, double * img, int X, int Y, double scale)
2247
+ float * lsd_scale(int * n_out, float * img, int X, int Y, float scale)
2248
2248
  {
2249
2249
  return lsd_scale_region(n_out,img,X,Y,scale,NULL,NULL,NULL);
2250
2250
  }
@@ -2252,10 +2252,10 @@ double * lsd_scale(int * n_out, double * img, int X, int Y, double scale)
2252
2252
  /*----------------------------------------------------------------------------*/
2253
2253
  /** LSD Simple Interface.
2254
2254
  */
2255
- double * lsd(int * n_out, double * img, int X, int Y)
2255
+ float * lsd(int * n_out, float * img, int X, int Y)
2256
2256
  {
2257
2257
  /* LSD parameters */
2258
- double scale = 0.8; /* Scale the image by Gaussian filter to 'scale'. */
2258
+ float scale = 0.8; /* Scale the image by Gaussian filter to 'scale'. */
2259
2259
 
2260
2260
  return lsd_scale(n_out,img,X,Y,scale);
2261
2261
 
@@ -2265,6 +2265,6 @@ double * lsd(int * n_out, double * img, int X, int Y)
2265
2265
 
2266
2266
  /***** added by manuel aristaran ****/
2267
2267
 
2268
- void free_values(double * p) {
2268
+ void free_values(float * p) {
2269
2269
  free((void *) p);
2270
2270
  }