-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnotebook.html
598 lines (556 loc) · 94.1 KB
/
notebook.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
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
<!doctype html>
<html style='font-size:16px !important'>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<title>notebook</title><link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 40px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
@media screen and (max-width: 500px) {
body.typora-export { padding-left: 0px; padding-right: 0px; }
#write { padding-left: 20px; padding-right: 20px; }
.CodeMirror-sizer { margin-left: 0px !important; }
.CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
#write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
.typora-export * { -webkit-print-color-adjust: exact; }
html.blink-to-pdf { font-size: 13px; }
.typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
.typora-export #write::after { height: 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
svg[id^="mermaidChart"] { line-height: 1em; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
mark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }
.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
@media print {
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}
:root {
--side-bar-bg-color: #fafafa;
--control-text-color: #777;
}
@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);
html {
font-size: 16px;
}
body {
font-family: "Open Sans","Clear Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
color: rgb(51, 51, 51);
line-height: 1.6;
}
#write {
max-width: 860px;
margin: 0 auto;
padding: 30px;
padding-bottom: 100px;
}
@media only screen and (min-width: 1400px) {
#write {
max-width: 1024px;
}
}
@media only screen and (min-width: 1800px) {
#write {
max-width: 1200px;
}
}
#write > ul:first-child,
#write > ol:first-child{
margin-top: 30px;
}
a {
color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
position: relative;
margin-top: 1rem;
margin-bottom: 1rem;
font-weight: bold;
line-height: 1.4;
cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
text-decoration: none;
}
h1 tt,
h1 code {
font-size: inherit;
}
h2 tt,
h2 code {
font-size: inherit;
}
h3 tt,
h3 code {
font-size: inherit;
}
h4 tt,
h4 code {
font-size: inherit;
}
h5 tt,
h5 code {
font-size: inherit;
}
h6 tt,
h6 code {
font-size: inherit;
}
h1 {
padding-bottom: .3em;
font-size: 2.25em;
line-height: 1.2;
border-bottom: 1px solid #eee;
}
h2 {
padding-bottom: .3em;
font-size: 1.75em;
line-height: 1.225;
border-bottom: 1px solid #eee;
}
h3 {
font-size: 1.5em;
line-height: 1.43;
}
h4 {
font-size: 1.25em;
}
h5 {
font-size: 1em;
}
h6 {
font-size: 1em;
color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
margin: 0.8em 0;
}
li>ol,
li>ul {
margin: 0 0;
}
hr {
height: 2px;
padding: 0;
margin: 16px 0;
background-color: #e7e7e7;
border: 0 none;
overflow: hidden;
box-sizing: content-box;
}
li p.first {
display: inline-block;
}
ul,
ol {
padding-left: 30px;
}
ul:first-child,
ol:first-child {
margin-top: 0;
}
ul:last-child,
ol:last-child {
margin-bottom: 0;
}
blockquote {
border-left: 4px solid #dfe2e5;
padding: 0 15px;
color: #777777;
}
blockquote blockquote {
padding-right: 0;
}
table {
padding: 0;
word-break: initial;
}
table tr {
border-top: 1px solid #dfe2e5;
margin: 0;
padding: 0;
}
table tr:nth-child(2n),
thead {
background-color: #f8f8f8;
}
table tr th {
font-weight: bold;
border: 1px solid #dfe2e5;
border-bottom: 0;
margin: 0;
padding: 6px 13px;
}
table tr td {
border: 1px solid #dfe2e5;
margin: 0;
padding: 6px 13px;
}
table tr th:first-child,
table tr td:first-child {
margin-top: 0;
}
table tr th:last-child,
table tr td:last-child {
margin-bottom: 0;
}
.CodeMirror-lines {
padding-left: 4px;
}
.code-tooltip {
box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
border-top: 1px solid #eef2f2;
}
.md-fences,
code,
tt {
border: 1px solid #e7eaed;
background-color: #f8f8f8;
border-radius: 3px;
padding: 0;
padding: 2px 4px 0px 4px;
font-size: 0.9em;
}
code {
background-color: #f3f4f4;
padding: 0 2px 0 2px;
}
.md-fences {
margin-bottom: 15px;
margin-top: 15px;
padding-top: 8px;
padding-bottom: 6px;
}
.md-task-list-item > input {
margin-left: -1.3em;
}
@media print {
html {
font-size: 13px;
}
table,
pre {
page-break-inside: avoid;
}
pre {
word-wrap: break-word;
}
}
.md-fences {
background-color: #f8f8f8;
}
#write pre.md-meta-block {
padding: 1rem;
font-size: 85%;
line-height: 1.45;
background-color: #f7f7f7;
border: 0;
border-radius: 3px;
color: #777777;
margin-top: 0 !important;
}
.mathjax-block>.code-tooltip {
bottom: .375rem;
}
.md-mathjax-midline {
background: #fafafa;
}
#write>h3.md-focus:before{
left: -1.5625rem;
top: .375rem;
}
#write>h4.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h5.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h6.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
.md-image>.md-meta {
/*border: 1px solid #ddd;*/
border-radius: 3px;
padding: 2px 0px 0px 4px;
font-size: 0.9em;
color: inherit;
}
.md-tag {
color: #a7a7a7;
opacity: 1;
}
.md-toc {
margin-top:20px;
padding-bottom:20px;
}
.sidebar-tabs {
border-bottom: none;
}
#typora-quick-open {
border: 1px solid #ddd;
background-color: #f8f8f8;
}
#typora-quick-open-item {
background-color: #FAFAFA;
border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
border-style: solid;
border-width: 1px;
}
/** focus mode */
.on-focus-mode blockquote {
border-left-color: rgba(85, 85, 85, 0.12);
}
header, .context-menu, .megamenu-content, footer{
font-family: "Segoe UI", "Arial", sans-serif;
}
.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
visibility: visible;
}
.mac-seamless-mode #typora-sidebar {
background-color: #fafafa;
background-color: var(--side-bar-bg-color);
}
.md-lang {
color: #b4654d;
}
.html-for-mac .context-menu {
--item-hover-bg-color: #E6F0FE;
}
#md-notification .btn {
border: 0;
}
.dropdown-menu .divider {
border-color: #e5e5e5;
}
.ty-preferences .window-content {
background-color: #fafafa;
}
.ty-preferences .nav-group-item.active {
color: white;
background: #999;
}
</style>
</head>
<body class='typora-export' >
<div id='write' class = 'is-node'><h3><a name="table-of-content" class="md-header-anchor"></a><span>Table of Content</span></h3><ol start='' ><li><a href='#subject-study-the-difference-of-rgb-and-hsv'><span>Subject: </span><u><span>Study the difference of RGB and HSV</span></u></a></li><li><a href='#subject-apply-filters-to-smooth-the-image'><span>Subject: </span><u><span>Apply filters to smooth the image</span></u></a></li><li><a href='#subject-analyze-the-usage-of-lpf-and-open-operation-in-hsv-space'><span>Subject: </span><u><span>Analyze the usage of LPF and Open Operation in HSV space</span></u></a></li><li><a href='#subject-ufix-the-value-range-of-each-color-in-hsv-spaceu'><span>Subject: </span><u><span>Fix the value range of each color in HSV space</span></u></a></li><li><a href='#subject-uuse-green-block-as-the-beaconu'><span>Subject: </span><u><span>Use green block as the beacon</span></u></a></li><li><a href='#visualize-task-5'><span>Subject: </span><u><span>Visualize task 5</span></u></a></li></ol><hr /><h3><a name="subject-study-the-difference-of-rgb-and-hsv" class="md-header-anchor"></a><span>Subject: Study the difference of RGB and HSV</span></h3><h4><a name="date-uapril-7u---author-uchang-shuu" class="md-header-anchor"></a><span>Date: </span><u><span>April 7</span></u><span> Author: </span><u><span>Chang Shu</span></u></h4><h5><a name="purpose" class="md-header-anchor"></a><span>Purpose:</span></h5><p><span>There are many color space, such as RGB, HSV, HSI, YCbCr, etc. They have different usage and we need to choose one for finishing our tasks. The most commonly used ones in digital image processing are RGB and HSV. So I just compare these two.</span></p><h5><a name="procedure" class="md-header-anchor"></a><span>Procedure:</span></h5><p><span>This experiment contains two parts:</span></p><ol start='' ><li><span>search for the two color space online</span></li><li><span>Make a comparison between RGB and HSV color space</span></li></ol><h5><a name="results" class="md-header-anchor"></a><span>Results:</span></h5><p><img src="imgs/rgb.png" alt="rgb.png" style="zoom: 100%;" /></p><p><span>An RGB color can be understood by thinking of it as all possible colors that can be made from three colored lights for red, green, and blue. Imagine, for example, shining three lights together onto a white wall in a dark room: one red light, one green light, and one blue light, each with dimmers. If only the red light is on, the wall will be red. If only the green light is on, the wall will look green. If the red and green lights are on together, the wall will look yellow. Dim the red light and the wall will become more of a yellow-green. Dim the green light instead, and the wall will become more orange. Bringing up the blue light a bit will cause the orange to become less saturated and more whitish. In all, each setting of the three dimmers will produce a different result, either in color or in brightness or both. The set of all possible results is the gamut defined by those particular color lamps. Swap the red lamp for one of a different brand that is slightly more orange, and there will be a slightly different gamut, since the set of all colors that can be produced with the three lights will be changed.</span></p><p><img src="imgs/hsv.png" alt="hsv.png" style="zoom: 100%;" /></p><p><span>HSV (hue, saturation, value) is an alternative representation of the RGB color model. The HSV representation models the way paints of different colors mix together, with the saturation dimension resembling various tints of brightly colored paint, and the value dimension resembling the mixture of those paints with varying amounts of black or white paint.</span></p><p><span>Since we need to do the color recognition, HSV color space will be analyzed in our further experiment.</span></p><h3><a name="subject-apply-filters-to-smooth-the-image" class="md-header-anchor"></a><span>Subject: Apply filters to smooth the image</span></h3><h4><a name="date-umay-1u---author-uchang-shuu" class="md-header-anchor"></a><span>Date: </span><u><span>May 1</span></u><span> Author: </span><u><span>Chang Shu</span></u></h4><h5><a name="purpose-n35" class="md-header-anchor"></a><span>Purpose:</span></h5><p><span>Smoothing is a key step in digital image processing. In practice, LPF is usually implemented to smooth the high frequency signal in the image, namely making the difference between two neighbor pixels smaller. This can make color recognition much easier.</span></p><h5><a name="procedure-n37" class="md-header-anchor"></a><span>Procedure:</span></h5><p><span>This experiment contains two parts:</span></p><ol start='' ><li><span>implement four different LPF on the image</span></li><li><span>plot the blurred images and compare them</span></li></ol><h5><a name="experiment" class="md-header-anchor"></a><span>Experiment:</span></h5><p><span>The code is shown below.</span></p><pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">image</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">imread</span>(<span class="cm-variable">args</span>[<span class="cm-string">'image'</span>])</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">blur</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">blur</span>(<span class="cm-variable">image</span>,(<span class="cm-number">5</span>,<span class="cm-number">5</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">GaussianBlur</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">GaussianBlur</span>(<span class="cm-variable">image</span>, (<span class="cm-number">5</span>, <span class="cm-number">5</span>), <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">median</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">medianBlur</span>(<span class="cm-variable">image</span>,<span class="cm-number">5</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">bilateralFilter</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">bilateralFilter</span>(<span class="cm-variable">image</span>,<span class="cm-number">9</span>,<span class="cm-number">75</span>,<span class="cm-number">75</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">231</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">image</span>[...,::<span class="cm-operator">-</span><span class="cm-number">1</span>]),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"original"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">232</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">blur</span>[...,::<span class="cm-operator">-</span><span class="cm-number">1</span>]),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"blurred"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">233</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">GaussianBlur</span>[...,::<span class="cm-operator">-</span><span class="cm-number">1</span>]),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"Gaussian blurred"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">234</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">median</span>[...,::<span class="cm-operator">-</span><span class="cm-number">1</span>]),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"median filtered"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">235</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">bilateralFilter</span>[...,::<span class="cm-operator">-</span><span class="cm-number">1</span>]),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"bilateral filtered"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">show</span>()</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 276px;"></div><div class="CodeMirror-gutters" style="display: none; height: 276px;"></div></div></div></pre><h5><a name="results-n47" class="md-header-anchor"></a><span>Results:</span></h5><p><img src="imgs/filters.png" alt="filters.png" style="zoom: 40%;" /></p><p><span>As we can see from above, four blurred images look smoother than original image. Among them, I choose the GaussianBlur as the filter in our following process.</span></p><p> </p><h3><a name="subject-analyze-the-usage-of-lpf-and-open-operation-in-hsv-space" class="md-header-anchor"></a><span>Subject: Analyze the usage of LPF and Open Operation in HSV space</span></h3><h4><a name="date-umay-13u---author-uchang-shuu" class="md-header-anchor"></a><span>Date: </span><u><span>May 13</span></u><span> Author: </span><u><span>Chang Shu</span></u></h4><h5><a name="purpose-n53" class="md-header-anchor"></a><span>Purpose:</span></h5><p><span>Last time, I study the usage of different filters in RGB color space, which smooths the image quite a lot. However, our target is to remove the noise in the interested color not in the whole image. Smoothing the whole image may even makes it worse to recognize and filter the color. Hence, I do an experiment to see the effect of LPF in removing noise HSV color space and compare it with the opening operation.</span></p><h5><a name="procedure-n55" class="md-header-anchor"></a><span>Procedure:</span></h5><p><span>This experiment contains two parts:</span></p><ol start='' ><li><span>implement Gaussian blur and opening operation on the image in HSV space</span></li><li><span>plot the binary HSV images and compare them</span></li></ol><h5><a name="experiment-n62" class="md-header-anchor"></a><span>Experiment:</span></h5><p><span>The code is shown below.</span></p><pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">image</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">imread</span>(<span class="cm-variable">args</span>[<span class="cm-string">'image'</span>])</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">image_hsv</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">cvtColor</span>(<span class="cm-variable">image</span>, <span class="cm-variable">cv2</span>.<span class="cm-property">COLOR_BGR2HSV</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">GaussianBlur</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">GaussianBlur</span>(<span class="cm-variable">image_hsv</span>, (<span class="cm-number">9</span>, <span class="cm-number">9</span>), <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">kernel</span> = <span class="cm-variable">np</span>.<span class="cm-property">ones</span>([<span class="cm-number">7</span>, <span class="cm-number">7</span>], <span class="cm-variable">np</span>.<span class="cm-property">uint8</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">binary_hsv</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">inRange</span>(<span class="cm-variable">image_hsv</span>, (<span class="cm-number">24</span>, <span class="cm-number">70</span>, <span class="cm-number">0</span>), (<span class="cm-number">32</span>, <span class="cm-number">255</span>, <span class="cm-number">180</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">binary_Gaussian</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">inRange</span>(<span class="cm-variable">GaussianBlur</span>, (<span class="cm-number">24</span>, <span class="cm-number">70</span>, <span class="cm-number">0</span>), (<span class="cm-number">32</span>, <span class="cm-number">255</span>, <span class="cm-number">180</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">binary_erode</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">erode</span>(<span class="cm-variable">binary_hsv</span>, <span class="cm-variable">kernel</span>, <span class="cm-variable">iterations</span>=<span class="cm-number">1</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">binary_open</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">dilate</span>(<span class="cm-variable">binary_erode</span>, <span class="cm-variable">kernel</span>, <span class="cm-variable">iterations</span>=<span class="cm-number">1</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">binary_Gaussian_erode</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">erode</span>(<span class="cm-variable">binary_Gaussian</span>, <span class="cm-variable">kernel</span>, <span class="cm-variable">iterations</span>=<span class="cm-number">1</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">binary_Gaussian_open</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">dilate</span>(<span class="cm-variable">binary_Gaussian_erode</span>, <span class="cm-variable">kernel</span>, <span class="cm-variable">iterations</span>=<span class="cm-number">1</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">151</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">image_hsv</span>),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"original image in HSV"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">152</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">binary_hsv</span>),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"thresholding without LPF and Opening"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">153</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">binary_Gaussian</span>),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"thresholding with LPF"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">154</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">binary_open</span>),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"thresholding with Opening"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">subplot</span>(<span class="cm-number">155</span>),<span class="cm-variable">plt</span>.<span class="cm-property">imshow</span>(<span class="cm-variable">binary_Gaussian_open</span>),<span class="cm-variable">plt</span>.<span class="cm-property">title</span>(<span class="cm-string">"thresholding with LPF and Opening"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">show</span>()</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 460px;"></div><div class="CodeMirror-gutters" style="display: none; height: 460px;"></div></div></div></pre><h5><a name="results-n65" class="md-header-anchor"></a><span>Results:</span></h5><p><img src="imgs/LPF_Open.png" alt="LPF_Open.png" style="zoom: 60%;" />
<span>In the figure above, I add random noise to the image and the Gaussian blur reduce the noise to a large extent. However, opening operation seems to work better than the Gaussian blur. So I add even more noise to the images to see if this situation still holds true. If it is, then there is no need to implement LPF in the image processing part.</span></p><p><img src="imgs/LPF_Open1.png" alt="LPF_Open1.png" style="zoom: 60%;" />
<span>As is shown in the second image, the LPF does not remove the noise, but brings about more noise. The reason is the Gaussian filter actually work on the whole image instead of our interested color. It can make pixels original not in the range of the color we want inside.</span></p><p><span>However, this doesn't mean the LPF is unnecessary when we look at the image processed by opening operation. As we can see, all the image is eroded as the original image suffers from a high level of discontinuity due to the noise. And with a combination of LPF and opening operation, the road is preserved.</span></p><h3><a name="subject-ufix-the-value-range-of-each-color-in-hsv-spaceu" class="md-header-anchor"></a><span>Subject: </span><u><span>Fix the value range of each color in HSV space</span></u></h3><h4><a name="date-umay-18u---author-uchang-shuu" class="md-header-anchor"></a><span>Date: </span><u><span>May 18</span></u><span> Author: </span><u><span>Chang Shu</span></u></h4><h5><a name="purpose-n72" class="md-header-anchor"></a><span>Purpose:</span></h5><p><span>In our project, we need to recognize several colors, including orange, yellow, red, purple. In digital image processing, common practice has it that difference colors are separated in HSV color space. In order to separate different colors by their value ranges, I conduct the following experiment.</span></p><h5><a name="procedure-n74" class="md-header-anchor"></a><span>Procedure:</span></h5><p><span>This experiment contains two parts:</span></p><ol start='' ><li><span>Plot the histogram of each color in HSV color space to obtain a rough range</span></li><li><span>fine-tune this range on images from the webots camera with GUI</span></li></ol><h5><a name="experiment-n81" class="md-header-anchor"></a><span>Experiment:</span></h5><p><span>The code is shown below.</span></p><pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">#!/usr/bin/env python</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># -*- coding: utf-8 -*-</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># USAGE: You need to specify a filter</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">#</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># (python) color_thresholding --filter RGB --image /path/to/image.png</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># or</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment"># (python) color_thresholding --filter HSV --image /path/to/image.png</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">argparse</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">cv2</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">import</span> <span class="cm-variable">numpy</span> <span class="cm-keyword">as</span> <span class="cm-variable">np</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">from</span> <span class="cm-variable">matplotlib</span> <span class="cm-keyword">import</span> <span class="cm-variable">pyplot</span> <span class="cm-keyword">as</span> <span class="cm-variable">plt</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">def</span> <span class="cm-def">callback</span>(<span class="cm-variable">value</span>):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">pass</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">def</span> <span class="cm-def">setup_trackbars</span>(<span class="cm-variable">range_filter</span>):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">namedWindow</span>(<span class="cm-string">"Trackbars"</span>, <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">for</span> <span class="cm-variable">i</span> <span class="cm-keyword">in</span> [<span class="cm-string">"MIN"</span>, <span class="cm-string">"MAX"</span>]:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">v</span> = <span class="cm-number">0</span> <span class="cm-keyword">if</span> <span class="cm-variable">i</span> == <span class="cm-string">"MIN"</span> <span class="cm-keyword">else</span> <span class="cm-number">255</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">for</span> <span class="cm-variable">j</span> <span class="cm-keyword">in</span> <span class="cm-variable">range_filter</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">createTrackbar</span>(<span class="cm-string">"%s_%s"</span> <span class="cm-operator">%</span> (<span class="cm-variable">j</span>, <span class="cm-variable">i</span>), <span class="cm-string">"Trackbars"</span>, <span class="cm-variable">v</span>, <span class="cm-number">255</span>, <span class="cm-variable">callback</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">def</span> <span class="cm-def">get_arguments</span>():</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ap</span> = <span class="cm-variable">argparse</span>.<span class="cm-property">ArgumentParser</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ap</span>.<span class="cm-property">add_argument</span>(<span class="cm-string">'-f'</span>, <span class="cm-string">'--filter'</span>, <span class="cm-variable">required</span>=<span class="cm-keyword">True</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-builtin">help</span>=<span class="cm-string">'Range filter. RGB or HSV'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ap</span>.<span class="cm-property">add_argument</span>(<span class="cm-string">'-i'</span>, <span class="cm-string">'--image'</span>, <span class="cm-variable">required</span>=<span class="cm-keyword">False</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-builtin">help</span>=<span class="cm-string">'Path to the image'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ap</span>.<span class="cm-property">add_argument</span>(<span class="cm-string">'-p'</span>, <span class="cm-string">'--preview'</span>, <span class="cm-variable">required</span>=<span class="cm-keyword">False</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-builtin">help</span>=<span class="cm-string">'Show a preview of the image after applying the mask'</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">action</span>=<span class="cm-string">'store_true'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">args</span> = <span class="cm-builtin">vars</span>(<span class="cm-variable">ap</span>.<span class="cm-property">parse_args</span>())</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> <span class="cm-keyword">not</span> <span class="cm-builtin">bool</span>(<span class="cm-variable">args</span>[<span class="cm-string">'image'</span>]):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ap</span>.<span class="cm-property">error</span>(<span class="cm-string">"Please specify only one image source"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> <span class="cm-keyword">not</span> <span class="cm-variable">args</span>[<span class="cm-string">'filter'</span>].<span class="cm-property">upper</span>() <span class="cm-keyword">in</span> [<span class="cm-string">'RGB'</span>, <span class="cm-string">'HSV'</span>]:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ap</span>.<span class="cm-property">error</span>(<span class="cm-string">"Please specify a correct filter."</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">return</span> <span class="cm-variable">args</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">def</span> <span class="cm-def">get_trackbar_values</span>(<span class="cm-variable">range_filter</span>):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">values</span> = []</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">for</span> <span class="cm-variable">i</span> <span class="cm-keyword">in</span> [<span class="cm-string">"MIN"</span>, <span class="cm-string">"MAX"</span>]:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">for</span> <span class="cm-variable">j</span> <span class="cm-keyword">in</span> <span class="cm-variable">range_filter</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">v</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">getTrackbarPos</span>(<span class="cm-string">"%s_%s"</span> <span class="cm-operator">%</span> (<span class="cm-variable">j</span>, <span class="cm-variable">i</span>), <span class="cm-string">"Trackbars"</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">values</span>.<span class="cm-property">append</span>(<span class="cm-variable">v</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">return</span> <span class="cm-variable">values</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">def</span> <span class="cm-def">main</span>():</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">args</span> = <span class="cm-variable">get_arguments</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">range_filter</span> = <span class="cm-variable">args</span>[<span class="cm-string">'filter'</span>].<span class="cm-property">upper</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># Compare different filters</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">image</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">imread</span>(<span class="cm-variable">args</span>[<span class="cm-string">'image'</span>])</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># blur = cv2.blur(image,(5,5))</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">GaussianBlur</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">GaussianBlur</span>(<span class="cm-variable">image</span>, (<span class="cm-number">5</span>, <span class="cm-number">5</span>), <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># median = cv2.medianBlur(image,5)</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># bilateralFilter = cv2.bilateralFilter(image,9,75,75)</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># plt.subplot(231),plt.imshow(image[...,::-1]),plt.title("original")</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># plt.subplot(232),plt.imshow(blur[...,::-1]),plt.title("blurred")</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># plt.subplot(233),plt.imshow(GaussianBlur[...,::-1]),plt.title("Gaussian blurred")</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># plt.subplot(234),plt.imshow(median[...,::-1]),plt.title("median filtered")</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># plt.subplot(235),plt.imshow(bilateralFilter[...,::-1]),plt.title("bilateral filtered")</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># plt.show()</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># Plot Histogram in HSV Color Space</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">blur</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">cvtColor</span>(<span class="cm-variable">GaussianBlur</span>,<span class="cm-variable">cv2</span>.<span class="cm-property">COLOR_BGR2HSV</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># Plot HSV Histgram</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">fig</span>, <span class="cm-variable">ax</span> = <span class="cm-variable">plt</span>.<span class="cm-property">subplots</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">hsvColor</span> = (<span class="cm-string">'y'</span>,<span class="cm-string">'g'</span>,<span class="cm-string">'k'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">bin_win</span> = <span class="cm-number">3</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">bin_num</span> = <span class="cm-builtin">int</span>(<span class="cm-number">256</span><span class="cm-operator">/</span><span class="cm-variable">bin_win</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">xticks_win</span> = <span class="cm-number">2</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ax</span>.<span class="cm-property">set_title</span>(<span class="cm-string">'HSV Color Space'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">lines</span> = []</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">for</span> <span class="cm-variable">cidx</span>, <span class="cm-variable">color</span> <span class="cm-keyword">in</span> <span class="cm-builtin">enumerate</span>(<span class="cm-variable">hsvColor</span>):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cHist</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">calcHist</span>([<span class="cm-variable">blur</span>], [<span class="cm-variable">cidx</span>], <span class="cm-keyword">None</span>, [<span class="cm-variable">bin_num</span>], [<span class="cm-number">0</span>,<span class="cm-number">255</span>])</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">line</span> = <span class="cm-variable">ax</span>.<span class="cm-property">plot</span>(<span class="cm-variable">cHist</span>, <span class="cm-variable">color</span>=<span class="cm-variable">color</span>, <span class="cm-variable">linewidth</span>=<span class="cm-number">8</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">lines</span>.<span class="cm-property">append</span>(<span class="cm-variable">line</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">labels</span> = [<span class="cm-variable">cname</span> <span class="cm-operator">+</span> <span class="cm-string">' Channel'</span> <span class="cm-keyword">for</span> <span class="cm-variable">cname</span> <span class="cm-keyword">in</span> <span class="cm-string">'HSV'</span>]</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">legend</span>(<span class="cm-variable">lines</span>, <span class="cm-variable">labels</span>, <span class="cm-variable">loc</span>=<span class="cm-string">'upper right'</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ax</span>.<span class="cm-property">set_xlim</span>([<span class="cm-number">0</span>, <span class="cm-variable">bin_num</span>])</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ax</span>.<span class="cm-property">set_xticks</span>(<span class="cm-variable">np</span>.<span class="cm-property">arange</span>(<span class="cm-number">0</span>, <span class="cm-variable">bin_num</span>, <span class="cm-variable">xticks_win</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">ax</span>.<span class="cm-property">set_xticklabels</span>(<span class="cm-builtin">list</span>(<span class="cm-builtin">range</span>(<span class="cm-number">0</span>, <span class="cm-number">256</span>, <span class="cm-variable">bin_win</span><span class="cm-operator">*</span><span class="cm-variable">xticks_win</span>)),<span class="cm-variable">rotation</span>=<span class="cm-number">45</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">plt</span>.<span class="cm-property">show</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># Start thresholding</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> <span class="cm-variable">range_filter</span> == <span class="cm-string">'RGB'</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">frame_to_thresh</span> = <span class="cm-variable">GaussianBlur</span>.<span class="cm-property">copy</span>()</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">else</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">frame_to_thresh</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">cvtColor</span>(<span class="cm-variable">GaussianBlur</span>, <span class="cm-variable">cv2</span>.<span class="cm-property">COLOR_BGR2HSV</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">setup_trackbars</span>(<span class="cm-variable">range_filter</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">while</span> <span class="cm-keyword">True</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">v1_min</span>, <span class="cm-variable">v2_min</span>, <span class="cm-variable">v3_min</span>, <span class="cm-variable">v1_max</span>, <span class="cm-variable">v2_max</span>, <span class="cm-variable">v3_max</span> = <span class="cm-variable">get_trackbar_values</span>(</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">range_filter</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">thresh</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">inRange</span>(</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">frame_to_thresh</span>, (<span class="cm-variable">v1_min</span>, <span class="cm-variable">v2_min</span>, <span class="cm-variable">v3_min</span>), (<span class="cm-variable">v1_max</span>, <span class="cm-variable">v2_max</span>, <span class="cm-variable">v3_max</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">thresh</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">threshold</span>(<span class="cm-variable">thresh</span>, <span class="cm-number">127</span>, <span class="cm-number">255</span>, <span class="cm-variable">cv2</span>.<span class="cm-property">THRESH_BINARY_INV</span>)[<span class="cm-number">1</span>]</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> <span class="cm-variable">args</span>[<span class="cm-string">'preview'</span>]:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">preview</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">bitwise_and</span>(<span class="cm-variable">image</span>, <span class="cm-variable">image</span>, <span class="cm-variable">mask</span>=<span class="cm-variable">thresh</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">imshow</span>(<span class="cm-string">"Preview"</span>, <span class="cm-variable">preview</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">else</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">imshow</span>(<span class="cm-string">"Original"</span>, <span class="cm-variable">image</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">imshow</span>(<span class="cm-string">"Thresh"</span>, <span class="cm-variable">thresh</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">if</span> <span class="cm-variable">cv2</span>.<span class="cm-property">waitKey</span>(<span class="cm-number">1</span>) <span class="cm-operator">&</span> <span class="cm-number">0xFF</span> <span class="cm-keyword">is</span> <span class="cm-builtin">ord</span>(<span class="cm-string">'q'</span>):</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-keyword">break</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text=""></span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">if</span> <span class="cm-variable">__name__</span> == <span class="cm-string">'__main__'</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">main</span>()</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 3082px;"></div><div class="CodeMirror-gutters" style="display: none; height: 3082px;"></div></div></div></pre><p><span>The histogram of different colors are obtained using Python and plotted as follows. Then I use the Python GUI to fine-tune the range on images from webots.</span></p><h6><a name="orange" class="md-header-anchor"></a><span>Orange:</span></h6><p><img src="imgs/orange_hsv.png" alt="orange_hsv.png" style="zoom: 40%;" /></p><p><img src="imgs/orange_thresh.png" alt="orange_thresh.png" style="zoom: 40%;" /></p><p><span>As is shown above, orange is preserved in white while other colors are filtered with the thresholds in the trackbars.</span></p><h6><a name="yellow" class="md-header-anchor"></a><span>Yellow:</span></h6><p><img src="imgs/yellow_hsv.png" alt="yellow_hsv.png" style="zoom: 40%;" /></p><p><img src="imgs/yellow_thresh.png" alt="yellow_thresh.png" style="zoom: 40%;" /></p><p><span>As is shown above, yellow is preserved in white while other colors are filtered with the thresholds in the trackbars.</span></p><h6><a name="red" class="md-header-anchor"></a><span>Red:</span></h6><p><img src="imgs/red_hsv.png" alt="red_hsv.png" style="zoom: 40%;" /></p><p><img src="imgs/red_thresh.png" alt="red_thresh.png" style="zoom: 40%;" /></p><p><span>As is shown above, red is preserved in white while other colors are filtered with the thresholds in the trackbars.</span></p><h6><a name="purple" class="md-header-anchor"></a><span>Purple:</span></h6><p><img src="imgs/purple_hsv.png" alt="purple_hsv.png" style="zoom: 40%;" /></p><p><img src="imgs/purple_thresh.png" alt="purple_thresh.png" style="zoom: 40%;" /></p><p><span>As is shown above, purple is preserved in white while other colors are filtered with the thresholds in the trackbars.</span></p><h5><a name="results-n101" class="md-header-anchor"></a><span>Results:</span></h5><p><span> Finally, we can obtain a color value range table as follows.</span></p><figure><table><thead><tr><th><span>color</span></th><th><span>[Hmin, hmax]</span></th><th><span>[Hmin, Smax]</span></th><th><span>[Vmin, Vmax]</span></th></tr></thead><tbody><tr><td><span>orange</span></td><td><span>[14, 21]</span></td><td><span>[199, 208]</span></td><td><span>[234, 240]</span></td></tr><tr><td><span>red</span></td><td><span>[0, 3]</span></td><td><span>[246, 255]</span></td><td><span>[144, 154]</span></td></tr><tr><td><span>purple</span></td><td><span>[132, 138]</span></td><td><span>[246, 255]</span></td><td><span>[168, 178]</span></td></tr><tr><td><span>yellow</span></td><td><span>[27, 33]</span></td><td><span>[243,252]</span></td><td><span>[146, 160]</span></td></tr></tbody></table></figure><p> </p><h3><a name="subject-uuse-green-block-as-the-beaconu" class="md-header-anchor"></a><span>Subject: </span><u><span>Use green block as the beacon</span></u></h3><h4><a name="date-umay-25u---author-uchang-shuu" class="md-header-anchor"></a><span>Date: </span><u><span>May 25</span></u><span> Author: </span><u><span>Chang Shu</span></u></h4><h5><a name="purpose-n132" class="md-header-anchor"></a><span>Purpose:</span></h5><p><span>Since we are allowed to use 2 beacons in the project, I choose the green block as the beacon. Then we transform the beacon detection problem into a color detection problem.</span></p><h5><a name="procedure-n134" class="md-header-anchor"></a><span>Procedure:</span></h5><ol start='' ><li><span>place a green block on targeted place</span></li><li><span>find its histogram in HSV space</span></li><li><span>use Python GUI to fine-tune the range value</span></li></ol><h5><a name="experiment-n142" class="md-header-anchor"></a><span>Experiment:</span></h5><p><span>Here, we place a green block on the left side of the bridge.</span></p><p><img src="imgs/green.jpg" alt="green.png" style="zoom: 100%;" /></p><p><span>The histogram of green is shown below.</span></p><p><img src="imgs/green_hsv.png" alt="green_hsv.png" style="zoom: 40%;" /></p><p><span>Then I use the GUI to find the range value.</span></p><p><img src="imgs/green_thresh.png" alt="green_thresh.png" style="zoom: 80%;" /></p><h5><a name="results-n149" class="md-header-anchor"></a><span>Results:</span></h5><p><span>Finally, I obtain the range value of green in HSV space as follows.</span></p><figure><table><thead><tr><th><span>color</span></th><th><span>[Hmin, hmax]</span></th><th><span>[Hmin, Smax]</span></th><th><span>[Vmin, Vmax]</span></th></tr></thead><tbody><tr><td><span>green</span></td><td><span>[55, 63]</span></td><td><span>[236, 255]</span></td><td><span>[156, 173]</span></td></tr></tbody></table></figure><h3><a name="visualize-task-5" class="md-header-anchor"></a><span>Visualize task 5</span></h3><h4><a name="date-ujune-1u---author-uchang-shuu" class="md-header-anchor"></a><span>Date: </span><u><span>June 1</span></u><span> Author: </span><u><span>Chang Shu</span></u></h4><h5><a name="purpose-n164" class="md-header-anchor"></a><span>Purpose:</span></h5><p><span>The output of color filtering is task 5 can be visualized so that our professors can better understand it principle.</span></p><h5><a name="procedure-n166" class="md-header-anchor"></a><span>Procedure:</span></h5><p><span>This experiment is done in two steps:</span></p><ol start='' ><li><span>Add the ROI(Region of Interest) using green box and red dot.</span></li><li><span>Add a semi-transparent mask to indict the path the rover actually follows</span></li></ol><h5><a name="experiment-n173" class="md-header-anchor"></a><span>Experiment:</span></h5><p><span>The code is shown below.</span></p><pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="python"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">if</span> <span class="cm-variable-2">self</span>.<span class="cm-property">path_color</span> <span class="cm-keyword">is</span> <span class="cm-keyword">None</span>:</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># get rectangle of road in roi</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">rectangle</span>(<span class="cm-variable">image_show</span>, (<span class="cm-number">0</span>, <span class="cm-variable">foresight_up</span>), (<span class="cm-variable">image_show</span>.<span class="cm-property">shape</span>[<span class="cm-number">1</span>], <span class="cm-variable">foresight_down</span>), (<span class="cm-number">0</span>, <span class="cm-number">255</span>, <span class="cm-number">0</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># get center of road in roi</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">f_y</span>, <span class="cm-variable">f_x</span> = <span class="cm-variable">np</span>.<span class="cm-property">mean</span>(<span class="cm-variable">a</span>=<span class="cm-variable">location</span>, <span class="cm-variable">axis</span>=<span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">circle</span>(<span class="cm-variable">image_show</span>, (<span class="cm-builtin">int</span>(<span class="cm-variable">f_x</span>), <span class="cm-variable">foresight_up</span> <span class="cm-operator">+</span> <span class="cm-builtin">int</span>(<span class="cm-variable">f_y</span>)), <span class="cm-number">1</span>, (<span class="cm-number">0</span>, <span class="cm-number">0</span>, <span class="cm-number">255</span>), <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">imshow</span>(<span class="cm-string">'path_detection'</span>, <span class="cm-variable">image_show</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">else</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># add semi-transparent mask of the filtered path</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">mask</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">cvtColor</span>(<span class="cm-variable">image_gray</span>, <span class="cm-variable">cv2</span>.<span class="cm-property">COLOR_GRAY2BGR</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">alpha</span> = <span class="cm-number">0.7</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">beta</span> = <span class="cm-number">1</span> <span class="cm-operator">-</span> <span class="cm-variable">alpha</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">gamma</span> = <span class="cm-number">0</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">image_mask</span> = <span class="cm-variable">cv2</span>.<span class="cm-property">addWeighted</span>(<span class="cm-variable">image_show</span>, <span class="cm-variable">alpha</span>, <span class="cm-variable">mask</span>, <span class="cm-variable">beta</span>, <span class="cm-variable">gamma</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># get rectangle of road in roi</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">rectangle</span>(<span class="cm-variable">image_mask</span>, (<span class="cm-number">0</span>, <span class="cm-variable">foresight_up</span>), (<span class="cm-variable">image_show</span>.<span class="cm-property">shape</span>[<span class="cm-number">1</span>], <span class="cm-variable">foresight_down</span>), (<span class="cm-number">0</span>, <span class="cm-number">255</span>, <span class="cm-number">0</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment"># get center of road in roi</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">f_y</span>, <span class="cm-variable">f_x</span> = <span class="cm-variable">np</span>.<span class="cm-property">mean</span>(<span class="cm-variable">a</span>=<span class="cm-variable">location</span>, <span class="cm-variable">axis</span>=<span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">circle</span>(<span class="cm-variable">image_mask</span>, (<span class="cm-builtin">int</span>(<span class="cm-variable">f_x</span>), <span class="cm-variable">foresight_up</span> <span class="cm-operator">+</span> <span class="cm-builtin">int</span>(<span class="cm-variable">f_y</span>)), <span class="cm-number">1</span>, (<span class="cm-number">0</span>, <span class="cm-number">0</span>, <span class="cm-number">255</span>), <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-variable">cv2</span>.<span class="cm-property">imshow</span>(<span class="cm-string">'path_detection'</span>, <span class="cm-variable">image_mask</span>)</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 460px;"></div><div class="CodeMirror-gutters" style="display: none; height: 460px;"></div></div></div></pre><h5><a name="results-n176" class="md-header-anchor"></a><span>Results:</span></h5><p><span>The processed images are shown as follows.</span></p><p><img src="imgs/visualization1.png" alt="visualization1.png" style="zoom: 100%;" /></p><p><img src="imgs/visualization2.png" alt="visualization1.png" style="zoom: 100%;" /></p><p><img src="imgs/visualization3.png" alt="visualization1.png" style="zoom: 100%;" /></p><p> </p></div>
</body>
</html>