27 #ifndef SCRIBO_PRIMITIVE_EXTRACT_LINES_PATTERN_HH
28 # define SCRIBO_PRIMITIVE_EXTRACT_LINES_PATTERN_HH
36 # include <mln/core/concept/image.hh>
37 # include <mln/core/concept/window.hh>
38 # include <mln/core/routine/duplicate.hh>
40 # include <mln/extension/adjust_fill.hh>
42 # include <mln/geom/ncols.hh>
44 # include <mln/accu/transform_line.hh>
45 # include <mln/accu/count_value.hh>
47 # include <mln/data/paste.hh>
72 template <
typename I,
typename W>
75 unsigned dir, const
Window<W>& win_);
78 # ifndef MLN_INCLUDE_ONLY
89 template <
typename I,
typename W>
92 unsigned dir, const
Window<W>& win_)
94 mln_trace(
"scribo::primitive::extract::impl::generic::lines_pattern");
96 const I& input =
exact(input_);
98 mlc_is(mln_value(I),
bool)::check();
99 mln_precondition(input.is_valid());
104 accu::count_value<bool> accu(
true);
106 tmp = accu::transform_line(accu, input, length, dir);
108 mln_concrete(I) output;
109 initialize(output, input);
111 mln_piter(I) p(input.domain());
112 mln_qiter(W) q(win, p);
120 if (length - tmp(p) >
unsigned(0.2f * length) + 1)
129 is_foreground =
true;
131 if ((length - tmp(q)) <
unsigned(length * 0.95f) + 1)
133 is_foreground =
false;
137 output(p) = is_foreground;
147 template <
typename I,
typename W>
149 lines_pattern_fast(const
Image<I>& input_,
unsigned length,
150 unsigned dir, const
Window<W>& win_)
152 mln_trace(
"scribo::primitive::extract::impl::lines_pattern_fast");
154 const I& input =
exact(input_);
155 const W& win =
exact(win_);
156 mlc_is(mln_value(I),
bool)::check();
157 mln_precondition(input.is_valid());
162 accu::count_value<bool> accu(
true);
164 tmp = accu::transform_line(accu, input, length, dir);
166 mln_concrete(I) output;
167 initialize(output, input);
169 mln::util::array<
int>
170 q_arr = offsets_wrt(output, win);
174 unsigned hit_ratio =
unsigned(0.2f * length + 1);
175 unsigned miss_ratio =
unsigned(0.95f * length + 1);
177 mln_box_runstart_piter(I) p(output.domain());
180 unsigned pi = output.offset_of_point(p);
181 unsigned *tmp_ptr = &tmp.element(pi);
182 unsigned *end_ptr = tmp_ptr +
ncols;
184 mln_value(I) *out_ptr = &output.element(pi);
186 for (; tmp_ptr < end_ptr; ++out_ptr, ++tmp_ptr)
192 if (length - *tmp_ptr > hit_ratio)
202 is_foreground =
true;
203 for (
unsigned i = 0; i < q_arr.size(); ++i)
204 if ((length - *(tmp_ptr + q_arr[i])) < miss_ratio)
206 is_foreground =
false;
210 *out_ptr = is_foreground;
226 template <
typename I,
typename W>
228 lines_pattern_dispatch(mln::trait::image::value_storage::any,
229 mln::trait::image::value_access::any,
230 mln::trait::image::ext_domain::any,
231 const
Image<I>& input,
unsigned length,
232 unsigned dir, const
Window<W>& win)
238 template <
typename I,
typename W>
240 lines_pattern_dispatch(mln::trait::image::value_storage::one_block,
241 mln::trait::image::value_access::direct,
242 mln::trait::image::ext_domain::some,
243 const
Image<I>& input,
unsigned length,
244 unsigned dir, const
Window<W>& win)
246 return impl::lines_pattern_fast(input, length, dir, win);
250 template <
typename I,
typename W>
252 lines_pattern_dispatch(const
Image<I>& input,
unsigned length,
253 unsigned dir, const
Window<W>& win)
255 return lines_pattern_dispatch(mln_trait_image_value_storage(I)(),
256 mln_trait_image_value_access(I)(),
257 mln_trait_image_ext_domain(I)(),
268 template <
typename I,
typename W>
271 unsigned dir, const
Window<W>& win)
273 mln_trace(
"scribo::primitive::extract::lines_pattern");
275 mlc_is(mln_value(I),
bool)::check();
276 mln_precondition(
exact(input).is_valid());
277 mln_precondition(
exact(win).is_valid());
278 mln_precondition(length != 0);
279 mln_precondition(dir == 0 || dir == 1);
282 output = internal::lines_pattern_dispatch(input, length, dir, win);
288 # endif // ! MLN_INCLUDE_ONLY
297 #endif // ! SCRIBO_PRIMITIVE_EXTRACT_LINES_PATTERN_HH