napari-vipp 0.7.0a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. napari_vipp-0.7.0a1/LICENSE +28 -0
  2. napari_vipp-0.7.0a1/MANIFEST.in +1 -0
  3. napari_vipp-0.7.0a1/PKG-INFO +431 -0
  4. napari_vipp-0.7.0a1/README.md +389 -0
  5. napari_vipp-0.7.0a1/pyproject.toml +85 -0
  6. napari_vipp-0.7.0a1/setup.cfg +4 -0
  7. napari_vipp-0.7.0a1/src/napari_vipp/__init__.py +13 -0
  8. napari_vipp-0.7.0a1/src/napari_vipp/_graph.py +1595 -0
  9. napari_vipp-0.7.0a1/src/napari_vipp/_sample_data.py +158 -0
  10. napari_vipp-0.7.0a1/src/napari_vipp/_theme.py +42 -0
  11. napari_vipp-0.7.0a1/src/napari_vipp/_widget.py +8239 -0
  12. napari_vipp-0.7.0a1/src/napari_vipp/core/__init__.py +1 -0
  13. napari_vipp-0.7.0a1/src/napari_vipp/core/channel_colors.py +146 -0
  14. napari_vipp-0.7.0a1/src/napari_vipp/core/export.py +306 -0
  15. napari_vipp-0.7.0a1/src/napari_vipp/core/io/__init__.py +27 -0
  16. napari_vipp-0.7.0a1/src/napari_vipp/core/io/model.py +61 -0
  17. napari_vipp-0.7.0a1/src/napari_vipp/core/io/numpy_io.py +90 -0
  18. napari_vipp-0.7.0a1/src/napari_vipp/core/io/ome_zarr.py +536 -0
  19. napari_vipp-0.7.0a1/src/napari_vipp/core/io/raster.py +381 -0
  20. napari_vipp-0.7.0a1/src/napari_vipp/core/io/registry.py +182 -0
  21. napari_vipp-0.7.0a1/src/napari_vipp/core/io/tiff.py +612 -0
  22. napari_vipp-0.7.0a1/src/napari_vipp/core/metadata.py +2053 -0
  23. napari_vipp-0.7.0a1/src/napari_vipp/core/operations.py +4833 -0
  24. napari_vipp-0.7.0a1/src/napari_vipp/core/pipeline.py +3220 -0
  25. napari_vipp-0.7.0a1/src/napari_vipp/core/preview.py +499 -0
  26. napari_vipp-0.7.0a1/src/napari_vipp/core/tables.py +188 -0
  27. napari_vipp-0.7.0a1/src/napari_vipp/core/workflow.py +207 -0
  28. napari_vipp-0.7.0a1/src/napari_vipp/napari.yaml +17 -0
  29. napari_vipp-0.7.0a1/src/napari_vipp/nodes/__init__.py +1 -0
  30. napari_vipp-0.7.0a1/src/napari_vipp.egg-info/PKG-INFO +431 -0
  31. napari_vipp-0.7.0a1/src/napari_vipp.egg-info/SOURCES.txt +33 -0
  32. napari_vipp-0.7.0a1/src/napari_vipp.egg-info/dependency_links.txt +1 -0
  33. napari_vipp-0.7.0a1/src/napari_vipp.egg-info/entry_points.txt +2 -0
  34. napari_vipp-0.7.0a1/src/napari_vipp.egg-info/requires.txt +20 -0
  35. napari_vipp-0.7.0a1/src/napari_vipp.egg-info/top_level.txt +1 -0
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Rensu P. Theart
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its contributors
16
+ may be used to endorse or promote products derived from this software
17
+ without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1 @@
1
+ include src/napari_vipp/napari.yaml
@@ -0,0 +1,431 @@
1
+ Metadata-Version: 2.4
2
+ Name: napari-vipp
3
+ Version: 0.7.0a1
4
+ Summary: Visual image processing pipelines for napari
5
+ Author: Rensu P. Theart
6
+ License-Expression: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/rensutheart/napari-vipp
8
+ Project-URL: Repository, https://github.com/rensutheart/napari-vipp
9
+ Project-URL: Issues, https://github.com/rensutheart/napari-vipp/issues
10
+ Keywords: bioimage analysis,fluorescence microscopy,image processing,napari,node graph,visual programming
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Framework :: napari
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
17
+ Classifier: Topic :: Scientific/Engineering :: Image Processing
18
+ Classifier: Topic :: Scientific/Engineering :: Visualization
19
+ Requires-Python: >=3.10
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: dask[array]>=2025.2
23
+ Requires-Dist: fsspec>=2024.2
24
+ Requires-Dist: imageio>=2.31
25
+ Requires-Dist: numpy>=1.24
26
+ Requires-Dist: ome-types>=0.6
27
+ Requires-Dist: ome-zarr>=0.17
28
+ Requires-Dist: pillow>=10
29
+ Requires-Dist: qtpy>=2.4
30
+ Requires-Dist: scikit-image>=0.21
31
+ Requires-Dist: scipy>=1.10
32
+ Requires-Dist: tifffile>=2023.8
33
+ Requires-Dist: zarr>=3.0
34
+ Provides-Extra: dev
35
+ Requires-Dist: build>=1.2; extra == "dev"
36
+ Requires-Dist: napari[pyqt6]>=0.6; extra == "dev"
37
+ Requires-Dist: npe2>=0.8; extra == "dev"
38
+ Requires-Dist: pytest>=8; extra == "dev"
39
+ Requires-Dist: pytest-qt>=4.4; extra == "dev"
40
+ Requires-Dist: ruff>=0.12; extra == "dev"
41
+ Dynamic: license-file
42
+
43
+ # napari-vipp
44
+
45
+ ## Alpha Disclaimer
46
+
47
+ napari-vipp is an early alpha build in active development.
48
+
49
+ - Expect breaking changes between releases.
50
+ - Workflows, node parameters, and file compatibility may change.
51
+ - Validate outputs before scientific interpretation or publication use.
52
+
53
+ `napari-vipp` is an early prototype of a napari-native Visual Image Processing
54
+ Pipeline (VIPP): an interactive node-graph workflow composer for bioimage
55
+ analysis.
56
+
57
+ The project is exploring a workflow where the graph is the main work surface:
58
+ users add processing nodes, connect outputs to inputs, tune parameters, inspect
59
+ stage outputs in napari, and compare mask overlays or processing branches while
60
+ the pipeline updates live.
61
+
62
+ This is research/prototype software. The current code is useful for exploring
63
+ interaction patterns and metadata-aware pipeline execution, but it is not yet a
64
+ released production analysis package.
65
+
66
+ ## Acknowledgement
67
+
68
+ If VIPP contributes to your work, please acknowledge the project by name
69
+ ("napari-vipp") and include a link to the repository:
70
+ https://github.com/rensutheart/napari-vipp
71
+
72
+ Formal citation metadata can be added in a future release once a citation
73
+ target (for example DOI or manuscript) is available.
74
+
75
+ ## Current Status
76
+
77
+ The prototype currently supports:
78
+
79
+ - a napari `npe2` plugin manifest and dock widget;
80
+ - a large pan/zoom Qt graph canvas;
81
+ - toolbar graph zoom controls with a `100%` reset plus Ctrl/trackpad wheel zoom;
82
+ - draggable node cards with input/output ports and curved connectors;
83
+ - adding nodes from a categorized, fuzzy-searchable node library;
84
+ - connecting nodes by dragging or click-to-connect from output to input ports;
85
+ - explicit image source nodes for napari layers, files, or bundled samples;
86
+ - quick selected-output saving plus graph-level save nodes;
87
+ - per-node thumbnails with global show/hide, `Slice`/`MIP` preview modes,
88
+ contrast modes (`Percentile`, `Min-max`, `Raw`), and monochrome colormaps;
89
+ - optional per-node thumbnail disabling for heavier workflows;
90
+ - selected-node parameter controls in the inspector;
91
+ - slider plus numeric entry controls with soft range expansion where useful;
92
+ - right-panel output histograms plus cutoff-node input histograms with
93
+ slice/stack and linear/log modes;
94
+ - compact node metadata plus detailed selected-node metadata;
95
+ - normalized axes, channel, acquisition, source, and provenance metadata;
96
+ - OME-TIFF, ImageJ TIFF, conventional TIFF, OME-Zarr 0.4/0.5, and common
97
+ raster image import plus 2D raster export;
98
+ - adaptive image/series selection for multi-image sources;
99
+ - table outputs for object, intensity, skeleton, merged, and annotated results;
100
+ - image/mask/label pinning as persistent napari preview layers;
101
+ - generated inspect layers for full-resolution napari review.
102
+
103
+ ## Image Metadata
104
+
105
+ The graph carries an explicit image state object alongside each node output.
106
+ That state records:
107
+
108
+ - shape and dtype;
109
+ - axis names and axis types, such as `t`, `c`, `z`, `y`, `x`;
110
+ - units, scale, and origin/translation where available;
111
+ - value range, bit depth, memory estimate, and binary-value hints;
112
+ - source layer and operation history.
113
+ - channel names, fluorophore/wavelength fields where available;
114
+ - acquisition and stable source identity records.
115
+
116
+ When a napari layer provides OME-NGFF-style `multiscales` metadata, VIPP reads
117
+ the axis definitions and coordinate transforms. When the source is a plain array
118
+ without reliable metadata, VIPP falls back to inferred axes and labels that
119
+ fallback explicitly.
120
+
121
+ OME-TIFF metadata and local OME-Zarr 0.4/0.5 images are supported through the
122
+ shared headless I/O layer. OME-Zarr label groups, HCS plate browsing, generated
123
+ pyramids, remote stores, and full operation-level lazy execution remain future
124
+ work. See `docs/io-user-guide.md` for the current format contract.
125
+
126
+ ## Sample Data
127
+
128
+ The plugin contributes synthetic fluorescence-like sample data:
129
+
130
+ - `VIPP synthetic volume`: grayscale `ZYX` stack;
131
+ - `VIPP synthetic multichannel volume`: `CZYX` volume with three probe-like
132
+ channels;
133
+ - `VIPP synthetic time-lapse multichannel`: `TCZYX` time-lapse, multichannel
134
+ stack.
135
+
136
+ The multichannel samples use separate intensity channels, not baked RGB images.
137
+ Graph thumbnails render these as fluorescence-style pseudo-color composites
138
+ while preserving the underlying channel axis in the carried metadata.
139
+ When the full sample suite is open, the workflow automatically starts from the
140
+ `VIPP synthetic time-lapse multichannel` layer so the input metadata should read
141
+ as `TCZYX`. The simpler grayscale and `CZYX` examples are still available in the
142
+ toolbar input selector and in the graph-level `Image Source` node.
143
+
144
+ Open sample data from napari:
145
+
146
+ ```text
147
+ File > Open Sample > VIPP synthetic microscopy samples
148
+ ```
149
+
150
+ ## Node Library
151
+
152
+ The current node catalogue includes:
153
+
154
+ - Image Data:
155
+ - Source & Output:
156
+ - Image Source
157
+ - Save Image
158
+ - Axes & Regions:
159
+ - Crop Stack
160
+ - Select Axis Slice
161
+ - Reorder Axes
162
+ - Set Pixel Size / Units
163
+ - Rescale Axes
164
+ - Channels & Composites:
165
+ - Extract Channel
166
+ - Combine Channels
167
+ - Split Channels
168
+ - Composite → RGB
169
+ - Utilities:
170
+ - Convert Dtype
171
+ - Math & Logic:
172
+ - Calculate New Image
173
+ - Add
174
+ - Subtract
175
+ - Ratio
176
+ - Mask Image
177
+ - Logical AND
178
+ - Logical OR
179
+ - Logical XOR
180
+ - Invert
181
+ - Intensity & Contrast:
182
+ - Linear Scale + Offset
183
+ - Gamma Correction
184
+ - Rescale Intensity
185
+ - Normalize
186
+ - Clip
187
+ - Filtering:
188
+ - Smoothing & Denoising:
189
+ - Average Blur
190
+ - Gaussian Blur
191
+ - Gaussian Blur 3D
192
+ - Median Filter
193
+ - Bilateral Filtering
194
+ - Non-Local Means
195
+ - Edge & Detail:
196
+ - Difference of Gaussians
197
+ - Unsharp Mask
198
+ - Sobel Edges
199
+ - Canny Edges
200
+ - Laplace Filter
201
+ - Projection:
202
+ - Maximum Projection
203
+ - Project Image (axis-aware dropdown plus multiple projection methods)
204
+ - Orthogonal Projection
205
+ - Segmentation:
206
+ - Global Thresholds:
207
+ - Otsu Threshold
208
+ - Triangle Threshold
209
+ - Li Threshold
210
+ - Yen Threshold
211
+ - Isodata Threshold
212
+ - Minimum Threshold
213
+ - Binary Threshold
214
+ - Hysteresis Threshold
215
+ - Local Thresholds:
216
+ - Adaptive Mean Threshold
217
+ - Adaptive Gaussian Threshold
218
+ - Sauvola Threshold
219
+ - Niblack Threshold
220
+ - Morphology:
221
+ - Dilation
222
+ - Erosion
223
+ - Opening
224
+ - Closing
225
+ - Top Hat
226
+ - Black Hat
227
+ - Morphological Gradient
228
+ - Fill Holes
229
+ - Remove Small Objects
230
+ - Skeletonize
231
+ - Label Operations:
232
+ - Label Connected Components
233
+ - Filter Labels By Volume
234
+ - Filter Labels By Property
235
+ - Clear Border Objects
236
+ - Relabel Sequential
237
+ - Measurements:
238
+ - Measure Objects
239
+ - Measure Objects + Intensity
240
+ - Analyze Skeleton
241
+ - Merge Tables
242
+ - Select Table Columns
243
+ - Add Metadata Columns
244
+
245
+ Histogram-based automatic threshold nodes show `Threshold uses` on stack inputs.
246
+ `Stack histogram` computes one cutoff from the whole grayscale input and applies
247
+ it to the full image; `Slice histogram` computes a separate cutoff per displayed
248
+ plane while still producing a full-stack mask. The control is hidden for 2D
249
+ inputs. These nodes also show the input histogram used for threshold selection
250
+ with a live marker at the chosen threshold.
251
+
252
+ The label pipeline converts binary masks into integer object IDs. Connected
253
+ components can run over full `ZYX` volumes or independently over `YX` images.
254
+ Volume filtering currently uses pixel/voxel counts, preserves retained IDs, and
255
+ leaves compact renumbering to the explicit `Relabel Sequential` node. Its
256
+ volume sliders use the largest observed object as their data-aware upper bound
257
+ and a logarithmic scale for useful control across small and large structures;
258
+ the numeric fields still accept exact values up to one billion. Selecting
259
+ `Filter Labels By Volume` also shows the incoming object-volume distribution
260
+ above the regular histogram. Dashed minimum and enabled maximum markers update
261
+ with the filter controls. Its `Log volume axis` toggle is enabled by
262
+ default and can be switched off for a linear distribution.
263
+
264
+ `Filter Labels By Property` accepts named `Labels` and `Measurements table`
265
+ inputs and keeps or removes labels using any numeric table column, including
266
+ area/volume, intensity, and skeleton/network measurements. It preserves label
267
+ IDs and leaves compact renumbering to `Relabel Sequential`.
268
+
269
+ `Clear Border Objects` accepts either a binary mask or integer labels and
270
+ preserves that semantic type. In 3D it can remove objects touching all `ZYX`
271
+ volume boundaries or only the lateral `YX` boundaries, with an optional border
272
+ buffer. Timepoints and channels are processed independently.
273
+
274
+ `Fill Holes` accepts binary masks and defaults to metadata-aware processing:
275
+ 2D images are filled in `YX`, while true z-stacks are filled as complete `ZYX`
276
+ volumes. An advanced 2D-per-slice mode remains available for deliberately
277
+ slice-wise segmentations. A maximum size of `0` fills every enclosed hole;
278
+ positive values fill only holes up to the selected pixel area or voxel volume.
279
+ The inspector hides 3D for true 2D inputs and warns when slice-wise filling is
280
+ selected for a z-stack.
281
+
282
+ `Remove Small Objects` accepts binary masks or integer labels and preserves the
283
+ connected semantic type. It removes objects below a minimum pixel area or voxel
284
+ volume, supports 2D or 3D processing, and exposes connectivity for mask inputs.
285
+ Its logarithmic size control is bounded by the largest observed input object.
286
+ For labels-only cleanup with both minimum and maximum cutoffs, use
287
+ `Filter Labels By Volume`.
288
+
289
+ `Measure Objects` accepts a label image and produces a table output instead of
290
+ an image. The default measurement set includes label ID, pixel/voxel area or
291
+ volume, calibrated physical area or volume when spatial scale metadata is
292
+ available, centroid, bounding box, equivalent diameter, extent, and Euler
293
+ number. Optional checkboxes add shape descriptors, axis/inertia descriptors,
294
+ and 2D boundary descriptors. The 2D boundary group is hidden for true 3D
295
+ inputs because perimeter, Crofton perimeter, orientation, and eccentricity are
296
+ 2D concepts in the current implementation. Table outputs show a row preview in
297
+ the inspector and can be saved as CSV or TSV.
298
+
299
+ `Measure Objects + Intensity` is the first named multi-input measurement node.
300
+ It has separate `Labels` and `Intensity image` input ports, then outputs the
301
+ basic object morphology columns plus per-label mean, minimum, maximum, sum, and
302
+ standard deviation intensity. It exposes the same optional morphology groups as
303
+ `Measure Objects`. The example workflow
304
+ `examples/red-channel-object-intensity-measurements.json` demonstrates this
305
+ pattern.
306
+
307
+ `Merge Tables` joins two or more table outputs into a single table. In `auto`
308
+ mode it joins on stable identity columns such as `t_index` and `label_id`; when
309
+ no identity columns are shared, equal-length tables can be joined by row
310
+ position. `Select Table Columns` keeps, drops, or reorders table columns while
311
+ preserving row order and column units. `Add Metadata Columns` appends constant
312
+ treatment, replicate, batch, or condition columns before CSV/TSV export. The
313
+ example workflow
314
+ `examples/red-channel-merged-measurement-table.json` demonstrates a
315
+ PCA-oriented table assembly path.
316
+
317
+ `Skeletonize` accepts a binary mask and produces a skeleton mask using
318
+ metadata-aware 2D or 3D processing. `Analyze Skeleton` accepts a skeleton mask
319
+ and outputs a per-component table with skeleton voxel count, endpoint voxels,
320
+ junction voxels, isolated nodes, branch/graph edge counts, voxel-graph edge
321
+ count, cycle count, per-block component count, component voxel fraction, and
322
+ skeleton length in pixel/voxel and physical units when scale metadata is
323
+ available. These nodes are generic and are intended for mitochondria, neurites,
324
+ vessels, fibers, hyphae, and other curvilinear structures.
325
+
326
+ `Extract Channel` pulls one selected channel from a multichannel image.
327
+ `Split Channels` is its bulk counterpart: it emits one output port per channel
328
+ in the image (losslessly, preserving dtype), with the port count following the
329
+ true channel count. Each channel also preserves the semantic type of its input,
330
+ so splitting a threshold mask produces mask ports that connect directly to
331
+ `Label Connected Components`. `Combine Channels` is the inverse multi-input
332
+ node: set the expected channel/input count, connect that many upstream images,
333
+ and it stacks them into an explicit multichannel output. Channel pseudo-colours
334
+ are carried as metadata from OME sources, Image Source overrides, Combine
335
+ Channels, or the `Assign Channel Colors` pass-through node. `Composite → RGB`
336
+ maps a multichannel composite to a channel-last RGB image. Auto mode preserves
337
+ true RGB/RGBA inputs, and otherwise blends all channels by their carried
338
+ pseudo-colours, so yellow contributes to red and green and cyan contributes to
339
+ green and blue. Manual red/green/blue selectors remain available for forced
340
+ single-channel plane mapping. `Calculate New Image` is a multi-input image-math
341
+ node that applies comma separated weights to connected inputs and then adds an
342
+ offset.
343
+
344
+ `Mask Image` is a typed two-input node with separate `Image` and `Mask` ports.
345
+ The mask port accepts binary masks or labels, treating nonzero values as inside
346
+ the mask. Spatial masks can be broadcast over compatible image axes, including
347
+ channel-last RGB/RGBA images and common channel-first multichannel arrays, so a
348
+ `YX` or `ZYX` mask can mask all colour/channel planes without first splitting
349
+ the image.
350
+
351
+ `Image Source` can point to an existing napari layer, a local `.npy`, TIFF,
352
+ OME-Zarr, or common raster source such as PNG/JPEG/BMP/GIF/WebP, or one of the
353
+ bundled synthetic samples. `Set Pixel Size / Units` repairs missing or incorrect
354
+ input calibration by setting X/Y pixel size, optional Z step size, and the
355
+ shared physical unit carried in downstream metadata. Scale-aware nodes such as
356
+ `Orthogonal Projection` use this metadata to preserve physical proportions for
357
+ anisotropic z-stacks. `Rescale Axes` changes the sampled pixel grid along X/Y/Z
358
+ with optional X/Y aspect-ratio locking, nearest-neighbor through spline
359
+ interpolation choices, and anti-aliasing for intensity-image downsampling; it
360
+ updates physical scale metadata inversely to the requested scale factors.
361
+ `Save Image` passes data through unchanged and, when `Auto-save on update` is
362
+ set to `on`, writes the node input to disk every time the graph recomputes. For
363
+ quick interactive work, the
364
+ inspector also provides `Save selected output...` for the currently selected
365
+ node; that dialog defaults to TIFF but also allows `.npy` and PNG/JPEG-style
366
+ formats when the selected output is 2D. TIFF output is written in ImageJ
367
+ hyperstack format when axis metadata is available, and binary masks are saved
368
+ as 8-bit `0`/`255` values.
369
+
370
+ ## Development
371
+
372
+ Create a local environment and install in editable mode:
373
+
374
+ ```bash
375
+ python -m venv .venv
376
+ .venv\Scripts\activate
377
+ python -m pip install -e ".[dev]"
378
+ ```
379
+
380
+ Validate and test:
381
+
382
+ ```bash
383
+ python -m npe2 validate src/napari_vipp/napari.yaml
384
+ python -m ruff check .
385
+ python -m pytest
386
+ ```
387
+
388
+ Launch napari manually and open the widget from:
389
+
390
+ ```text
391
+ Plugins > VIPP Workflow (napari-vipp)
392
+ ```
393
+
394
+ Or launch the local sample app:
395
+
396
+ ```bash
397
+ python scripts\launch_vipp_sample.py
398
+ ```
399
+
400
+ To start directly from the multichannel Otsu-to-label workflow:
401
+
402
+ ```bash
403
+ python scripts\launch_vipp_label_workflow.py
404
+ ```
405
+
406
+ The same graph can be loaded manually from
407
+ `examples/otsu-red-channel-labels.json`. A second review workflow,
408
+ `examples/red-channel-object-intensity-measurements.json`, demonstrates the
409
+ named `Labels` plus `Intensity image` input slots on `Measure Objects +
410
+ Intensity`.
411
+
412
+ ## Roadmap
413
+
414
+ Near-term development priorities:
415
+
416
+ - axis-aware channel selectors that show probe names instead of only numbers;
417
+ - grouped table summaries by condition/time/source;
418
+ - skeleton QC feature masks, branch labels, and short-branch pruning;
419
+ - distance transforms, marker generation, and marker-controlled watershed;
420
+ - richer 3D mesh morphology and calibrated physical variants for extended
421
+ length/shape measurements;
422
+ - fluorescence background correction;
423
+ - OME-Zarr pyramids, label colors/properties, and preview-resolution selection;
424
+ - plate/well/field browsing, remote reads, batch execution, and memory-aware
425
+ lazy execution;
426
+ - richer non-image outputs, including points and scalar summaries;
427
+ - batch execution over files, positions, channels, z-slices, and timepoints.
428
+
429
+ See `docs/planning.md` for broader planning, `docs/io-user-guide.md` for current
430
+ I/O behavior, `docs/ome-io-plan.md` for the accepted OME architecture, and
431
+ `docs/research-and-publication.md` for the evidence and publication record.