Skip to content
Snippets Groups Projects
Commit 569b8d86 authored by Alessia Saccardo's avatar Alessia Saccardo
Browse files

fix unit-tests filters

parent 72da7045
No related branches found
No related tags found
2 merge requests!145Refactor tests for processing and adapt it to new library structure, plus fix...,!140Fix unit tests
This commit is part of merge request !145. Comments created here will be created in the context of that merge request.
......@@ -8,9 +8,10 @@ from skimage import morphology
import dask.array as da
import dask_image.ndfilters as dask_ndfilters
from qim3d.utils._logger import log
from qim3d.utils import log
__all__ = [
"FilterBase",
"Gaussian",
"Median",
"Maximum",
......@@ -26,7 +27,7 @@ __all__ = [
class FilterBase:
def __init__(self, dask=False, chunks="auto", *args, **kwargs):
def __init__(self, *args, dask=False, chunks="auto", **kwargs):
"""
Base class for image filters.
......@@ -210,7 +211,7 @@ class Pipeline:
return input
def gaussian(vol, dask=False, chunks='auto', *args, **kwargs):
def gaussian(vol, *args, dask=False, chunks='auto', **kwargs):
"""
Applies a Gaussian filter to the input volume using scipy.ndimage.gaussian_filter or dask_image.ndfilters.gaussian_filter.
......
import qim3d
from qim3d.filters import *
import numpy as np
import pytest
import re
def test_filter_base_initialization():
filter_base = qim3d.processing.filters.FilterBase(3,size=2)
filter_base = qim3d.filters.FilterBase(3,size=2)
assert filter_base.args == (3,)
assert filter_base.kwargs == {'size': 2}
......@@ -13,10 +12,10 @@ def test_gaussian_filter():
input_image = np.random.rand(50, 50)
# Testing the function
filtered_image_fn = gaussian(input_image,sigma=1.5)
filtered_image_fn = qim3d.filters.gaussian(input_image,sigma=1.5)
# Testing the class method
gaussian_filter_cls = Gaussian(sigma=1.5)
gaussian_filter_cls = qim3d.filters.Gaussian(sigma=1.5)
filtered_image_cls = gaussian_filter_cls(input_image)
# Assertions
......@@ -28,10 +27,10 @@ def test_median_filter():
input_image = np.random.rand(50, 50)
# Testing the function
filtered_image_fn = median(input_image, size=3)
filtered_image_fn = qim3d.filters.median(input_image, size=3)
# Testing the class method
median_filter_cls = Median(size=3)
median_filter_cls = qim3d.filters.Median(size=3)
filtered_image_cls = median_filter_cls(input_image)
# Assertions
......@@ -43,10 +42,10 @@ def test_maximum_filter():
input_image = np.random.rand(50, 50)
# Testing the function
filtered_image_fn = maximum(input_image, size=3)
filtered_image_fn = qim3d.filters.maximum(input_image, size=3)
# Testing the class method
maximum_filter_cls = Maximum(size=3)
maximum_filter_cls = qim3d.filters.Maximum(size=3)
filtered_image_cls = maximum_filter_cls(input_image)
# Assertions
......@@ -58,10 +57,10 @@ def test_minimum_filter():
input_image = np.random.rand(50, 50)
# Testing the function
filtered_image_fn = minimum(input_image, size=3)
filtered_image_fn = qim3d.filters.minimum(input_image, size=3)
# Testing the class method
minimum_filter_cls = Minimum(size=3)
minimum_filter_cls = qim3d.filters.Minimum(size=3)
filtered_image_cls = minimum_filter_cls(input_image)
# Assertions
......@@ -73,16 +72,16 @@ def test_sequential_filter_pipeline():
input_image = np.random.rand(50, 50)
# Individual filters
gaussian_filter = Gaussian(sigma=1.5)
median_filter = Median(size=3)
maximum_filter = Maximum(size=3)
gaussian_filter = qim3d.filters.Gaussian(sigma=1.5)
median_filter = qim3d.filters.Median(size=3)
maximum_filter = qim3d.filters.Maximum(size=3)
# Testing the sequential pipeline
sequential_pipeline = Pipeline(gaussian_filter, median_filter, maximum_filter)
sequential_pipeline = qim3d.filters.Pipeline(gaussian_filter, median_filter, maximum_filter)
filtered_image_pipeline = sequential_pipeline(input_image)
# Testing the equivalence to maximum(median(gaussian(input,**kwargs),**kwargs),**kwargs)
expected_output = maximum(median(gaussian(input_image, sigma=1.5), size=3), size=3)
expected_output = qim3d.filters.maximum(qim3d.filters.median(qim3d.filters.gaussian(input_image, sigma=1.5), size=3), size=3)
# Assertions
assert filtered_image_pipeline.shape == expected_output.shape == input_image.shape
......@@ -93,16 +92,16 @@ def test_sequential_filter_appending():
input_image = np.random.rand(50, 50)
# Individual filters
gaussian_filter = Gaussian(sigma=1.5)
median_filter = Median(size=3)
maximum_filter = Maximum(size=3)
gaussian_filter = qim3d.filters.Gaussian(sigma=1.5)
median_filter = qim3d.filters.Median(size=3)
maximum_filter = qim3d.filters.Maximum(size=3)
# Sequential pipeline with filter initialized at the beginning
sequential_pipeline_initial = Pipeline(gaussian_filter, median_filter, maximum_filter)
sequential_pipeline_initial = qim3d.filters.Pipeline(gaussian_filter, median_filter, maximum_filter)
filtered_image_initial = sequential_pipeline_initial(input_image)
# Sequential pipeline with filter appended
sequential_pipeline_appended = Pipeline(gaussian_filter, median_filter)
sequential_pipeline_appended = qim3d.filters.Pipeline(gaussian_filter, median_filter)
sequential_pipeline_appended.append(maximum_filter)
filtered_image_appended = sequential_pipeline_appended(input_image)
......@@ -113,7 +112,7 @@ def test_sequential_filter_appending():
def test_assertion_error_not_filterbase_subclass():
# Get valid filter classes
valid_filters = [subclass.__name__ for subclass in qim3d.processing.filters.FilterBase.__subclasses__()]
valid_filters = [subclass.__name__ for subclass in qim3d.filters.FilterBase.__subclasses__()]
# Create invalid object
invalid_filter = object() # An object that is not an instance of FilterBase
......@@ -124,4 +123,4 @@ def test_assertion_error_not_filterbase_subclass():
# Use pytest.raises to catch the AssertionError
with pytest.raises(AssertionError, match=re.escape(message)):
sequential_pipeline = Pipeline(invalid_filter)
\ No newline at end of file
sequential_pipeline = qim3d.filters.Pipeline(invalid_filter)
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment