-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathexample_usage.html
More file actions
208 lines (153 loc) · 36.9 KB
/
example_usage.html
File metadata and controls
208 lines (153 loc) · 36.9 KB
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
<!DOCTYPE html><html><head>
<title>example_usage</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="file:///c:\Users\7uz\.vscode\extensions\shd101wyy.markdown-preview-enhanced-0.8.19\crossnote\dependencies\katex\katex.min.css">
<style>
code[class*=language-],pre[class*=language-]{color:#333;background:0 0;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.4;-moz-tab-size:8;-o-tab-size:8;tab-size:8;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:.8em;overflow:auto;border-radius:3px;background:#f5f5f5}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal;background:#f5f5f5}.token.blockquote,.token.comment{color:#969896}.token.cdata{color:#183691}.token.doctype,.token.macro.property,.token.punctuation,.token.variable{color:#333}.token.builtin,.token.important,.token.keyword,.token.operator,.token.rule{color:#a71d5d}.token.attr-value,.token.regex,.token.string,.token.url{color:#183691}.token.atrule,.token.boolean,.token.code,.token.command,.token.constant,.token.entity,.token.number,.token.property,.token.symbol{color:#0086b3}.token.prolog,.token.selector,.token.tag{color:#63a35c}.token.attr-name,.token.class,.token.class-name,.token.function,.token.id,.token.namespace,.token.pseudo-class,.token.pseudo-element,.token.url-reference .token.variable{color:#795da3}.token.entity{cursor:help}.token.title,.token.title .token.punctuation{font-weight:700;color:#1d3e81}.token.list{color:#ed6a43}.token.inserted{background-color:#eaffea;color:#55a532}.token.deleted{background-color:#ffecec;color:#bd2c00}.token.bold{font-weight:700}.token.italic{font-style:italic}.language-json .token.property{color:#183691}.language-markup .token.tag .token.punctuation{color:#333}.language-css .token.function,code.language-css{color:#0086b3}.language-yaml .token.atrule{color:#63a35c}code.language-yaml{color:#183691}.language-ruby .token.function{color:#333}.language-markdown .token.url{color:#795da3}.language-makefile .token.symbol{color:#795da3}.language-makefile .token.variable{color:#183691}.language-makefile .token.builtin{color:#0086b3}.language-bash .token.keyword{color:#0086b3}pre[data-line]{position:relative;padding:1em 0 1em 3em}pre[data-line] .line-highlight-wrapper{position:absolute;top:0;left:0;background-color:transparent;display:block;width:100%}pre[data-line] .line-highlight{position:absolute;left:0;right:0;padding:inherit 0;margin-top:1em;background:hsla(24,20%,50%,.08);background:linear-gradient(to right,hsla(24,20%,50%,.1) 70%,hsla(24,20%,50%,0));pointer-events:none;line-height:inherit;white-space:pre}pre[data-line] .line-highlight:before,pre[data-line] .line-highlight[data-end]:after{content:attr(data-start);position:absolute;top:.4em;left:.6em;min-width:1em;padding:0 .5em;background-color:hsla(24,20%,50%,.4);color:#f4f1ef;font:bold 65%/1.5 sans-serif;text-align:center;vertical-align:.3em;border-radius:999px;text-shadow:none;box-shadow:0 1px #fff}pre[data-line] .line-highlight[data-end]:after{content:attr(data-end);top:auto;bottom:.4em}html body{font-family:'Helvetica Neue',Helvetica,'Segoe UI',Arial,freesans,sans-serif;font-size:16px;line-height:1.6;color:#333;background-color:#fff;overflow:initial;box-sizing:border-box;word-wrap:break-word}html body>:first-child{margin-top:0}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{line-height:1.2;margin-top:1em;margin-bottom:16px;color:#000}html body h1{font-size:2.25em;font-weight:300;padding-bottom:.3em}html body h2{font-size:1.75em;font-weight:400;padding-bottom:.3em}html body h3{font-size:1.5em;font-weight:500}html body h4{font-size:1.25em;font-weight:600}html body h5{font-size:1.1em;font-weight:600}html body h6{font-size:1em;font-weight:600}html body h1,html body h2,html body h3,html body h4,html body h5{font-weight:600}html body h5{font-size:1em}html body h6{color:#5c5c5c}html body strong{color:#000}html body del{color:#5c5c5c}html body a:not([href]){color:inherit;text-decoration:none}html body a{color:#08c;text-decoration:none}html body a:hover{color:#00a3f5;text-decoration:none}html body img{max-width:100%}html body>p{margin-top:0;margin-bottom:16px;word-wrap:break-word}html body>ol,html body>ul{margin-bottom:16px}html body ol,html body ul{padding-left:2em}html body ol.no-list,html body ul.no-list{padding:0;list-style-type:none}html body ol ol,html body ol ul,html body ul ol,html body ul ul{margin-top:0;margin-bottom:0}html body li{margin-bottom:0}html body li.task-list-item{list-style:none}html body li>p{margin-top:0;margin-bottom:0}html body .task-list-item-checkbox{margin:0 .2em .25em -1.8em;vertical-align:middle}html body .task-list-item-checkbox:hover{cursor:pointer}html body blockquote{margin:16px 0;font-size:inherit;padding:0 15px;color:#5c5c5c;background-color:#f0f0f0;border-left:4px solid #d6d6d6}html body blockquote>:first-child{margin-top:0}html body blockquote>:last-child{margin-bottom:0}html body hr{height:4px;margin:32px 0;background-color:#d6d6d6;border:0 none}html body table{margin:10px 0 15px 0;border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}html body table th{font-weight:700;color:#000}html body table td,html body table th{border:1px solid #d6d6d6;padding:6px 13px}html body dl{padding:0}html body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}html body dl dd{padding:0 16px;margin-bottom:16px}html body code{font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:.85em;color:#000;background-color:#f0f0f0;border-radius:3px;padding:.2em 0}html body code::after,html body code::before{letter-spacing:-.2em;content:'\00a0'}html body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:0 0;border:0}html body .highlight{margin-bottom:16px}html body .highlight pre,html body pre{padding:1em;overflow:auto;line-height:1.45;border:#d6d6d6;border-radius:3px}html body .highlight pre{margin-bottom:0;word-break:normal}html body pre code,html body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}html body pre code:after,html body pre code:before,html body pre tt:after,html body pre tt:before{content:normal}html body blockquote,html body dl,html body ol,html body p,html body pre,html body ul{margin-top:0;margin-bottom:16px}html body kbd{color:#000;border:1px solid #d6d6d6;border-bottom:2px solid #c7c7c7;padding:2px 4px;background-color:#f0f0f0;border-radius:3px}@media print{html body{background-color:#fff}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{color:#000;page-break-after:avoid}html body blockquote{color:#5c5c5c}html body pre{page-break-inside:avoid}html body table{display:table}html body img{display:block;max-width:100%;max-height:100%}html body code,html body pre{word-wrap:break-word;white-space:pre}}.markdown-preview{width:100%;height:100%;box-sizing:border-box}.markdown-preview ul{list-style:disc}.markdown-preview ul ul{list-style:circle}.markdown-preview ul ul ul{list-style:square}.markdown-preview ol{list-style:decimal}.markdown-preview ol ol,.markdown-preview ul ol{list-style-type:lower-roman}.markdown-preview ol ol ol,.markdown-preview ol ul ol,.markdown-preview ul ol ol,.markdown-preview ul ul ol{list-style-type:lower-alpha}.markdown-preview .newpage,.markdown-preview .pagebreak{page-break-before:always}.markdown-preview pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}.markdown-preview pre.line-numbers>code{position:relative}.markdown-preview pre.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:1em;font-size:100%;left:0;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-preview pre.line-numbers .line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.markdown-preview pre.line-numbers .line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.markdown-preview .mathjax-exps .MathJax_Display{text-align:center!important}.markdown-preview:not([data-for=preview]) .code-chunk .code-chunk-btn-group{display:none}.markdown-preview:not([data-for=preview]) .code-chunk .status{display:none}.markdown-preview:not([data-for=preview]) .code-chunk .output-div{margin-bottom:16px}.markdown-preview .md-toc{padding:0}.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link{display:inline;padding:.25rem 0}.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link div,.markdown-preview .md-toc .md-toc-link-wrapper .md-toc-link p{display:inline}.markdown-preview .md-toc .md-toc-link-wrapper.highlighted .md-toc-link{font-weight:800}.scrollbar-style::-webkit-scrollbar{width:8px}.scrollbar-style::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}.scrollbar-style::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,.66);border:4px solid rgba(150,150,150,.66);background-clip:content-box}html body[for=html-export]:not([data-presentation-mode]){position:relative;width:100%;height:100%;top:0;left:0;margin:0;padding:0;overflow:auto}html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{position:relative;top:0;min-height:100vh}@media screen and (min-width:914px){html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{padding:2em calc(50% - 457px + 2em)}}@media screen and (max-width:914px){html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for=html-export]:not([data-presentation-mode]) .markdown-preview{font-size:14px!important;padding:1em}}@media print{html body[for=html-export]:not([data-presentation-mode]) #sidebar-toc-btn{display:none}}html body[for=html-export]:not([data-presentation-mode]) #sidebar-toc-btn{position:fixed;bottom:8px;left:8px;font-size:28px;cursor:pointer;color:inherit;z-index:99;width:32px;text-align:center;opacity:.4}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] #sidebar-toc-btn{opacity:1}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc{position:fixed;top:0;left:0;width:300px;height:100%;padding:32px 0 48px 0;font-size:14px;box-shadow:0 0 4px rgba(150,150,150,.33);box-sizing:border-box;overflow:auto;background-color:inherit}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar{width:8px}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,.66);border:4px solid rgba(150,150,150,.66);background-clip:content-box}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc a{text-decoration:none}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc{padding:0 16px}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link{display:inline;padding:.25rem 0}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link div,html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper .md-toc-link p{display:inline}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc .md-toc .md-toc-link-wrapper.highlighted .md-toc-link{font-weight:800}html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{left:300px;width:calc(100% - 300px);padding:2em calc(50% - 457px - 300px / 2);margin:0;box-sizing:border-box}@media screen and (max-width:1274px){html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for=html-export]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{width:100%}}html body[for=html-export]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .markdown-preview{left:50%;transform:translateX(-50%)}html body[for=html-export]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .md-sidebar-toc{display:none}
/* Please visit the URL below for more information: */
/* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */
</style>
<!-- The content below will be included at the end of the <head> element. --><script type="text/javascript">
document.addEventListener("DOMContentLoaded", function () {
// your code here
});
</script></head><body for="html-export">
<div class="crossnote markdown-preview ">
<font size="5">
<h1 id="rhizovision-explorer-cli-usage-examples">RhizoVision Explorer CLI Usage Examples </h1>
<p>The command line interface supports extensive configuration options for root analysis and batch processing. It can be run by invoking in a shell prompt or invoked from within a python script for sutomated analysis.</p>
<h2 id="basic-usage">Basic Usage </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Process a single image with default settings</span>
./rv image.jpg
<span class="token comment"># Process all images in a directory</span>
./rv /path/to/images/
<span class="token comment"># Process directory recursively with verbose output</span>
./rv <span class="token parameter variable">-r</span> <span class="token parameter variable">-v</span> /path/to/images/
</code></pre><h2 id="input-and-output-options">Input and Output Options </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Specify ROI annotation CSV file</span>
./rv <span class="token parameter variable">--roipath</span> rois.csv image.jpg
<span class="token comment"># Specify metadata CSV file (if implemented)</span>
./rv <span class="token parameter variable">--metafile</span> meta.csv image.jpg
<span class="token comment"># Specify output CSV file</span>
./rv <span class="token parameter variable">-o</span> results.csv image.jpg
<span class="token comment"># Specify output directory for processed images</span>
./rv <span class="token parameter variable">-op</span> processed_images/ image.jpg
<span class="token comment"># Overwrite output file instead of appending</span>
./rv <span class="token parameter variable">-na</span> image.jpg
</code></pre><h2 id="general-options">General Options </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Show help</span>
./rv <span class="token parameter variable">-h</span>
<span class="token comment"># Show version/license/credits</span>
./rv <span class="token parameter variable">--version</span>
./rv <span class="token parameter variable">--license</span>
./rv <span class="token parameter variable">--credits</span>
</code></pre><h2 id="root-analysis-options">Root Analysis Options </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Set root type (0=whole root, 1=broken roots)</span>
./rv <span class="token parameter variable">-rt</span> <span class="token number">0</span> image.jpg
<span class="token comment"># Set segmentation threshold</span>
./rv <span class="token parameter variable">-t</span> <span class="token number">180</span> image.jpg
<span class="token comment"># Invert image colors before processing</span>
./rv <span class="token parameter variable">-i</span> image.jpg
</code></pre><h2 id="filtering-options">Filtering Options </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Keep only the largest component</span>
./rv <span class="token parameter variable">-kl</span> image.jpg
<span class="token comment"># Filter background noise components</span>
./rv <span class="token parameter variable">--bgnoise</span> image.jpg
<span class="token comment"># Filter foreground noise components</span>
./rv <span class="token parameter variable">--fgnoise</span> image.jpg
<span class="token comment"># Set max background component size</span>
./rv <span class="token parameter variable">--bgnoise</span> <span class="token parameter variable">--bgsize</span> <span class="token number">0.5</span> image.jpg
<span class="token comment"># Set max foreground component size</span>
./rv <span class="token parameter variable">--fgnoise</span> <span class="token parameter variable">--fgsize</span> <span class="token number">0.5</span> image.jpg
</code></pre><h2 id="smoothing-and-pruning-options">Smoothing and Pruning Options </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Enable contour smoothing</span>
./rv <span class="token parameter variable">--smooth</span> image.jpg
<span class="token comment"># Set smoothing threshold</span>
./rv <span class="token parameter variable">-s</span> <span class="token parameter variable">--smooththreshold</span> <span class="token number">1.5</span> image.jpg
<span class="token comment"># Enable root pruning</span>
./rv <span class="token parameter variable">--prune</span> image.jpg
<span class="token comment"># Set root pruning threshold</span>
./rv <span class="token parameter variable">--prune</span> <span class="token parameter variable">--prunethreshold</span> <span class="token number">2</span> image.jpg
</code></pre><h2 id="unit-conversion-and-analysis-options">Unit Conversion and Analysis Options </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Enable pixel to physical unit conversion</span>
./rv <span class="token parameter variable">--convert</span> image.jpg
<span class="token comment"># Set conversion factor</span>
./rv <span class="token parameter variable">--factordpi</span> <span class="token number">0.1</span> image.jpg
<span class="token comment"># Use pixels per mm instead of DPI</span>
./rv <span class="token parameter variable">--factorpixels</span> image.jpg
<span class="token comment"># Set diameter ranges (comma-separated)</span>
./rv <span class="token parameter variable">--dranges</span> <span class="token number">1.0</span>,3.0,6.0 image.jpg
</code></pre><h2 id="output-image-options">Output Image Options </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code><span class="token comment"># Save segmented images</span>
./rv <span class="token parameter variable">--segment</span> image.jpg
<span class="token comment"># Save processed feature images</span>
./rv <span class="token parameter variable">--feature</span> image.jpg
<span class="token comment"># Set suffix for segmented images</span>
./rv <span class="token parameter variable">--ssuffix</span> _seg image.jpg
<span class="token comment"># Set suffix for processed images</span>
./rv <span class="token parameter variable">--fsuffix</span> _features image.jpg
</code></pre><h2 id="complete-example">Complete Example </h2>
<pre data-role="codeBlock" data-info="bash" class="language-bash bash"><code>./rv <span class="token parameter variable">-r</span> <span class="token parameter variable">-v</span> <span class="token parameter variable">-rt</span> <span class="token number">0</span> <span class="token parameter variable">-t</span> <span class="token number">140</span> <span class="token parameter variable">--smooth</span> <span class="token parameter variable">--pixelconv</span> <span class="token parameter variable">--convfactor</span> <span class="token number">0.05</span> <span class="token punctuation">\</span>
<span class="token parameter variable">--dranges</span> <span class="token number">1.0</span>,2.5,5.0 <span class="token parameter variable">--saveproc</span> <span class="token parameter variable">-o</span> analysis.csv /path/to/images/
</code></pre><h2 id="batch-processing-a-whole-folder-from-python-single-invocation">Batch Processing a Whole Folder from Python (Single Invocation) </h2>
<p>We can invoke rv from within a python script. This allows us to capture output and perform checks if any images failed to process and directly tie it to downstream analysis of features. When invoking rv by passing a directory, the rv program handles image file discovery and all files within a directory is analyzed. The images are analyzed recursively if '-r' switch is specified.</p>
<pre data-role="codeBlock" data-info="python" class="language-python python"><code><span class="token keyword keyword-import">import</span> subprocess
<span class="token keyword keyword-import">import</span> sys
<span class="token keyword keyword-import">import</span> pandas <span class="token keyword keyword-as">as</span> pd
<span class="token comment"># Choose options: -r for recursive, -v for verbose, custom output file, etc.</span>
cmd <span class="token operator">=</span> <span class="token string">'rv -r -o features.csv /mnt/E/cpp/github/RhizoVisionExplorer/imageexamples/crowns'</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">'Running:'</span><span class="token punctuation">,</span> cmd<span class="token punctuation">)</span>
result <span class="token operator">=</span> subprocess<span class="token punctuation">.</span>run<span class="token punctuation">(</span>cmd<span class="token punctuation">,</span> capture_output<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">,</span> text<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> shell<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
<span class="token keyword keyword-if">if</span> result<span class="token punctuation">.</span>returncode <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">:</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">'rv failed with exit code'</span><span class="token punctuation">,</span> result<span class="token punctuation">.</span>returncode<span class="token punctuation">,</span> <span class="token builtin">file</span><span class="token operator">=</span>sys<span class="token punctuation">.</span>stderr<span class="token punctuation">)</span>
sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span>result<span class="token punctuation">.</span>returncode<span class="token punctuation">)</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">'Folder processed successfully'</span><span class="token punctuation">)</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span>result<span class="token punctuation">.</span>stdout<span class="token punctuation">.</span>splitlines<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token keyword keyword-if">if</span> result<span class="token punctuation">.</span>stdout <span class="token keyword keyword-else">else</span> <span class="token string">'Done.'</span><span class="token punctuation">)</span>
<span class="token comment"># Do downstream analysis (requires pandas):</span>
df <span class="token operator">=</span> pd<span class="token punctuation">.</span>read_csv<span class="token punctuation">(</span><span class="token string">'features.csv'</span><span class="token punctuation">)</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">"Loaded features.csv with"</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>df<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"rows"</span><span class="token punctuation">)</span>
</code></pre><h2 id="selective-batch-processing-with-python">Selective Batch Processing with Python </h2>
<p>We may want to exclude certain images from analysis (e.g., files ending with <code>_seg.png</code> or <code>_features.png</code>). You can use a Python script to filter the file list and call <code>rv</code> for each file individually. The script below gets the file list in python, filters it, invokes <code>rv</code> per image and appends features automatically to the default <code>features.csv</code> (unless you specify <code>-na</code>). It will STOP immediately if any invocation of <code>rv</code> returns a non–zero exit code.</p>
<p>Invoking <code>rv</code> per image enables custom filtering logic, capture output in case of an error and exit gracefully. A python script invoking <code>rv</code> multiple times may make use of multiprocessing to spawn multiple <code>rv</code> processes for faster processing of image dataset. As of the current beta version, the <code>rv</code> program is not implemented and tested to support the file locks to run in multiprocessing environment. Hence using python's multiprocessing is not recommended if the output file name is same for all the multiple processes. So, when running <code>rv</code> in multiple processes, please store the features output to different file (use different <code>-o</code> option) for each spawned process.</p>
<pre data-role="codeBlock" data-info="python" class="language-python python"><code><span class="token keyword keyword-import">import</span> os
<span class="token keyword keyword-import">import</span> subprocess
<span class="token keyword keyword-import">import</span> sys
<span class="token keyword keyword-from">from</span> pathlib <span class="token keyword keyword-import">import</span> Path
<span class="token keyword keyword-import">import</span> pandas <span class="token keyword keyword-as">as</span> pd
<span class="token comment"># Configuration</span>
input_dir <span class="token operator">=</span> Path<span class="token punctuation">(</span><span class="token string">'/path/to/images'</span><span class="token punctuation">)</span> <span class="token comment"># change this</span>
rv_exe <span class="token operator">=</span> Path<span class="token punctuation">(</span><span class="token string">'./rv'</span><span class="token punctuation">)</span> <span class="token comment"># or an absolute path like Path('/usr/local/bin/rv')</span>
extra_args <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"-v"</span><span class="token punctuation">]</span> <span class="token comment"># add any global options you want (e.g., "--smooth")</span>
<span class="token comment"># Gather candidate image files (non-recursive here; use rglob('*') for recursive)</span>
image_extensions <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'.png'</span><span class="token punctuation">,</span> <span class="token string">'.jpg'</span><span class="token punctuation">,</span> <span class="token string">'.jpeg'</span><span class="token punctuation">,</span> <span class="token string">'.bmp'</span><span class="token punctuation">,</span> <span class="token string">'.tif'</span><span class="token punctuation">,</span> <span class="token string">'.tiff'</span><span class="token punctuation">}</span>
image_files <span class="token operator">=</span> <span class="token punctuation">[</span>p <span class="token keyword keyword-for">for</span> p <span class="token keyword keyword-in">in</span> input_dir<span class="token punctuation">.</span>iterdir<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword keyword-if">if</span> p<span class="token punctuation">.</span>suffix<span class="token punctuation">.</span>lower<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword keyword-in">in</span> image_extensions <span class="token keyword keyword-and">and</span> p<span class="token punctuation">.</span>is_file<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token comment"># Filter out derived outputs you don't want to re-process</span>
skip_suffixes <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token string">'_seg.png'</span><span class="token punctuation">,</span> <span class="token string">'_features.png'</span><span class="token punctuation">)</span>
selected <span class="token operator">=</span> <span class="token punctuation">[</span>p <span class="token keyword keyword-for">for</span> p <span class="token keyword keyword-in">in</span> image_files <span class="token keyword keyword-if">if</span> <span class="token keyword keyword-not">not</span> <span class="token builtin">any</span><span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">.</span>endswith<span class="token punctuation">(</span>sfx<span class="token punctuation">)</span> <span class="token keyword keyword-for">for</span> sfx <span class="token keyword keyword-in">in</span> skip_suffixes<span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token keyword keyword-if">if</span> <span class="token keyword keyword-not">not</span> selected<span class="token punctuation">:</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">"No images selected for analysis."</span><span class="token punctuation">)</span>
sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>
<span class="token keyword keyword-for">for</span> idx<span class="token punctuation">,</span> img <span class="token keyword keyword-in">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span><span class="token builtin">sorted</span><span class="token punctuation">(</span>selected<span class="token punctuation">)</span><span class="token punctuation">,</span> start<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
cmd <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">(</span>rv_exe<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">*</span>extra_args<span class="token punctuation">,</span> <span class="token builtin">str</span><span class="token punctuation">(</span>img<span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"[</span><span class="token interpolation"><span class="token punctuation">{</span>idx<span class="token punctuation">}</span></span><span class="token string">/</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token builtin">len</span><span class="token punctuation">(</span>selected<span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token string">] Analyzing </span><span class="token interpolation"><span class="token punctuation">{</span>img<span class="token punctuation">.</span>name<span class="token punctuation">}</span></span><span class="token string"> ..."</span></span><span class="token punctuation">)</span>
result <span class="token operator">=</span> subprocess<span class="token punctuation">.</span>run<span class="token punctuation">(</span>cmd<span class="token punctuation">,</span> capture_output<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span> text<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
<span class="token keyword keyword-if">if</span> result<span class="token punctuation">.</span>returncode <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">:</span>
<span class="token comment"># Echo stdout/stderr to help diagnose, then abort</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">"ERROR: rv failed on"</span><span class="token punctuation">,</span> img<span class="token punctuation">,</span> <span class="token builtin">file</span><span class="token operator">=</span>sys<span class="token punctuation">.</span>stderr<span class="token punctuation">)</span>
<span class="token keyword keyword-if">if</span> result<span class="token punctuation">.</span>stdout<span class="token punctuation">:</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">"--- stdout ---"</span><span class="token punctuation">,</span> <span class="token builtin">file</span><span class="token operator">=</span>sys<span class="token punctuation">.</span>stderr<span class="token punctuation">)</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span>result<span class="token punctuation">.</span>stdout<span class="token punctuation">,</span> <span class="token builtin">file</span><span class="token operator">=</span>sys<span class="token punctuation">.</span>stderr<span class="token punctuation">)</span>
<span class="token keyword keyword-if">if</span> result<span class="token punctuation">.</span>stderr<span class="token punctuation">:</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">"--- stderr ---"</span><span class="token punctuation">,</span> <span class="token builtin">file</span><span class="token operator">=</span>sys<span class="token punctuation">.</span>stderr<span class="token punctuation">)</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span>result<span class="token punctuation">.</span>stderr<span class="token punctuation">,</span> <span class="token builtin">file</span><span class="token operator">=</span>sys<span class="token punctuation">.</span>stderr<span class="token punctuation">)</span>
sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span>result<span class="token punctuation">.</span>returncode<span class="token punctuation">)</span>
<span class="token comment"># Optionally show trimmed stdout when verbose.</span>
<span class="token keyword keyword-if">if</span> result<span class="token punctuation">.</span>stdout<span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span>result<span class="token punctuation">.</span>stdout<span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>splitlines<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># last line (often a summary)</span>
<span class="token keyword keyword-print">print</span><span class="token punctuation">(</span><span class="token string">"All images processed successfully."</span><span class="token punctuation">)</span>
<span class="token comment"># Do downstream analysis (requires pandas):</span>
df <span class="token operator">=</span> pd<span class="token punctuation">.</span>read_csv<span class="token punctuation">(</span><span class="token string">'features.csv'</span><span class="token punctuation">)</span>
</code></pre></font>
</div>
</body></html>