Coverage Report

Created: 2025-01-28 06:34

/src/libvips/libvips/arithmetic/hough.c
Line
Count
Source (jump to first uncovered line)
1
/* hough transform
2
 *
3
 * 7/3/14
4
 *  - from hist_find.c
5
 */
6
7
/*
8
9
  This file is part of VIPS.
10
11
  VIPS is free software; you can redistribute it and/or modify
12
  it under the terms of the GNU Lesser General Public License as published by
13
  the Free Software Foundation; either version 2 of the License, or
14
  (at your option) any later version.
15
16
  This program is distributed in the hope that it will be useful,
17
  but WITHOUT ANY WARRANTY; without even the implied warranty of
18
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
  GNU Lesser General Public License for more details.
20
21
  You should have received a copy of the GNU Lesser General Public License
22
  along with this program; if not, write to the Free Software
23
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24
  02110-1301  USA
25
26
 */
27
28
/*
29
30
  These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
31
32
 */
33
34
#ifdef HAVE_CONFIG_H
35
#include <config.h>
36
#endif /*HAVE_CONFIG_H*/
37
#include <glib/gi18n-lib.h>
38
39
#include <string.h>
40
41
#include <vips/vips.h>
42
43
#include "statistic.h"
44
#include "hough.h"
45
46
G_DEFINE_ABSTRACT_TYPE(VipsHough, vips_hough, VIPS_TYPE_STATISTIC);
47
48
static VipsImage *
49
vips_hough_new_accumulator(VipsHough *hough)
50
0
{
51
0
  VipsHoughClass *class = VIPS_HOUGH_GET_CLASS(hough);
52
0
  VipsStatistic *statistic = VIPS_STATISTIC(hough);
53
54
0
  VipsImage *accumulator;
55
56
0
  accumulator = vips_image_new_memory();
57
58
0
  if (vips_image_pipelinev(accumulator,
59
0
      VIPS_DEMAND_STYLE_ANY, statistic->ready, NULL) ||
60
0
    class->init_accumulator(hough, accumulator) ||
61
0
    vips_image_write_prepare(accumulator)) {
62
0
    g_object_unref(accumulator);
63
0
    return NULL;
64
0
  }
65
66
0
  return accumulator;
67
0
}
68
69
static int
70
vips_hough_build(VipsObject *object)
71
0
{
72
0
  VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
73
0
  VipsStatistic *statistic = VIPS_STATISTIC(object);
74
0
  VipsHough *hough = (VipsHough *) object;
75
76
0
  VipsImage *out;
77
78
  /* Mono only, we use the bands dimension of the output image for
79
   * a parameter.
80
   */
81
0
  if (statistic->in)
82
0
    if (vips_check_mono(class->nickname, statistic->in))
83
0
      return -1;
84
85
0
  if (!(out = vips_hough_new_accumulator(hough)))
86
0
    return -1;
87
0
  g_object_set(object,
88
0
    "out", out,
89
0
    NULL);
90
91
0
  if (VIPS_OBJECT_CLASS(vips_hough_parent_class)->build(object))
92
0
    return -1;
93
94
0
  return 0;
95
0
}
96
97
/* Build a new accumulator.
98
 */
99
static void *
100
vips_hough_start(VipsStatistic *statistic)
101
0
{
102
0
  VipsHough *hough = (VipsHough *) statistic;
103
104
0
  VipsImage *accumulator;
105
106
0
  if (!(accumulator = vips_hough_new_accumulator(hough)))
107
0
    return NULL;
108
109
0
  return (void *) accumulator;
110
0
}
111
112
/* Add our finished accumulator to the main area.
113
 */
114
static int
115
vips_hough_stop(VipsStatistic *statistic, void *seq)
116
0
{
117
0
  VipsImage *accumulator = (VipsImage *) seq;
118
0
  VipsHough *hough = (VipsHough *) statistic;
119
120
0
  if (vips_draw_image(hough->out, accumulator, 0, 0,
121
0
      "mode", VIPS_COMBINE_MODE_ADD,
122
0
      NULL)) {
123
0
    g_object_unref(accumulator);
124
0
    return -1;
125
0
  }
126
127
0
  g_object_unref(accumulator);
128
129
0
  return 0;
130
0
}
131
132
static int
133
vips_hough_scan(VipsStatistic *statistic,
134
  void *seq, int x, int y, void *in, int n)
135
0
{
136
0
  VipsHough *hough = (VipsHough *) statistic;
137
0
  VipsHoughClass *class = VIPS_HOUGH_GET_CLASS(hough);
138
0
  VipsImage *accumulator = (VipsImage *) seq;
139
0
  VipsPel *p = (VipsPel *) in;
140
141
0
  int i;
142
143
0
  for (i = 0; i < n; i++)
144
0
    if (p[i])
145
0
      class->vote(hough, accumulator, x + i, y);
146
147
0
  return 0;
148
0
}
149
150
#define UC VIPS_FORMAT_UCHAR
151
152
/* Input image is cast to this format.
153
 */
154
static const VipsBandFormat vips_hough_format_table[10] = {
155
  /* Band format:  UC  C   US  S   UI  I   F   X   D   DX */
156
  /* Promotion: */ UC, UC, UC, UC, UC, UC, UC, UC, UC, UC
157
};
158
159
static void
160
vips_hough_class_init(VipsHoughClass *class)
161
1
{
162
1
  GObjectClass *gobject_class = (GObjectClass *) class;
163
1
  VipsObjectClass *object_class = (VipsObjectClass *) class;
164
1
  VipsStatisticClass *sclass = VIPS_STATISTIC_CLASS(class);
165
166
1
  gobject_class->set_property = vips_object_set_property;
167
1
  gobject_class->get_property = vips_object_get_property;
168
169
1
  object_class->nickname = "hough";
170
1
  object_class->description = _("find hough transform");
171
1
  object_class->build = vips_hough_build;
172
173
1
  sclass->start = vips_hough_start;
174
1
  sclass->scan = vips_hough_scan;
175
1
  sclass->stop = vips_hough_stop;
176
1
  sclass->format_table = vips_hough_format_table;
177
178
1
  VIPS_ARG_IMAGE(class, "out", 100,
179
1
    _("Output"),
180
1
    _("Output image"),
181
1
    VIPS_ARGUMENT_REQUIRED_OUTPUT,
182
1
    G_STRUCT_OFFSET(VipsHough, out));
183
1
}
184
185
static void
186
vips_hough_init(VipsHough *hough)
187
0
{
188
0
}