Source code for ewoksndreg.tests.test_evaluation

import numpy
import pytest

from ..evaluation.eval_metrics import noisy_eval
from ..evaluation.eval_metrics import peak_eval
from ..evaluation.eval_metrics import smoothness_eval
from ..io.data_for_registration import generate_image
from ..io.data_for_registration import generate_image_stack
from ..math.normalization import stack_range_normalization
from ..transformation.homography import matrix_from_params
from ..transformation.numpy_backend import NumpyHomography


[docs] @pytest.mark.parametrize("name", argvalues=["astronaut", "gravel", "cell"]) @pytest.mark.parametrize("noise", ["uniform", "gaussian"]) def test_noisy_metric(name, noise): image = generate_image(name=name) image_stacks, _, _ = generate_image_stack(image, "rigid", nimages=5) image_stacks = numpy.stack(image_stacks) if noise == "uniform": noise = numpy.random.random(image_stacks.shape) elif noise == "gaussian": noise = numpy.random.normal(size=(image_stacks.shape)) stacks = [image_stacks + noise * i * 0.1 for i in range(5)] stacks = [stack_range_normalization(stack) for stack in stacks] errors = [noisy_eval(stack) for stack in stacks] for i in range(len(errors) - 1): assert errors[i] < errors[i + 1] + 0.1
[docs] @pytest.mark.parametrize("name", argvalues=["astronaut", "gravel", "cell"]) @pytest.mark.parametrize("noise", ["uniform", "gaussian"]) def test_peak_metric(name, noise): image = generate_image(name=name) image_stacks, _, _ = generate_image_stack(image, "translation", nimages=5) image_stacks = numpy.stack(image_stacks) if noise == "uniform": noise = numpy.random.random(image_stacks.shape) elif noise == "gaussian": noise = numpy.random.normal(size=(image_stacks.shape)) stacks = [image_stacks + noise * i * 0.05 for i in range(5)] stacks = [stack_range_normalization(stack) for stack in stacks] errors = [peak_eval(stack, 0) for stack in stacks] for i in range(len(errors) - 1): assert errors[i] < errors[i + 1] + 0.01
[docs] def test_smoothness_metric(): img_size = (120, 120) matrices = [ numpy.array([[1, 0, i], [0, 1, i], [0, 0, 1]], dtype=numpy.float64) for i in range(10) ] transformations = [NumpyHomography(matrix) for matrix in matrices] bigger_matrices = [ numpy.array([[1, 0, 2 * i], [0, 1, 2 * i], [0, 0, 1]], dtype=numpy.float64) for i in range(10) ] bigger_transformations = [NumpyHomography(matrix) for matrix in bigger_matrices] matrices = [ numpy.array( [[1, 0, i * ((-1) ** i)], [0, 1, i], [0, 0, 1]], dtype=numpy.float64 ) for i in range(10) ] jagged_transformations = [NumpyHomography(matrix) for matrix in matrices] val1 = smoothness_eval(transformations, img_size) val2 = smoothness_eval(bigger_transformations, img_size) val3 = smoothness_eval(jagged_transformations, img_size) print(val1, val2, val3) assert val1 < val2 and val2 < val3
[docs] def test_smoothness_metric_rot(): img_size = (120, 120) matrices = [matrix_from_params([i / 20, 0, 0], "rigid") for i in range(10)] transformations = [NumpyHomography(matrix) for matrix in matrices] bigger_matrices = [matrix_from_params([i / 10, 0, 0], "rigid") for i in range(10)] bigger_transformations = [NumpyHomography(matrix) for matrix in bigger_matrices] val1 = smoothness_eval(transformations, img_size) val2 = smoothness_eval(bigger_transformations, img_size) assert val1 < val2
[docs] def test_smoothness_metric_size(): img_size = (50, 50) img_size2 = (100, 100) matrices = [matrix_from_params([0, i, i], "rigid") for i in range(10)] transformations = [NumpyHomography(matrix) for matrix in matrices] val1 = smoothness_eval(transformations, img_size) val2 = smoothness_eval(transformations, img_size2) assert val1 > val2