Parent epic: #84
Implementation: #95, stacked on #96
Goal
Retain the public scikit-image feature API and its frozen calculation result for valid inputs while moving persistence to copick core and correcting the pre-existing trailing-overlap failure.
Compatibility contract
Keep every existing parameter, order, default, return type, and the unused copick_root argument. Append only optional keyword-only controls:
def compute_skimage_features(
# existing parameters unchanged
feature_chunk_size=None,
*,
chunks=None,
shards=None,
): ...
Implemented scope
- Preserve metadata-based chunk-wise input reads, scalar overlap, transpose, and edge behavior.
- Derive bounded source-read, local-crop, and output slices independently on each axis, fixing the broadcast failure when an image ends inside trailing overlap.
- Remove direct feature Zarr creation and codec selection.
- Stage one feature-major
float32 tensor in a temporary np.memmap rather than process memory.
- Preserve
new_features() timing and existing partial-entity failure behavior.
- Release and remove staging after both success and failure.
- Call
CopickFeatures.from_numpy(..., dtype=np.float32, overwrite=True) once after calculation.
- Keep
feature_chunk_size as the computation size and as the storage-chunk fallback when explicit chunks is omitted.
- Pass optional
chunks and shards through core validation.
Acceptance criteria
Non-goals
- No equivalence requirement with a whole-volume scikit-image call.
- No support guarantee beyond available temporary-disk capacity.
- No new rollback of partially created Copick entities.
- No broad converter or layout coverage expansion in this correction.
Parent epic: #84
Implementation: #95, stacked on #96
Goal
Retain the public scikit-image feature API and its frozen calculation result for valid inputs while moving persistence to copick core and correcting the pre-existing trailing-overlap failure.
Compatibility contract
Keep every existing parameter, order, default, return type, and the unused
copick_rootargument. Append only optional keyword-only controls:Implemented scope
float32tensor in a temporarynp.memmaprather than process memory.new_features()timing and existing partial-entity failure behavior.CopickFeatures.from_numpy(..., dtype=np.float32, overwrite=True)once after calculation.feature_chunk_sizeas the computation size and as the storage-chunk fallback when explicitchunksis omitted.chunksandshardsthrough core validation.Acceptance criteria
chunksandshardsare optional keyword-only arguments.Non-goals