-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdetection_lines.html
266 lines (265 loc) · 23.9 KB
/
detection_lines.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Detection » Line detectors module | DIPlib | a library for quantitative image analysis</title>
<link rel="stylesheet" href="m-dip+documentation.compiled.css" />
<link rel="icon" href="DIPlib_logo_32.png" type="image/png" />
<link rel="search" type="application/opensearchdescription+xml" href="opensearch.xml" title="Search DIPlib documentation" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#ffffff" />
</head>
<body>
<header><nav id="navigation">
<div class="m-container">
<div class="m-row">
<span id="m-navbar-brand" class="m-col-t-8 m-col-m-none m-left-m">
<a href="https://diplib.org"><img src="DIPlib_logo.svg" alt="" />DIPlib</a><span class="m-breadcrumb">┃</span><a href="index.html" class="m-thin">a library for quantitative image analysis</a><span class="m-breadcrumb">┃</span><a href="https://github.com/DIPlib/diplib/releases/tag/3.5.2" class="m-thin">version 3.5.2</a> </span>
<div class="m-col-t-4 m-hide-m m-text-right m-nopadr">
<a href="#search" class="m-doc-search-icon" title="Search" onclick="return showSearch()"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
<path id="m-doc-search-icon-path" d="m6 0c-3.31 0-6 2.69-6 6 0 3.31 2.69 6 6 6 1.49 0 2.85-0.541 3.89-1.44-0.0164 0.338 0.147 0.759 0.5 1.15l3.22 3.79c0.552 0.614 1.45 0.665 2 0.115 0.55-0.55 0.499-1.45-0.115-2l-3.79-3.22c-0.392-0.353-0.812-0.515-1.15-0.5 0.895-1.05 1.44-2.41 1.44-3.89 0-3.31-2.69-6-6-6zm0 1.56a4.44 4.44 0 0 1 4.44 4.44 4.44 4.44 0 0 1-4.44 4.44 4.44 4.44 0 0 1-4.44-4.44 4.44 4.44 0 0 1 4.44-4.44z"/>
</svg></a>
<a id="m-navbar-show" href="#navigation" title="Show navigation"></a>
<a id="m-navbar-hide" href="#" title="Hide navigation"></a>
</div>
<div id="m-navbar-collapse" class="m-col-t-12 m-show-m m-col-m-none m-right-m">
<div class="m-row">
<ol class="m-col-t-6 m-col-m-none">
<li><a href="pages.html">Pages</a></li>
<li><a href="modules.html">Modules</a></li>
</ol>
<ol class="m-col-t-6 m-col-m-none" start="3">
<li><a href="classes.html">Classes</a></li>
<li><a href="files.html">Files</a></li>
<li class="m-show-m"><a href="#search" class="m-doc-search-icon" title="Search" onclick="return showSearch()"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
<use href="#m-doc-search-icon-path" />
</svg></a></li>
</ol>
</div>
</div>
</div>
</div>
</nav></header>
<main><article>
<div class="m-container m-container-inflatable">
<div class="m-row">
<div class="m-col-l-10 m-push-l-1">
<h1>
<span class="m-breadcrumb"><a href="detection.html">Detection</a> »</span>
Line detectors <span class="m-thin">module</span> <div class="m-doc-include m-code m-thin m-text-right">#include <a href="file--diplib--detection-h.html">"diplib/detection.h"</a></div>
</h1>
<p>Line detection algorithms</p>
<div class="m-block m-default">
<h3>Contents</h3>
<ul>
<li>
Reference
<ul>
<li><a href="#function-members">Functions</a></li>
</ul>
</li>
</ul>
</div>
<p>See <a href="analysis.html#dip-MonogenicSignalAnalysis-Image-CL-ImageRefArray-L-StringArray-CL-dfloat--dfloat--dfloat--dfloat--String-CL"><code>dip::MonogenicSignalAnalysis</code></a> for yet another way to detect lines.</p>
<section id="function-members">
<h2>Functions</h2>
<dl class="m-doc">
<dt>
<span class="m-doc-wrap-bumper">void <a href="#dip-FrangiVesselness-Image-CL-Image-L-FloatArray-CL-FloatArray--String-CL-StringArray-CL" class="m-doc">dip::<wbr />FrangiVesselness</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="supporttypes.html#dip-FloatArray" class="m-doc">dip::FloatArray</a> const& sigmas = {2.0},
<a href="supporttypes.html#dip-FloatArray" class="m-doc">dip::FloatArray</a> parameters = {},
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE,
<a href="supporttypes.html#dip-StringArray" class="m-doc">dip::StringArray</a> const& boundaryCondition = {})</span>
</dt>
<dd>Frangi vessel detector, single scale (Hessian based) <a href="#dip-FrangiVesselness-Image-CL-Image-L-FloatArray-CL-FloatArray--String-CL-StringArray-CL">more...</a></dd>
<dt>
<span class="m-doc-wrap-bumper">void <a href="#dip-MatchedFiltersLineDetector2D-Image-CL-Image-L-dip-dfloat--dip-dfloat--String-CL-StringArray-CL" class="m-doc">dip::<wbr />MatchedFiltersLineDetector2D</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="pixeltypes.html#dip-dfloat" class="m-doc">dip::dfloat</a> sigma = 2.0,
<a href="pixeltypes.html#dip-dfloat" class="m-doc">dip::dfloat</a> length = 10.0,
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE,
<a href="supporttypes.html#dip-StringArray" class="m-doc">dip::StringArray</a> const& boundaryCondition = {})</span>
</dt>
<dd>Matched filters for line detection in 2D <a href="#dip-MatchedFiltersLineDetector2D-Image-CL-Image-L-dip-dfloat--dip-dfloat--String-CL-StringArray-CL">more...</a></dd>
<dt>
<span class="m-doc-wrap-bumper">void <a href="#dip-DanielssonLineDetector-Image-CL-Image-L-dip-FloatArray-CL-String-CL-StringArray-CL" class="m-doc">dip::<wbr />DanielssonLineDetector</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="supporttypes.html#dip-FloatArray" class="m-doc">dip::FloatArray</a> const& sigmas = {2.0},
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE,
<a href="supporttypes.html#dip-StringArray" class="m-doc">dip::StringArray</a> const& boundaryCondition = {})</span>
</dt>
<dd>Danielsson’s Hessian-based line detector <a href="#dip-DanielssonLineDetector-Image-CL-Image-L-dip-FloatArray-CL-String-CL-StringArray-CL">more...</a></dd>
<dt>
<span class="m-doc-wrap-bumper">void <a href="#dip-RORPOLineDetector-Image-CL-Image-L-dip-uint--String-CL" class="m-doc">dip::<wbr />RORPOLineDetector</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="supporttypes.html#dip-uint" class="m-doc">dip::uint</a> length = 15,
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE)</span>
</dt>
<dd>Line detector based on robust path openings <a href="#dip-RORPOLineDetector-Image-CL-Image-L-dip-uint--String-CL">more...</a></dd>
</dl>
</section>
<section>
<h2>Function documentation</h2>
<section class="m-doc-details" id="dip-FrangiVesselness-Image-CL-Image-L-FloatArray-CL-FloatArray--String-CL-StringArray-CL"><div>
<h3>
<span class="m-doc-wrap-bumper">void
</span><span class="m-doc-wrap"><span class="m-doc-wrap-bumper"><a href="#dip-FrangiVesselness-Image-CL-Image-L-FloatArray-CL-FloatArray--String-CL-StringArray-CL" class="m-doc-self">dip::<wbr />FrangiVesselness</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="supporttypes.html#dip-FloatArray" class="m-doc">dip::FloatArray</a> const& sigmas = {2.0},
<a href="supporttypes.html#dip-FloatArray" class="m-doc">dip::FloatArray</a> parameters = {},
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE,
<a href="supporttypes.html#dip-StringArray" class="m-doc">dip::StringArray</a> const& boundaryCondition = {})</span></span>
</h3>
<p>Frangi vessel detector, single scale (Hessian based)</p>
<p>Frangi’s vesselness measure is based on the eigenvalues of the Hessian matrix. The core concept is that
one eigenvalue must be significantly smaller than the others for a local region to resemble a line.</p>
<p><code>sigmas</code> are used for the computation of the Hessian (which uses Gaussian gradients, see <a href="linear.html#dip-Hessian-Image-CL-Image-L-FloatArray--String-CL-StringArray-CL-BooleanArray--dfloat-"><code>dip::Hessian</code></a>),
and determine the scale. To detect wider vessels, increase <code>sigmas</code>.</p>
<p><code>parameters</code> are the two (<em>β</em> and <em>c</em> in 2D) or three (<em>α</em>, <em>β</em> and <em>c</em> in 3D) thresholds used
in the method. An empty array indicates the default values (<code>{0.5, 15}</code> in 2D and <code>{0.5, 0.5, 500}</code> in 3D).</p>
<p><code>polarity</code> indicates whether to look for light lines on a dark background (<code>"white"</code>) or dark lines on a light
background (<code>"black"</code>). The sign of the one (2D) or two (3D) larger eigenvalues are examined at each pixel to
determine the polarity of the line, if the signs don’t match, the pixel is set to 0.</p>
<p><code>in</code> must be scalar, real-valued, and either 2D or 3D. This function has not been generalized to
other dimensionalities.</p>
<p>The complete multi-scale vessel detector simply applies this function at multiple scales and takes the maximum
response at each scale. Even though the original paper didn’t mention this, best results are obtained when
scaling the input image with the square of the sigma:</p>
<div class="m-code"><pre><span></span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">scales</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="p">};</span>
<span class="n">dip</span><span class="o">::</span><span class="n">Image</span><span class="w"> </span><span class="n">out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dip</span><span class="o">::</span><span class="n">FrangiVesselness</span><span class="p">(</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">scales</span><span class="p">[</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">scales</span><span class="p">[</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">scales</span><span class="p">[</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">);</span>
<span class="k">for</span><span class="p">(</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="kt">size_t</span><span class="w"> </span><span class="n">ii</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="n">ii</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">scales</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">ii</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">dip</span><span class="o">::</span><span class="n">Supremum</span><span class="p">(</span><span class="w"> </span><span class="n">out</span><span class="p">,</span><span class="w"> </span><span class="n">dip</span><span class="o">::</span><span class="n">FrangiVesselness</span><span class="p">(</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">scales</span><span class="p">[</span><span class="w"> </span><span class="n">ii</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">scales</span><span class="p">[</span><span class="w"> </span><span class="n">ii</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">scales</span><span class="p">[</span><span class="w"> </span><span class="n">ii</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="n">out</span><span class="w"> </span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
<aside class="m-note m-default">
<h4>Literature</h4>
<ul>
<li>A.F. Frangi, W.J. Niessen, K.L. Vincken and M.A. Viergever, “Multiscale Vessel Enhancement Filtering”,
in: Medical Image Computing and Computer-Assisted Intervention (MICCAI‘98), LNCS 1496:130-137, 1998.</li>
</ul>
</aside>
</div></section>
<section class="m-doc-details" id="dip-MatchedFiltersLineDetector2D-Image-CL-Image-L-dip-dfloat--dip-dfloat--String-CL-StringArray-CL"><div>
<h3>
<span class="m-doc-wrap-bumper">void
</span><span class="m-doc-wrap"><span class="m-doc-wrap-bumper"><a href="#dip-MatchedFiltersLineDetector2D-Image-CL-Image-L-dip-dfloat--dip-dfloat--String-CL-StringArray-CL" class="m-doc-self">dip::<wbr />MatchedFiltersLineDetector2D</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="pixeltypes.html#dip-dfloat" class="m-doc">dip::dfloat</a> sigma = 2.0,
<a href="pixeltypes.html#dip-dfloat" class="m-doc">dip::dfloat</a> length = 10.0,
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE,
<a href="supporttypes.html#dip-StringArray" class="m-doc">dip::StringArray</a> const& boundaryCondition = {})</span></span>
</h3>
<p>Matched filters for line detection in 2D</p>
<p>Matched filters are a filter bank designed to match the shape being detected. In this case, it is a line-line
filter of length <code>length</code>, with a Gaussian profile (<code>sigma</code> determines the width). The filter has an average of
zero so that it yields a zero response in flat areas. It is created at 12 different orientations (thus using 15
degree steps to cover the full 180 degree half-circle), and the maximum response over all orientations is returned.</p>
<p><code>polarity</code> indicates whether to look for light lines on a dark background (<code>"white"</code>) or dark lines on a light
background (<code>"black"</code>). <code>in</code> must be scalar, real-valued, and 2D.</p>
<aside class="m-note m-default">
<h4>Literature</h4>
<ul>
<li>S. Chaudhuri, S. Chatterjee, N. Katz, M. Nelson, and M. Goldbaum, “Detection of Blood Vessels in Retinal Images
Using Two-Dimensional Matched Filters”, IEEE Transactions on Medical Imaging 8(3):263-269, 1989</li>
</ul>
</aside>
</div></section>
<section class="m-doc-details" id="dip-DanielssonLineDetector-Image-CL-Image-L-dip-FloatArray-CL-String-CL-StringArray-CL"><div>
<h3>
<span class="m-doc-wrap-bumper">void
</span><span class="m-doc-wrap"><span class="m-doc-wrap-bumper"><a href="#dip-DanielssonLineDetector-Image-CL-Image-L-dip-FloatArray-CL-String-CL-StringArray-CL" class="m-doc-self">dip::<wbr />DanielssonLineDetector</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="supporttypes.html#dip-FloatArray" class="m-doc">dip::FloatArray</a> const& sigmas = {2.0},
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE,
<a href="supporttypes.html#dip-StringArray" class="m-doc">dip::StringArray</a> const& boundaryCondition = {})</span></span>
</h3>
<p>Danielsson’s Hessian-based line detector</p>
<p>This is a different approach to detecting lines based on the Hessian matrix (2nd order derivatives) compared
to Frangi’s vesselness measure (<a href="detection_lines.html#dip-FrangiVesselness-Image-CL-Image-L-FloatArray-CL-FloatArray--String-CL-StringArray-CL"><code>dip::FrangiVesselness</code></a>). It is perfectly isotropic, but has some response
also to edges, especially in 2D.</p>
<p><code>sigmas</code> are used for the computation of the Hessian (which uses Gaussian gradients, see <a href="linear.html#dip-Hessian-Image-CL-Image-L-FloatArray--String-CL-StringArray-CL-BooleanArray--dfloat-"><code>dip::Hessian</code></a>),
and determine the scale. To detect wider lines, increase <code>sigmas</code>.</p>
<p><code>polarity</code> indicates whether to look for light lines on a dark background (<code>"white"</code>) or dark lines on a light
background (<code>"black"</code>). <code>in</code> must be scalar, real-valued, and either 2D or 3D.</p>
<aside class="m-note m-default">
<h4>Literature</h4>
<ul>
<li>P.E. Danielson, Q. Lin and Q.Z. Ye, “Efficient detection of second degree variations in 2D and 3D images”,
Journal of Visual Communication and Image Representation 12, 255–305, 2001.</li>
</ul>
</aside>
</div></section>
<section class="m-doc-details" id="dip-RORPOLineDetector-Image-CL-Image-L-dip-uint--String-CL"><div>
<h3>
<span class="m-doc-wrap-bumper">void
</span><span class="m-doc-wrap"><span class="m-doc-wrap-bumper"><a href="#dip-RORPOLineDetector-Image-CL-Image-L-dip-uint--String-CL" class="m-doc-self">dip::<wbr />RORPOLineDetector</a>(</span><span class="m-doc-wrap"><a href="dip-Image.html" class="m-doc">dip::Image</a> const& in,
<a href="dip-Image.html" class="m-doc">dip::Image</a>& out,
<a href="supporttypes.html#dip-uint" class="m-doc">dip::uint</a> length = 15,
<a href="supporttypes.html#dip-String" class="m-doc">dip::String</a> const& polarity = S::WHITE)</span></span>
</h3>
<p>Line detector based on robust path openings</p>
<p>RORPO stands for Ranking the Orientation Responses of Path Operators. It filters <code>in</code> with 4 (2D)
or 7 (3D) different directions of path openings (see <a href="morphology.html#dip-DirectedPathOpening-Image-CL-Image-CL-Image-L-IntegerArray--String-CL-StringSet-CL"><code>dip::DirectedPathOpening</code></a>), ranks the results
point-wise, and compares appropriate ranks to determine if a pixel belongs to a line or not.</p>
<p><code>length</code> is the length of the path operator. Longer paths make for a more selective filter that requires
lines to be straighter.</p>
<p><code>polarity</code> indicates whether to look for light lines on a dark background (<code>"white"</code>) or dark lines on a light
background (<code>"black"</code>). <code>in</code> must be scalar, real-valued, and either 2D or 3D.</p>
<aside class="m-note m-default">
<h4>Literature</h4>
<ul>
<li>O. Merveille, H. Talbot, L. Najman, and N. Passat, “Curvilinear Structure Analysis by Ranking the Orientation
Responses of Path Operators”, IEEE Transactions on Pattern Analysis and Machine Intelligence 40(2):304-317, 2018.</li>
</ul>
</aside>
</div></section>
</section>
</div>
</div>
</div>
</article></main>
<div class="m-doc-search" id="search">
<a href="#!" onclick="return hideSearch()"></a>
<div class="m-container">
<div class="m-row">
<div class="m-col-m-8 m-push-m-2">
<div class="m-doc-search-header m-text m-small">
<div><span class="m-label m-default">Tab</span> / <span class="m-label m-default">T</span> to search, <span class="m-label m-default">Esc</span> to close</div>
<div id="search-symbolcount">…</div>
</div>
<div class="m-doc-search-content">
<form action="https://diplib.org/diplib-docs/#search">
<input type="search" name="q" id="search-input" placeholder="Loading …" disabled="disabled" autofocus="autofocus" autocomplete="off" spellcheck="false" />
</form>
<noscript class="m-text m-danger m-text-center">Unlike everything else in the docs, the search functionality <em>requires</em> JavaScript. Enable it or <a href="https://google.com/search?q=site:diplib.org+">use an external search engine</a>.</noscript>
<div id="search-help" class="m-text m-dim m-text-center">
<p class="m-noindent">Search for symbols, directories, files, pages or modules.
You can omit any prefix from the symbol or file path; adding a <code>:</code> or
<code>/</code> suffix lists all members of given symbol or directory.</p>
<p class="m-noindent">Use <span class="m-label m-dim">↓</span> / <span class="m-label m-dim">↑</span> to navigate through the list,
<span class="m-label m-dim">Enter</span> to go.
<span class="m-label m-dim">Tab</span> autocompletes common prefix.
You can copy a link to the result using <span class="m-label m-dim">⌘</span> <span class="m-label m-dim">L</span>,
or <span class="m-label m-dim">⌘</span> <span class="m-label m-dim">M</span> to copy a Markdown link.</p>
</div>
<div id="search-notfound" class="m-text m-warning m-text-center">Sorry, nothing was found.<br />Maybe try a full-text <a href="#" id="search-external" data-search-engine="https://google.com/search?q=site:diplib.org+{query}">search with external engine</a>?</div>
<ul id="search-results"></ul>
</div>
</div>
</div>
</div>
</div>
<script src="search-v1.js"></script>
<script src="searchdata-v1.js" async="async"></script>
<footer><nav>
<div class="m-container">
<div class="m-row">
<div class="m-col-l-10 m-push-l-1">
<p>DIPlib, a library for quantitative image analysis. Documentation compiled with <a href="https://crisluengo.github.io/doxpp/">dox++</a> and styled with <a href="https://mcss.mosra.cz/">m.css</a>.</p>
</div>
</div>
</div>
</nav></footer>
</body>
</html>