Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
qim3d
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
QIM
Tools
qim3d
Commits
2679ae2e
Commit
2679ae2e
authored
1 year ago
by
Christian Kento Rasmussen
Browse files
Options
Downloads
Patches
Plain Diff
added convert for tiff stack
parent
ad886118
No related branches found
No related tags found
1 merge request
!102
Conv zarr tiff folders
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
qim3d/io/convert.py
+52
-32
52 additions, 32 deletions
qim3d/io/convert.py
with
52 additions
and
32 deletions
qim3d/io/convert.py
+
52
−
32
View file @
2679ae2e
...
@@ -10,6 +10,7 @@ from tqdm import tqdm
...
@@ -10,6 +10,7 @@ from tqdm import tqdm
from
qim3d.utils.internal_tools
import
stringify_path
from
qim3d.utils.internal_tools
import
stringify_path
from
qim3d.io.saving
import
save
from
qim3d.io.saving
import
save
from
qim3d.io.loading
import
load
class
Convert
:
class
Convert
:
...
@@ -24,10 +25,11 @@ class Convert:
...
@@ -24,10 +25,11 @@ class Convert:
def
convert
(
self
,
input_path
,
output_path
):
def
convert
(
self
,
input_path
,
output_path
):
def
get_file_extension
(
file_path
):
def
get_file_extension
(
file_path
):
root
,
ext
=
os
.
path
.
splitext
(
file_path
)
root
,
ext
=
os
.
path
.
splitext
(
file_path
)
if
ext
in
[
'
.gz
'
,
'
.bz2
'
,
'
.xz
'
]:
# handle common compressed extensions
if
ext
in
[
"
.gz
"
,
"
.bz2
"
,
"
.xz
"
]:
# handle common compressed extensions
root
,
ext2
=
os
.
path
.
splitext
(
root
)
root
,
ext2
=
os
.
path
.
splitext
(
root
)
ext
=
ext2
+
ext
ext
=
ext2
+
ext
return
ext
return
ext
# Stringify path in case it is not already a string
# Stringify path in case it is not already a string
input_path
=
stringify_path
(
input_path
)
input_path
=
stringify_path
(
input_path
)
input_ext
=
get_file_extension
(
input_path
)
input_ext
=
get_file_extension
(
input_path
)
...
@@ -67,20 +69,13 @@ class Convert:
...
@@ -67,20 +69,13 @@ class Convert:
else
:
else
:
raise
ValueError
(
"
Invalid path
"
)
raise
ValueError
(
"
Invalid path
"
)
def
convert_tif_to_zarr
(
self
,
tif_path
,
zarr_path
):
def
_save_zarr
(
self
,
zarr_path
,
vol
):
"""
Convert a tiff file to a zarr file
Args:
tif_path (str): path to the tiff file
zarr_path (str): path to the zarr file
chunks (tuple, optional): chunk size for the zarr file. Defaults to (64, 64, 64).
Returns:
zarr.core.Array: zarr array containing the data from the tiff file
"""
vol
=
tiff
.
memmap
(
tif_path
)
z
=
zarr
.
open
(
z
=
zarr
.
open
(
zarr_path
,
mode
=
"
w
"
,
shape
=
vol
.
shape
,
chunks
=
self
.
chunk_shape
,
dtype
=
vol
.
dtype
zarr_path
,
mode
=
"
w
"
,
shape
=
vol
.
shape
,
chunks
=
self
.
chunk_shape
,
dtype
=
vol
.
dtype
,
)
)
chunk_shape
=
tuple
((
s
+
c
-
1
)
//
c
for
s
,
c
in
zip
(
z
.
shape
,
z
.
chunks
))
chunk_shape
=
tuple
((
s
+
c
-
1
)
//
c
for
s
,
c
in
zip
(
z
.
shape
,
z
.
chunks
))
# ! Fastest way is z[:] = vol[:], but does not have a progress bar
# ! Fastest way is z[:] = vol[:], but does not have a progress bar
...
@@ -97,6 +92,20 @@ class Convert:
...
@@ -97,6 +92,20 @@ class Convert:
return
z
return
z
def
convert_tif_to_zarr
(
self
,
tif_path
,
zarr_path
):
"""
Convert a tiff file to a zarr file
Args:
tif_path (str): path to the tiff file
zarr_path (str): path to the zarr file
chunks (tuple, optional): chunk size for the zarr file. Defaults to (64, 64, 64).
Returns:
zarr.core.Array: zarr array containing the data from the tiff file
"""
vol
=
tiff
.
memmap
(
tif_path
)
return
self
.
_save_zarr
(
zarr_path
,
vol
)
def
convert_zarr_to_tif
(
self
,
zarr_path
,
tif_path
):
def
convert_zarr_to_tif
(
self
,
zarr_path
,
tif_path
):
"""
Convert a zarr file to a tiff file
"""
Convert a zarr file to a tiff file
...
@@ -110,6 +119,33 @@ class Convert:
...
@@ -110,6 +119,33 @@ class Convert:
z
=
zarr
.
open
(
zarr_path
)
z
=
zarr
.
open
(
zarr_path
)
save
(
tif_path
,
z
)
save
(
tif_path
,
z
)
def
convert_tiff_stack_to_zarr
(
self
,
tiff_stack_path
,
zarr_path
):
"""
Convert a tiff stack to a zarr file
Args:
tiff_stack_path (str): path to the tiff stack
zarr_path (str): path to the zarr file
Returns:
zarr.core.Array: zarr array containing the data from the tiff stack
"""
# ! tiff stack memmap is stored as slices on disk and not as a single file, making assignments to blocks slow.
vol
=
load
(
tiff_stack_path
,
virtual_stack
=
True
)
return
self
.
_save_zarr
(
zarr_path
,
vol
)
def
convert_zarr_to_tiff_stack
(
self
,
zarr_path
,
tiff_stack_path
):
"""
Convert a zarr file to a tiff stack
Args:
zarr_path (str): path to the zarr file
tiff_stack_path (str): path to the tiff stack
Returns:
None
"""
z
=
zarr
.
open
(
zarr_path
)
save
(
tiff_stack_path
,
z
)
def
convert_nifti_to_zarr
(
self
,
nifti_path
,
zarr_path
):
def
convert_nifti_to_zarr
(
self
,
nifti_path
,
zarr_path
):
"""
Convert a nifti file to a zarr file
"""
Convert a nifti file to a zarr file
...
@@ -121,23 +157,7 @@ class Convert:
...
@@ -121,23 +157,7 @@ class Convert:
zarr.core.Array: zarr array containing the data from the nifti file
zarr.core.Array: zarr array containing the data from the nifti file
"""
"""
vol
=
nib
.
load
(
nifti_path
).
dataobj
vol
=
nib
.
load
(
nifti_path
).
dataobj
z
=
zarr
.
open
(
return
self
.
_save_zarr
(
zarr_path
,
vol
)
zarr_path
,
mode
=
"
w
"
,
shape
=
vol
.
shape
,
chunks
=
self
.
chunk_shape
,
dtype
=
vol
.
dtype
)
chunk_shape
=
tuple
((
s
+
c
-
1
)
//
c
for
s
,
c
in
zip
(
z
.
shape
,
z
.
chunks
))
# ! Fastest way is z[:] = vol[:], but does not have a progress bar
for
chunk_indices
in
tqdm
(
product
(
*
[
range
(
n
)
for
n
in
chunk_shape
]),
total
=
np
.
prod
(
chunk_shape
)
):
slices
=
tuple
(
slice
(
c
*
i
,
min
(
c
*
(
i
+
1
),
s
))
for
s
,
c
,
i
in
zip
(
z
.
shape
,
z
.
chunks
,
chunk_indices
)
)
temp_data
=
vol
[
slices
]
# The assignment takes 99% of the cpu-time
z
.
blocks
[
chunk_indices
]
=
temp_data
return
z
def
convert_zarr_to_nifti
(
self
,
zarr_path
,
nifti_path
,
compression
=
False
):
def
convert_zarr_to_nifti
(
self
,
zarr_path
,
nifti_path
,
compression
=
False
):
"""
Convert a zarr file to a nifti file
"""
Convert a zarr file to a nifti file
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment