sigima 0.0.1.dev0__py3-none-any.whl → 1.0.0__py3-none-any.whl
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.
- sigima/__init__.py +142 -2
- sigima/client/__init__.py +105 -0
- sigima/client/base.py +780 -0
- sigima/client/remote.py +469 -0
- sigima/client/stub.py +814 -0
- sigima/client/utils.py +90 -0
- sigima/config.py +444 -0
- sigima/data/logo/Sigima.svg +135 -0
- sigima/data/tests/annotations.json +798 -0
- sigima/data/tests/curve_fitting/exponential_fit.txt +511 -0
- sigima/data/tests/curve_fitting/gaussian_fit.txt +100 -0
- sigima/data/tests/curve_fitting/piecewiseexponential_fit.txt +1022 -0
- sigima/data/tests/curve_fitting/polynomial_fit.txt +100 -0
- sigima/data/tests/curve_fitting/twohalfgaussian_fit.txt +1000 -0
- sigima/data/tests/curve_formats/bandwidth.txt +201 -0
- sigima/data/tests/curve_formats/boxcar.npy +0 -0
- sigima/data/tests/curve_formats/datetime.txt +1001 -0
- sigima/data/tests/curve_formats/dynamic_parameters.txt +4000 -0
- sigima/data/tests/curve_formats/fw1e2.txt +301 -0
- sigima/data/tests/curve_formats/fwhm.txt +319 -0
- sigima/data/tests/curve_formats/multiple_curves.csv +29 -0
- sigima/data/tests/curve_formats/noised_saw.mat +0 -0
- sigima/data/tests/curve_formats/oscilloscope.csv +111 -0
- sigima/data/tests/curve_formats/other/other2/recursive2.txt +5 -0
- sigima/data/tests/curve_formats/other/recursive1.txt +5 -0
- sigima/data/tests/curve_formats/paracetamol.npy +0 -0
- sigima/data/tests/curve_formats/paracetamol.txt +1010 -0
- sigima/data/tests/curve_formats/paracetamol_dx_dy.csv +1000 -0
- sigima/data/tests/curve_formats/paracetamol_dy.csv +1001 -0
- sigima/data/tests/curve_formats/pulse1.npy +0 -0
- sigima/data/tests/curve_formats/pulse2.npy +0 -0
- sigima/data/tests/curve_formats/simple.txt +5 -0
- sigima/data/tests/curve_formats/spectrum.mca +2139 -0
- sigima/data/tests/curve_formats/square2.npy +0 -0
- sigima/data/tests/curve_formats/step.npy +0 -0
- sigima/data/tests/fabry-perot1.jpg +0 -0
- sigima/data/tests/fabry-perot2.jpg +0 -0
- sigima/data/tests/flower.npy +0 -0
- sigima/data/tests/image_formats/NF 180338201.scor-data +11003 -0
- sigima/data/tests/image_formats/binary_image.npy +0 -0
- sigima/data/tests/image_formats/binary_image.png +0 -0
- sigima/data/tests/image_formats/centroid_test.npy +0 -0
- sigima/data/tests/image_formats/coordinated_text/complex_image.txt +10011 -0
- sigima/data/tests/image_formats/coordinated_text/complex_ref_image.txt +10010 -0
- sigima/data/tests/image_formats/coordinated_text/image.txt +15 -0
- sigima/data/tests/image_formats/coordinated_text/image2.txt +14 -0
- sigima/data/tests/image_formats/coordinated_text/image_no_unit_no_label.txt +14 -0
- sigima/data/tests/image_formats/coordinated_text/image_with_nan.txt +15 -0
- sigima/data/tests/image_formats/coordinated_text/image_with_unit.txt +14 -0
- sigima/data/tests/image_formats/fiber.csv +480 -0
- sigima/data/tests/image_formats/fiber.jpg +0 -0
- sigima/data/tests/image_formats/fiber.png +0 -0
- sigima/data/tests/image_formats/fiber.txt +480 -0
- sigima/data/tests/image_formats/gaussian_spot_with_noise.npy +0 -0
- sigima/data/tests/image_formats/mr-brain.dcm +0 -0
- sigima/data/tests/image_formats/noised_gaussian.mat +0 -0
- sigima/data/tests/image_formats/sif_reader/nd_lum_image_no_glue.sif +0 -0
- sigima/data/tests/image_formats/sif_reader/raman1.sif +0 -0
- sigima/data/tests/image_formats/tiling.txt +10 -0
- sigima/data/tests/image_formats/uint16.tiff +0 -0
- sigima/data/tests/image_formats/uint8.tiff +0 -0
- sigima/data/tests/laser_beam/TEM00_z_13.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_18.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_23.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_30.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_35.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_40.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_45.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_50.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_55.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_60.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_65.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_70.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_75.jpg +0 -0
- sigima/data/tests/laser_beam/TEM00_z_80.jpg +0 -0
- sigima/enums.py +195 -0
- sigima/io/__init__.py +123 -0
- sigima/io/base.py +311 -0
- sigima/io/common/__init__.py +5 -0
- sigima/io/common/basename.py +164 -0
- sigima/io/common/converters.py +189 -0
- sigima/io/common/objmeta.py +181 -0
- sigima/io/common/textreader.py +58 -0
- sigima/io/convenience.py +157 -0
- sigima/io/enums.py +17 -0
- sigima/io/ftlab.py +395 -0
- sigima/io/image/__init__.py +9 -0
- sigima/io/image/base.py +177 -0
- sigima/io/image/formats.py +1016 -0
- sigima/io/image/funcs.py +414 -0
- sigima/io/signal/__init__.py +9 -0
- sigima/io/signal/base.py +129 -0
- sigima/io/signal/formats.py +290 -0
- sigima/io/signal/funcs.py +723 -0
- sigima/objects/__init__.py +260 -0
- sigima/objects/base.py +937 -0
- sigima/objects/image/__init__.py +88 -0
- sigima/objects/image/creation.py +556 -0
- sigima/objects/image/object.py +524 -0
- sigima/objects/image/roi.py +904 -0
- sigima/objects/scalar/__init__.py +57 -0
- sigima/objects/scalar/common.py +215 -0
- sigima/objects/scalar/geometry.py +502 -0
- sigima/objects/scalar/table.py +784 -0
- sigima/objects/shape.py +290 -0
- sigima/objects/signal/__init__.py +133 -0
- sigima/objects/signal/constants.py +27 -0
- sigima/objects/signal/creation.py +1428 -0
- sigima/objects/signal/object.py +444 -0
- sigima/objects/signal/roi.py +274 -0
- sigima/params.py +405 -0
- sigima/proc/__init__.py +96 -0
- sigima/proc/base.py +381 -0
- sigima/proc/decorator.py +330 -0
- sigima/proc/image/__init__.py +513 -0
- sigima/proc/image/arithmetic.py +335 -0
- sigima/proc/image/base.py +260 -0
- sigima/proc/image/detection.py +519 -0
- sigima/proc/image/edges.py +329 -0
- sigima/proc/image/exposure.py +406 -0
- sigima/proc/image/extraction.py +458 -0
- sigima/proc/image/filtering.py +219 -0
- sigima/proc/image/fourier.py +147 -0
- sigima/proc/image/geometry.py +661 -0
- sigima/proc/image/mathops.py +340 -0
- sigima/proc/image/measurement.py +195 -0
- sigima/proc/image/morphology.py +155 -0
- sigima/proc/image/noise.py +107 -0
- sigima/proc/image/preprocessing.py +182 -0
- sigima/proc/image/restoration.py +235 -0
- sigima/proc/image/threshold.py +217 -0
- sigima/proc/image/transformations.py +393 -0
- sigima/proc/signal/__init__.py +376 -0
- sigima/proc/signal/analysis.py +206 -0
- sigima/proc/signal/arithmetic.py +551 -0
- sigima/proc/signal/base.py +262 -0
- sigima/proc/signal/extraction.py +60 -0
- sigima/proc/signal/features.py +310 -0
- sigima/proc/signal/filtering.py +484 -0
- sigima/proc/signal/fitting.py +276 -0
- sigima/proc/signal/fourier.py +259 -0
- sigima/proc/signal/mathops.py +420 -0
- sigima/proc/signal/processing.py +580 -0
- sigima/proc/signal/stability.py +175 -0
- sigima/proc/title_formatting.py +227 -0
- sigima/proc/validation.py +272 -0
- sigima/tests/__init__.py +7 -0
- sigima/tests/common/__init__.py +0 -0
- sigima/tests/common/arithmeticparam_unit_test.py +26 -0
- sigima/tests/common/basename_unit_test.py +126 -0
- sigima/tests/common/client_unit_test.py +412 -0
- sigima/tests/common/converters_unit_test.py +77 -0
- sigima/tests/common/decorator_unit_test.py +176 -0
- sigima/tests/common/examples_unit_test.py +104 -0
- sigima/tests/common/kernel_normalization_unit_test.py +242 -0
- sigima/tests/common/roi_basic_unit_test.py +73 -0
- sigima/tests/common/roi_geometry_unit_test.py +171 -0
- sigima/tests/common/scalar_builder_unit_test.py +142 -0
- sigima/tests/common/scalar_unit_test.py +991 -0
- sigima/tests/common/shape_unit_test.py +183 -0
- sigima/tests/common/stat_unit_test.py +138 -0
- sigima/tests/common/title_formatting_unit_test.py +338 -0
- sigima/tests/common/tools_coordinates_unit_test.py +60 -0
- sigima/tests/common/transformations_unit_test.py +178 -0
- sigima/tests/common/validation_unit_test.py +205 -0
- sigima/tests/conftest.py +129 -0
- sigima/tests/data.py +998 -0
- sigima/tests/env.py +280 -0
- sigima/tests/guiutils.py +163 -0
- sigima/tests/helpers.py +532 -0
- sigima/tests/image/__init__.py +28 -0
- sigima/tests/image/binning_unit_test.py +128 -0
- sigima/tests/image/blob_detection_unit_test.py +312 -0
- sigima/tests/image/centroid_unit_test.py +170 -0
- sigima/tests/image/check_2d_array_unit_test.py +63 -0
- sigima/tests/image/contour_unit_test.py +172 -0
- sigima/tests/image/convolution_unit_test.py +178 -0
- sigima/tests/image/datatype_unit_test.py +67 -0
- sigima/tests/image/edges_unit_test.py +155 -0
- sigima/tests/image/enclosingcircle_unit_test.py +88 -0
- sigima/tests/image/exposure_unit_test.py +223 -0
- sigima/tests/image/fft2d_unit_test.py +189 -0
- sigima/tests/image/filtering_unit_test.py +166 -0
- sigima/tests/image/geometry_unit_test.py +654 -0
- sigima/tests/image/hough_circle_unit_test.py +147 -0
- sigima/tests/image/imageobj_unit_test.py +737 -0
- sigima/tests/image/morphology_unit_test.py +71 -0
- sigima/tests/image/noise_unit_test.py +57 -0
- sigima/tests/image/offset_correction_unit_test.py +72 -0
- sigima/tests/image/operation_unit_test.py +518 -0
- sigima/tests/image/peak2d_limits_unit_test.py +41 -0
- sigima/tests/image/peak2d_unit_test.py +133 -0
- sigima/tests/image/profile_unit_test.py +159 -0
- sigima/tests/image/projections_unit_test.py +121 -0
- sigima/tests/image/restoration_unit_test.py +141 -0
- sigima/tests/image/roi2dparam_unit_test.py +53 -0
- sigima/tests/image/roi_advanced_unit_test.py +588 -0
- sigima/tests/image/roi_grid_unit_test.py +279 -0
- sigima/tests/image/spectrum2d_unit_test.py +40 -0
- sigima/tests/image/threshold_unit_test.py +91 -0
- sigima/tests/io/__init__.py +0 -0
- sigima/tests/io/addnewformat_unit_test.py +125 -0
- sigima/tests/io/convenience_funcs_unit_test.py +470 -0
- sigima/tests/io/coordinated_text_format_unit_test.py +495 -0
- sigima/tests/io/datetime_csv_unit_test.py +198 -0
- sigima/tests/io/imageio_formats_test.py +41 -0
- sigima/tests/io/ioregistry_unit_test.py +69 -0
- sigima/tests/io/objmeta_unit_test.py +87 -0
- sigima/tests/io/readobj_unit_test.py +130 -0
- sigima/tests/io/readwriteobj_unit_test.py +67 -0
- sigima/tests/signal/__init__.py +0 -0
- sigima/tests/signal/analysis_unit_test.py +135 -0
- sigima/tests/signal/check_1d_arrays_unit_test.py +169 -0
- sigima/tests/signal/convolution_unit_test.py +404 -0
- sigima/tests/signal/datetime_unit_test.py +176 -0
- sigima/tests/signal/fft1d_unit_test.py +303 -0
- sigima/tests/signal/filters_unit_test.py +403 -0
- sigima/tests/signal/fitting_unit_test.py +929 -0
- sigima/tests/signal/fwhm_unit_test.py +111 -0
- sigima/tests/signal/noise_unit_test.py +128 -0
- sigima/tests/signal/offset_correction_unit_test.py +34 -0
- sigima/tests/signal/operation_unit_test.py +489 -0
- sigima/tests/signal/peakdetection_unit_test.py +145 -0
- sigima/tests/signal/processing_unit_test.py +657 -0
- sigima/tests/signal/pulse/__init__.py +112 -0
- sigima/tests/signal/pulse/crossing_times_unit_test.py +123 -0
- sigima/tests/signal/pulse/plateau_detection_unit_test.py +102 -0
- sigima/tests/signal/pulse/pulse_unit_test.py +1824 -0
- sigima/tests/signal/roi_advanced_unit_test.py +392 -0
- sigima/tests/signal/signalobj_unit_test.py +603 -0
- sigima/tests/signal/stability_unit_test.py +431 -0
- sigima/tests/signal/uncertainty_unit_test.py +611 -0
- sigima/tests/vistools.py +1030 -0
- sigima/tools/__init__.py +59 -0
- sigima/tools/checks.py +290 -0
- sigima/tools/coordinates.py +308 -0
- sigima/tools/datatypes.py +26 -0
- sigima/tools/image/__init__.py +97 -0
- sigima/tools/image/detection.py +451 -0
- sigima/tools/image/exposure.py +77 -0
- sigima/tools/image/extraction.py +48 -0
- sigima/tools/image/fourier.py +260 -0
- sigima/tools/image/geometry.py +190 -0
- sigima/tools/image/preprocessing.py +165 -0
- sigima/tools/signal/__init__.py +86 -0
- sigima/tools/signal/dynamic.py +254 -0
- sigima/tools/signal/features.py +135 -0
- sigima/tools/signal/filtering.py +171 -0
- sigima/tools/signal/fitting.py +1171 -0
- sigima/tools/signal/fourier.py +466 -0
- sigima/tools/signal/interpolation.py +70 -0
- sigima/tools/signal/peakdetection.py +126 -0
- sigima/tools/signal/pulse.py +1626 -0
- sigima/tools/signal/scaling.py +50 -0
- sigima/tools/signal/stability.py +258 -0
- sigima/tools/signal/windowing.py +90 -0
- sigima/worker.py +79 -0
- sigima-1.0.0.dist-info/METADATA +233 -0
- sigima-1.0.0.dist-info/RECORD +262 -0
- {sigima-0.0.1.dev0.dist-info → sigima-1.0.0.dist-info}/licenses/LICENSE +29 -29
- sigima-0.0.1.dev0.dist-info/METADATA +0 -60
- sigima-0.0.1.dev0.dist-info/RECORD +0 -6
- {sigima-0.0.1.dev0.dist-info → sigima-1.0.0.dist-info}/WHEEL +0 -0
- {sigima-0.0.1.dev0.dist-info → sigima-1.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Unit tests for morphology computation functions.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
from skimage import morphology
|
|
11
|
+
|
|
12
|
+
import sigima.objects
|
|
13
|
+
import sigima.params
|
|
14
|
+
import sigima.proc.image
|
|
15
|
+
from sigima.tests.data import get_test_image
|
|
16
|
+
from sigima.tests.helpers import check_array_result
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __generic_morphology_validation(method: str) -> None:
|
|
20
|
+
"""Generic test for morphology methods."""
|
|
21
|
+
# See [1] in sigima\tests\image\__init__.py for more details about the validation.
|
|
22
|
+
src = get_test_image("flower.npy")
|
|
23
|
+
p = sigima.params.MorphologyParam.create(radius=10)
|
|
24
|
+
dst: sigima.objects.ImageObj = getattr(sigima.proc.image, method)(src, p)
|
|
25
|
+
exp = getattr(morphology, method)(src.data, footprint=morphology.disk(p.radius))
|
|
26
|
+
check_array_result(f"{method.capitalize()}[radius={p.radius}]", dst.data, exp)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.mark.validation
|
|
30
|
+
def test_white_tophat() -> None:
|
|
31
|
+
"""Validation test for the image white top-hat processing."""
|
|
32
|
+
__generic_morphology_validation("white_tophat")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.mark.validation
|
|
36
|
+
def test_black_tophat() -> None:
|
|
37
|
+
"""Validation test for the image black top-hat processing."""
|
|
38
|
+
__generic_morphology_validation("black_tophat")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.mark.validation
|
|
42
|
+
def test_erosion() -> None:
|
|
43
|
+
"""Validation test for the image erosion processing."""
|
|
44
|
+
__generic_morphology_validation("erosion")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.mark.validation
|
|
48
|
+
def test_dilation() -> None:
|
|
49
|
+
"""Validation test for the image dilation processing."""
|
|
50
|
+
__generic_morphology_validation("dilation")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@pytest.mark.validation
|
|
54
|
+
def test_opening() -> None:
|
|
55
|
+
"""Validation test for the image opening processing."""
|
|
56
|
+
__generic_morphology_validation("opening")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@pytest.mark.validation
|
|
60
|
+
def test_closing() -> None:
|
|
61
|
+
"""Validation test for the image closing processing."""
|
|
62
|
+
__generic_morphology_validation("closing")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
if __name__ == "__main__":
|
|
66
|
+
test_white_tophat()
|
|
67
|
+
test_black_tophat()
|
|
68
|
+
test_erosion()
|
|
69
|
+
test_dilation()
|
|
70
|
+
test_opening()
|
|
71
|
+
test_closing()
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""Unit tests for image noise addition."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
import sigima.objects
|
|
11
|
+
import sigima.proc.image
|
|
12
|
+
from sigima.objects import NormalDistribution2DParam
|
|
13
|
+
from sigima.tests import guiutils
|
|
14
|
+
from sigima.tests.helpers import check_array_result, check_scalar_result
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.mark.validation
|
|
18
|
+
def test_image_add_gaussian_noise() -> None:
|
|
19
|
+
"""Test :py:func:`sigima.proc.image.add_gaussian_noise`."""
|
|
20
|
+
# Generate a clean image.
|
|
21
|
+
size = 512
|
|
22
|
+
param = sigima.objects.Gauss2DParam.create(height=size, width=size)
|
|
23
|
+
ima = sigima.objects.create_image_from_param(param)
|
|
24
|
+
# Add Gaussian noise.
|
|
25
|
+
# Run twice with same parameters to check reproducibility.
|
|
26
|
+
p = NormalDistribution2DParam.create(seed=42, mu=0.0, sigma=1.0)
|
|
27
|
+
res1 = sigima.proc.image.add_gaussian_noise(ima, p)
|
|
28
|
+
res2 = sigima.proc.image.add_gaussian_noise(ima, p)
|
|
29
|
+
|
|
30
|
+
guiutils.view_images_side_by_side_if_gui(
|
|
31
|
+
[ima, res1, res2],
|
|
32
|
+
["Clean", "Noisy (1)", "Noisy (2)"],
|
|
33
|
+
title=f"Gaussian Noise Addition ({size}x{size}): "
|
|
34
|
+
f"Noisy images should be identical (same seed)",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Shape must be preserved.
|
|
38
|
+
assert ima.data is not None
|
|
39
|
+
assert res1.data is not None
|
|
40
|
+
assert res1.data.shape == ima.data.shape
|
|
41
|
+
|
|
42
|
+
# Check noise statistics.
|
|
43
|
+
noise = res1.data - ima.data
|
|
44
|
+
mean_noise = float(np.mean(noise))
|
|
45
|
+
assert p.mu is not None
|
|
46
|
+
assert p.sigma is not None
|
|
47
|
+
expected_error = 5.0 * p.sigma / np.sqrt(ima.data.size)
|
|
48
|
+
check_scalar_result("Mean noise", mean_noise, p.mu, atol=expected_error)
|
|
49
|
+
|
|
50
|
+
# Identical results for same seed and distribution parameters.
|
|
51
|
+
assert res2.data is not None
|
|
52
|
+
check_array_result("Reproducibility", res1.data, res2.data)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if __name__ == "__main__":
|
|
56
|
+
guiutils.enable_gui()
|
|
57
|
+
test_image_add_gaussian_noise()
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Image offset correction unit test.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# pylint: disable=invalid-name # Allows short reference names like x, y, ...
|
|
8
|
+
# pylint: disable=duplicate-code
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
import sigima.objects
|
|
16
|
+
import sigima.params
|
|
17
|
+
import sigima.proc.image
|
|
18
|
+
from sigima.tests import guiutils
|
|
19
|
+
from sigima.tests.data import create_noisy_gaussian_image
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@pytest.mark.gui
|
|
23
|
+
def test_image_offset_correction_interactive() -> None:
|
|
24
|
+
"""Image offset correction interactive test."""
|
|
25
|
+
with guiutils.lazy_qt_app_context(force=True):
|
|
26
|
+
# pylint: disable=import-outside-toplevel
|
|
27
|
+
from plotpy.builder import make
|
|
28
|
+
from plotpy.items import RectangleShape
|
|
29
|
+
from plotpy.tools import RectangleTool
|
|
30
|
+
from plotpy.widgets.selectdialog import SelectDialog, select_with_shape_tool
|
|
31
|
+
|
|
32
|
+
from sigima.tests import vistools
|
|
33
|
+
|
|
34
|
+
i1 = create_noisy_gaussian_image()
|
|
35
|
+
shape: RectangleShape = select_with_shape_tool(
|
|
36
|
+
None,
|
|
37
|
+
RectangleTool,
|
|
38
|
+
make.image(i1.data, interpolation="nearest", eliminate_outliers=1.0),
|
|
39
|
+
"Select background area",
|
|
40
|
+
tooldialogclass=SelectDialog,
|
|
41
|
+
)
|
|
42
|
+
if shape is not None:
|
|
43
|
+
param = sigima.objects.ROI2DParam()
|
|
44
|
+
# pylint: disable=unbalanced-tuple-unpacking
|
|
45
|
+
ix0, iy0, ix1, iy1 = i1.physical_to_indices(shape.get_rect())
|
|
46
|
+
param.x0, param.y0, param.dx, param.dy = ix0, iy0, ix1 - ix0, iy1 - iy0
|
|
47
|
+
i2 = sigima.proc.image.offset_correction(i1, param)
|
|
48
|
+
i3 = sigima.proc.image.clip(i2, sigima.params.ClipParam.create(lower=0))
|
|
49
|
+
vistools.view_images_side_by_side(
|
|
50
|
+
[i1, i3],
|
|
51
|
+
titles=["Original image", "Corrected image"],
|
|
52
|
+
title="Image offset correction and thresholding",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@pytest.mark.validation
|
|
57
|
+
def test_image_offset_correction() -> None:
|
|
58
|
+
"""Image offset correction validation test."""
|
|
59
|
+
i1 = create_noisy_gaussian_image()
|
|
60
|
+
p = sigima.objects.ROI2DParam.create(x0=0, y0=0, dx=10, dy=10)
|
|
61
|
+
i2 = sigima.proc.image.offset_correction(i1, p)
|
|
62
|
+
|
|
63
|
+
# Check that the offset correction has been applied
|
|
64
|
+
ix0, iy0 = int(p.x0), int(p.y0)
|
|
65
|
+
ix1, iy1 = int(p.x0 + p.dx), int(p.y0 + p.dy)
|
|
66
|
+
offset = np.mean(i1.data[iy0:iy1, ix0:ix1])
|
|
67
|
+
assert np.allclose(i2.data, i1.data - offset), "Offset correction failed"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
if __name__ == "__main__":
|
|
71
|
+
test_image_offset_correction_interactive()
|
|
72
|
+
test_image_offset_correction()
|