summaryrefslogtreecommitdiff
path: root/silx/math/medianfilter/test/test_medianfilter.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/math/medianfilter/test/test_medianfilter.py')
-rw-r--r--silx/math/medianfilter/test/test_medianfilter.py740
1 files changed, 0 insertions, 740 deletions
diff --git a/silx/math/medianfilter/test/test_medianfilter.py b/silx/math/medianfilter/test/test_medianfilter.py
deleted file mode 100644
index 3a45b3d..0000000
--- a/silx/math/medianfilter/test/test_medianfilter.py
+++ /dev/null
@@ -1,740 +0,0 @@
-# coding: utf-8
-# ##########################################################################
-# Copyright (C) 2017-2018 European Synchrotron Radiation Facility
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-# ############################################################################
-"""Tests of the median filter"""
-
-__authors__ = ["H. Payno"]
-__license__ = "MIT"
-__date__ = "17/01/2018"
-
-import unittest
-import numpy
-from silx.math.medianfilter import medfilt2d, medfilt1d
-from silx.math.medianfilter.medianfilter import reflect, mirror
-from silx.math.medianfilter.medianfilter import MODES as silx_mf_modes
-from silx.utils.testutils import ParametricTestCase
-try:
- import scipy
- import scipy.misc
-except:
- scipy = None
-else:
- import scipy.ndimage
-
-import logging
-_logger = logging.getLogger(__name__)
-
-RANDOM_FLOAT_MAT = numpy.array([
- [0.05564293, 0.62717157, 0.75002406, 0.40555336, 0.70278975],
- [0.76532598, 0.02839148, 0.05272484, 0.65166994, 0.42161216],
- [0.23067427, 0.74219128, 0.56049024, 0.44406320, 0.28773158],
- [0.81025249, 0.20303021, 0.68382382, 0.46372299, 0.81281709],
- [0.94691602, 0.07813661, 0.81651256, 0.84220106, 0.33623165]])
-
-RANDOM_INT_MAT = numpy.array([
- [0, 5, 2, 6, 1],
- [2, 3, 1, 7, 1],
- [9, 8, 6, 7, 8],
- [5, 6, 8, 2, 4]])
-
-
-class TestMedianFilterNearest(ParametricTestCase):
- """Unit tests for the median filter in nearest mode"""
-
- def testFilter3_100(self):
- """Test median filter on a 10x10 matrix with a 3x3 kernel."""
- dataIn = numpy.arange(100, dtype=numpy.int32)
- dataIn = dataIn.reshape((10, 10))
-
- dataOut = medfilt2d(image=dataIn,
- kernel_size=(3, 3),
- conditional=False,
- mode='nearest')
- self.assertTrue(dataOut[0, 0] == 1)
- self.assertTrue(dataOut[9, 0] == 90)
- self.assertTrue(dataOut[9, 9] == 98)
-
- self.assertTrue(dataOut[0, 9] == 9)
- self.assertTrue(dataOut[0, 4] == 5)
- self.assertTrue(dataOut[9, 4] == 93)
- self.assertTrue(dataOut[4, 4] == 44)
-
- def testFilter3_9(self):
- "Test median filter on a 3x3 matrix with a 3x3 kernel."
- dataIn = numpy.array([0, -1, 1,
- 12, 6, -2,
- 100, 4, 12],
- dtype=numpy.int16)
- dataIn = dataIn.reshape((3, 3))
- dataOut = medfilt2d(image=dataIn,
- kernel_size=(3, 3),
- conditional=False,
- mode='nearest')
- self.assertTrue(dataOut.shape == dataIn.shape)
- self.assertTrue(dataOut[1, 1] == 4)
- self.assertTrue(dataOut[0, 0] == 0)
- self.assertTrue(dataOut[0, 1] == 0)
- self.assertTrue(dataOut[1, 0] == 6)
-
- def testFilterWidthOne(self):
- """Make sure a filter of one by one give the same result as the input
- """
- dataIn = numpy.arange(100, dtype=numpy.int32)
- dataIn = dataIn.reshape((10, 10))
-
- dataOut = medfilt2d(image=dataIn,
- kernel_size=(1, 1),
- conditional=False,
- mode='nearest')
-
- self.assertTrue(numpy.array_equal(dataIn, dataOut))
-
- def testFilter3_1d(self):
- """Test binding and result of the 1d filter"""
- self.assertTrue(numpy.array_equal(
- medfilt1d(RANDOM_INT_MAT[0], kernel_size=3, conditional=False,
- mode='nearest'),
- [0, 2, 5, 2, 1])
- )
-
- def testFilter3Conditionnal(self):
- """Test that the conditional filter apply correctly in a 10x10 matrix
- with a 3x3 kernel
- """
- dataIn = numpy.arange(100, dtype=numpy.int32)
- dataIn = dataIn.reshape((10, 10))
-
- dataOut = medfilt2d(image=dataIn,
- kernel_size=(3, 3),
- conditional=True,
- mode='nearest')
- self.assertTrue(dataOut[0, 0] == 1)
- self.assertTrue(dataOut[0, 1] == 1)
- self.assertTrue(numpy.array_equal(dataOut[1:8, 1:8], dataIn[1:8, 1:8]))
- self.assertTrue(dataOut[9, 9] == 98)
-
- def testFilter3_1D(self):
- """Simple test of a 3x3 median filter on a 1D array"""
- dataIn = numpy.arange(100, dtype=numpy.int32)
-
- dataOut = medfilt2d(image=dataIn,
- kernel_size=(5),
- conditional=False,
- mode='nearest')
-
- self.assertTrue(dataOut[0] == 0)
- self.assertTrue(dataOut[9] == 9)
- self.assertTrue(dataOut[99] == 99)
-
- def testNaNs(self):
- """Test median filter on image with NaNs in nearest mode"""
- # Data with a NaN in first corner
- nan_corner = numpy.arange(100.).reshape(10, 10)
- nan_corner[0, 0] = numpy.nan
- output = medfilt2d(
- nan_corner, kernel_size=3, conditional=False, mode='nearest')
- self.assertEqual(output[0, 0], 10)
- self.assertEqual(output[0, 1], 2)
- self.assertEqual(output[1, 0], 11)
- self.assertEqual(output[1, 1], 12)
-
- # Data with some NaNs
- some_nans = numpy.arange(100.).reshape(10, 10)
- some_nans[0, 1] = numpy.nan
- some_nans[1, 1] = numpy.nan
- some_nans[1, 0] = numpy.nan
- output = medfilt2d(
- some_nans, kernel_size=3, conditional=False, mode='nearest')
- self.assertEqual(output[0, 0], 0)
- self.assertEqual(output[0, 1], 2)
- self.assertEqual(output[1, 0], 20)
- self.assertEqual(output[1, 1], 20)
-
-
-class TestMedianFilterReflect(ParametricTestCase):
- """Unit test for the median filter in reflect mode"""
-
- def testArange9(self):
- """Test from a 3x3 window to RANDOM_FLOAT_MAT"""
- img = numpy.arange(9, dtype=numpy.int32)
- img = img.reshape(3, 3)
- kernel = (3, 3)
- res = medfilt2d(image=img,
- kernel_size=kernel,
- conditional=False,
- mode='reflect')
- self.assertTrue(
- numpy.array_equal(res.ravel(), [1, 2, 2, 3, 4, 5, 6, 6, 7]))
-
- def testRandom10(self):
- """Test a (5, 3) window to a RANDOM_FLOAT_MAT"""
- kernel = (5, 3)
-
- thRes = numpy.array([
- [0.23067427, 0.56049024, 0.56049024, 0.4440632, 0.42161216],
- [0.23067427, 0.62717157, 0.56049024, 0.56049024, 0.46372299],
- [0.62717157, 0.62717157, 0.56049024, 0.56049024, 0.4440632],
- [0.76532598, 0.68382382, 0.56049024, 0.56049024, 0.42161216],
- [0.81025249, 0.68382382, 0.56049024, 0.68382382, 0.46372299]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=False,
- mode='reflect')
-
- self.assertTrue(numpy.array_equal(thRes, res))
-
- def testApplyReflect1D(self):
- """Test the reflect function used for the median filter in reflect mode
- """
- # test for inside values
- self.assertTrue(reflect(2, 3) == 2)
- # test for boundaries values
- self.assertTrue(reflect(3, 3) == 2)
- self.assertTrue(reflect(4, 3) == 1)
- self.assertTrue(reflect(5, 3) == 0)
- self.assertTrue(reflect(6, 3) == 0)
- self.assertTrue(reflect(7, 3) == 1)
- self.assertTrue(reflect(-1, 3) == 0)
- self.assertTrue(reflect(-2, 3) == 1)
- self.assertTrue(reflect(-3, 3) == 2)
- self.assertTrue(reflect(-4, 3) == 2)
- self.assertTrue(reflect(-5, 3) == 1)
- self.assertTrue(reflect(-6, 3) == 0)
- self.assertTrue(reflect(-7, 3) == 0)
-
- def testRandom10Conditionnal(self):
- """Test the median filter in reflect mode and with the conditionnal
- option"""
- kernel = (3, 1)
-
- thRes = numpy.array([
- [0.05564293, 0.62717157, 0.75002406, 0.40555336, 0.70278975],
- [0.23067427, 0.62717157, 0.56049024, 0.44406320, 0.42161216],
- [0.76532598, 0.20303021, 0.56049024, 0.46372299, 0.42161216],
- [0.81025249, 0.20303021, 0.68382382, 0.46372299, 0.33623165],
- [0.94691602, 0.07813661, 0.81651256, 0.84220106, 0.33623165]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=True,
- mode='reflect')
- self.assertTrue(numpy.array_equal(thRes, res))
-
- def testNaNs(self):
- """Test median filter on image with NaNs in reflect mode"""
- # Data with a NaN in first corner
- nan_corner = numpy.arange(100.).reshape(10, 10)
- nan_corner[0, 0] = numpy.nan
- output = medfilt2d(
- nan_corner, kernel_size=3, conditional=False, mode='reflect')
- self.assertEqual(output[0, 0], 10)
- self.assertEqual(output[0, 1], 2)
- self.assertEqual(output[1, 0], 11)
- self.assertEqual(output[1, 1], 12)
-
- # Data with some NaNs
- some_nans = numpy.arange(100.).reshape(10, 10)
- some_nans[0, 1] = numpy.nan
- some_nans[1, 1] = numpy.nan
- some_nans[1, 0] = numpy.nan
- output = medfilt2d(
- some_nans, kernel_size=3, conditional=False, mode='reflect')
- self.assertEqual(output[0, 0], 0)
- self.assertEqual(output[0, 1], 2)
- self.assertEqual(output[1, 0], 20)
- self.assertEqual(output[1, 1], 20)
-
- def testFilter3_1d(self):
- """Test binding and result of the 1d filter"""
- self.assertTrue(numpy.array_equal(
- medfilt1d(RANDOM_INT_MAT[0], kernel_size=5, conditional=False,
- mode='reflect'),
- [2, 2, 2, 2, 2])
- )
-
-
-class TestMedianFilterMirror(ParametricTestCase):
- """Unit test for the median filter in mirror mode
- """
-
- def testApplyMirror1D(self):
- """Test the reflect function used for the median filter in mirror mode
- """
- # test for inside values
- self.assertTrue(mirror(2, 3) == 2)
- # test for boundaries values
- self.assertTrue(mirror(4, 4) == 2)
- self.assertTrue(mirror(5, 4) == 1)
- self.assertTrue(mirror(6, 4) == 0)
- self.assertTrue(mirror(7, 4) == 1)
- self.assertTrue(mirror(8, 4) == 2)
- self.assertTrue(mirror(-1, 4) == 1)
- self.assertTrue(mirror(-2, 4) == 2)
- self.assertTrue(mirror(-3, 4) == 3)
- self.assertTrue(mirror(-4, 4) == 2)
- self.assertTrue(mirror(-5, 4) == 1)
- self.assertTrue(mirror(-6, 4) == 0)
-
- def testRandom10(self):
- """Test a (5, 3) window to a random array"""
- kernel = (3, 5)
-
- thRes = numpy.array([
- [0.05272484, 0.40555336, 0.42161216, 0.42161216, 0.42161216],
- [0.56049024, 0.56049024, 0.4440632, 0.4440632, 0.4440632],
- [0.56049024, 0.46372299, 0.46372299, 0.46372299, 0.46372299],
- [0.68382382, 0.56049024, 0.56049024, 0.46372299, 0.56049024],
- [0.68382382, 0.46372299, 0.68382382, 0.46372299, 0.68382382]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=False,
- mode='mirror')
-
- self.assertTrue(numpy.array_equal(thRes, res))
-
- def testRandom10Conditionnal(self):
- """Test the median filter in reflect mode and with the conditionnal
- option"""
- kernel = (1, 3)
-
- thRes = numpy.array([
- [0.62717157, 0.62717157, 0.62717157, 0.70278975, 0.40555336],
- [0.02839148, 0.05272484, 0.05272484, 0.42161216, 0.65166994],
- [0.74219128, 0.56049024, 0.56049024, 0.44406320, 0.44406320],
- [0.20303021, 0.68382382, 0.46372299, 0.68382382, 0.46372299],
- [0.07813661, 0.81651256, 0.81651256, 0.81651256, 0.84220106]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=True,
- mode='mirror')
-
- self.assertTrue(numpy.array_equal(thRes, res))
-
- def testNaNs(self):
- """Test median filter on image with NaNs in mirror mode"""
- # Data with a NaN in first corner
- nan_corner = numpy.arange(100.).reshape(10, 10)
- nan_corner[0, 0] = numpy.nan
- output = medfilt2d(
- nan_corner, kernel_size=3, conditional=False, mode='mirror')
- self.assertEqual(output[0, 0], 11)
- self.assertEqual(output[0, 1], 11)
- self.assertEqual(output[1, 0], 11)
- self.assertEqual(output[1, 1], 12)
-
- # Data with some NaNs
- some_nans = numpy.arange(100.).reshape(10, 10)
- some_nans[0, 1] = numpy.nan
- some_nans[1, 1] = numpy.nan
- some_nans[1, 0] = numpy.nan
- output = medfilt2d(
- some_nans, kernel_size=3, conditional=False, mode='mirror')
- self.assertEqual(output[0, 0], 0)
- self.assertEqual(output[0, 1], 12)
- self.assertEqual(output[1, 0], 21)
- self.assertEqual(output[1, 1], 20)
-
- def testFilter3_1d(self):
- """Test binding and result of the 1d filter"""
- self.assertTrue(numpy.array_equal(
- medfilt1d(RANDOM_INT_MAT[0], kernel_size=5, conditional=False,
- mode='mirror'),
- [2, 5, 2, 5, 2])
- )
-
-class TestMedianFilterShrink(ParametricTestCase):
- """Unit test for the median filter in mirror mode
- """
-
- def testRandom_3x3(self):
- """Test the median filter in shrink mode and with the conditionnal
- option"""
- kernel = (3, 3)
-
- thRes = numpy.array([
- [0.62717157, 0.62717157, 0.62717157, 0.65166994, 0.65166994],
- [0.62717157, 0.56049024, 0.56049024, 0.44406320, 0.44406320],
- [0.74219128, 0.56049024, 0.46372299, 0.46372299, 0.46372299],
- [0.74219128, 0.68382382, 0.56049024, 0.56049024, 0.46372299],
- [0.81025249, 0.81025249, 0.68382382, 0.81281709, 0.81281709]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=False,
- mode='shrink')
-
- self.assertTrue(numpy.array_equal(thRes, res))
-
- def testBounds(self):
- """Test the median filter in shrink mode with 3 different kernels
- which should return the same result due to the large values of kernels
- used.
- """
- kernel1 = (1, 9)
- kernel2 = (1, 11)
- kernel3 = (1, 21)
-
- thRes = numpy.array([[2, 2, 2, 2, 2],
- [2, 2, 2, 2, 2],
- [8, 8, 8, 8, 8],
- [5, 5, 5, 5, 5]])
-
- resK1 = medfilt2d(image=RANDOM_INT_MAT,
- kernel_size=kernel1,
- conditional=False,
- mode='shrink')
-
- resK2 = medfilt2d(image=RANDOM_INT_MAT,
- kernel_size=kernel2,
- conditional=False,
- mode='shrink')
-
- resK3 = medfilt2d(image=RANDOM_INT_MAT,
- kernel_size=kernel3,
- conditional=False,
- mode='shrink')
-
- self.assertTrue(numpy.array_equal(resK1, thRes))
- self.assertTrue(numpy.array_equal(resK2, resK1))
- self.assertTrue(numpy.array_equal(resK3, resK1))
-
- def testRandom_3x3Conditionnal(self):
- """Test the median filter in reflect mode and with the conditionnal
- option"""
- kernel = (3, 3)
-
- thRes = numpy.array([
- [0.05564293, 0.62717157, 0.62717157, 0.40555336, 0.65166994],
- [0.62717157, 0.56049024, 0.05272484, 0.65166994, 0.42161216],
- [0.23067427, 0.74219128, 0.56049024, 0.44406320, 0.46372299],
- [0.81025249, 0.20303021, 0.68382382, 0.46372299, 0.81281709],
- [0.81025249, 0.81025249, 0.81651256, 0.81281709, 0.81281709]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=True,
- mode='shrink')
-
- self.assertTrue(numpy.array_equal(res, thRes))
-
- def testRandomInt(self):
- """Test 3x3 kernel on RANDOM_INT_MAT
- """
- kernel = (3, 3)
-
- thRes = numpy.array([[3, 2, 5, 2, 6],
- [5, 3, 6, 6, 7],
- [6, 6, 6, 6, 7],
- [8, 8, 7, 7, 7]])
-
- resK1 = medfilt2d(image=RANDOM_INT_MAT,
- kernel_size=kernel,
- conditional=False,
- mode='shrink')
-
- self.assertTrue(numpy.array_equal(resK1, thRes))
-
- def testNaNs(self):
- """Test median filter on image with NaNs in shrink mode"""
- # Data with a NaN in first corner
- nan_corner = numpy.arange(100.).reshape(10, 10)
- nan_corner[0, 0] = numpy.nan
- output = medfilt2d(
- nan_corner, kernel_size=3, conditional=False, mode='shrink')
- self.assertEqual(output[0, 0], 10)
- self.assertEqual(output[0, 1], 10)
- self.assertEqual(output[1, 0], 11)
- self.assertEqual(output[1, 1], 12)
-
- # Data with some NaNs
- some_nans = numpy.arange(100.).reshape(10, 10)
- some_nans[0, 1] = numpy.nan
- some_nans[1, 1] = numpy.nan
- some_nans[1, 0] = numpy.nan
- output = medfilt2d(
- some_nans, kernel_size=3, conditional=False, mode='shrink')
- self.assertEqual(output[0, 0], 0)
- self.assertEqual(output[0, 1], 2)
- self.assertEqual(output[1, 0], 20)
- self.assertEqual(output[1, 1], 20)
-
- def testFilter3_1d(self):
- """Test binding and result of the 1d filter"""
- self.assertTrue(numpy.array_equal(
- medfilt1d(RANDOM_INT_MAT[0], kernel_size=3, conditional=False,
- mode='shrink'),
- [5, 2, 5, 2, 6])
- )
-
-class TestMedianFilterConstant(ParametricTestCase):
- """Unit test for the median filter in constant mode
- """
-
- def testRandom10(self):
- """Test a (5, 3) window to a random array"""
- kernel = (3, 5)
-
- thRes = numpy.array([
- [0., 0.02839148, 0.05564293, 0.02839148, 0.],
- [0.05272484, 0.40555336, 0.4440632, 0.42161216, 0.28773158],
- [0.05272484, 0.44406320, 0.46372299, 0.42161216, 0.28773158],
- [0.20303021, 0.46372299, 0.56049024, 0.44406320, 0.33623165],
- [0., 0.07813661, 0.33623165, 0.07813661, 0.]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=False,
- mode='constant')
-
- self.assertTrue(numpy.array_equal(thRes, res))
-
- RANDOM_FLOAT_MAT = numpy.array([
- [0.05564293, 0.62717157, 0.75002406, 0.40555336, 0.70278975],
- [0.76532598, 0.02839148, 0.05272484, 0.65166994, 0.42161216],
- [0.23067427, 0.74219128, 0.56049024, 0.44406320, 0.28773158],
- [0.81025249, 0.20303021, 0.68382382, 0.46372299, 0.81281709],
- [0.94691602, 0.07813661, 0.81651256, 0.84220106, 0.33623165]])
-
- def testRandom10Conditionnal(self):
- """Test the median filter in reflect mode and with the conditionnal
- option"""
- kernel = (1, 3)
-
- print(RANDOM_FLOAT_MAT)
-
- thRes = numpy.array([
- [0.05564293, 0.62717157, 0.62717157, 0.70278975, 0.40555336],
- [0.02839148, 0.05272484, 0.05272484, 0.42161216, 0.42161216],
- [0.23067427, 0.56049024, 0.56049024, 0.44406320, 0.28773158],
- [0.20303021, 0.68382382, 0.46372299, 0.68382382, 0.46372299],
- [0.07813661, 0.81651256, 0.81651256, 0.81651256, 0.33623165]])
-
- res = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=True,
- mode='constant')
-
- self.assertTrue(numpy.array_equal(thRes, res))
-
- def testNaNs(self):
- """Test median filter on image with NaNs in constant mode"""
- # Data with a NaN in first corner
- nan_corner = numpy.arange(100.).reshape(10, 10)
- nan_corner[0, 0] = numpy.nan
- output = medfilt2d(nan_corner,
- kernel_size=3,
- conditional=False,
- mode='constant',
- cval=0)
- self.assertEqual(output[0, 0], 0)
- self.assertEqual(output[0, 1], 2)
- self.assertEqual(output[1, 0], 10)
- self.assertEqual(output[1, 1], 12)
-
- # Data with some NaNs
- some_nans = numpy.arange(100.).reshape(10, 10)
- some_nans[0, 1] = numpy.nan
- some_nans[1, 1] = numpy.nan
- some_nans[1, 0] = numpy.nan
- output = medfilt2d(some_nans,
- kernel_size=3,
- conditional=False,
- mode='constant',
- cval=0)
- self.assertEqual(output[0, 0], 0)
- self.assertEqual(output[0, 1], 0)
- self.assertEqual(output[1, 0], 0)
- self.assertEqual(output[1, 1], 20)
-
- def testFilter3_1d(self):
- """Test binding and result of the 1d filter"""
- self.assertTrue(numpy.array_equal(
- medfilt1d(RANDOM_INT_MAT[0], kernel_size=5, conditional=False,
- mode='constant'),
- [0, 2, 2, 2, 1])
- )
-
-class TestGeneralExecution(ParametricTestCase):
- """Some general test on median filter application"""
-
- def testTypes(self):
- """Test that all needed types have their implementation of the median
- filter
- """
- for mode in silx_mf_modes:
- for testType in [numpy.float32, numpy.float64, numpy.int16,
- numpy.uint16, numpy.int32, numpy.int64,
- numpy.uint64]:
- with self.subTest(mode=mode, type=testType):
- data = (numpy.random.rand(10, 10) * 65000).astype(testType)
- out = medfilt2d(image=data,
- kernel_size=(3, 3),
- conditional=False,
- mode=mode)
- self.assertTrue(out.dtype.type is testType)
-
- def testInputDataIsNotModify(self):
- """Make sure input data is not modify by the median filter"""
- dataIn = numpy.arange(100, dtype=numpy.int32)
- dataIn = dataIn.reshape((10, 10))
- dataInCopy = dataIn.copy()
-
- for mode in silx_mf_modes:
- with self.subTest(mode=mode):
- medfilt2d(image=dataIn,
- kernel_size=(3, 3),
- conditional=False,
- mode=mode)
- self.assertTrue(numpy.array_equal(dataIn, dataInCopy))
-
- def testAllNaNs(self):
- """Test median filter on image all NaNs"""
- all_nans = numpy.empty((10, 10), dtype=numpy.float32)
- all_nans[:] = numpy.nan
-
- for mode in silx_mf_modes:
- for conditional in (True, False):
- with self.subTest(mode=mode, conditional=conditional):
- output = medfilt2d(
- all_nans,
- kernel_size=3,
- conditional=conditional,
- mode=mode,
- cval=numpy.nan)
- self.assertTrue(numpy.all(numpy.isnan(output)))
-
- def testConditionalWithNaNs(self):
- """Test that NaNs are propagated through conditional median filter"""
- for mode in silx_mf_modes:
- with self.subTest(mode=mode):
- image = numpy.ones((10, 10), dtype=numpy.float32)
- nan_mask = numpy.zeros_like(image, dtype=bool)
- nan_mask[0, 0] = True
- nan_mask[4, :] = True
- nan_mask[6, 4] = True
- image[nan_mask] = numpy.nan
- output = medfilt2d(
- image,
- kernel_size=3,
- conditional=True,
- mode=mode)
- out_isnan = numpy.isnan(output)
- self.assertTrue(numpy.all(out_isnan[nan_mask]))
- self.assertFalse(
- numpy.any(out_isnan[numpy.logical_not(nan_mask)]))
-
-
-def _getScipyAndSilxCommonModes():
- """return the mode which are comparable between silx and scipy"""
- modes = silx_mf_modes.copy()
- del modes['shrink']
- return modes
-
-
-@unittest.skipUnless(scipy is not None, "scipy not available")
-class TestVsScipy(ParametricTestCase):
- """Compare scipy.ndimage.median_filter vs silx.math.medianfilter
- on comparable
- """
- def testWithArange(self):
- """Test vs scipy with different kernels on arange matrix"""
- data = numpy.arange(10000, dtype=numpy.int32)
- data = data.reshape(100, 100)
-
- kernels = [(3, 7), (7, 5), (1, 1), (3, 3)]
- modesToTest = _getScipyAndSilxCommonModes()
- for kernel in kernels:
- for mode in modesToTest:
- with self.subTest(kernel=kernel, mode=mode):
- resScipy = scipy.ndimage.median_filter(input=data,
- size=kernel,
- mode=mode)
- resSilx = medfilt2d(image=data,
- kernel_size=kernel,
- conditional=False,
- mode=mode)
-
- self.assertTrue(numpy.array_equal(resScipy, resSilx))
-
- def testRandomMatrice(self):
- """Test vs scipy with different kernels on RANDOM_FLOAT_MAT"""
- kernels = [(3, 7), (7, 5), (1, 1), (3, 3)]
- modesToTest = _getScipyAndSilxCommonModes()
- for kernel in kernels:
- for mode in modesToTest:
- with self.subTest(kernel=kernel, mode=mode):
- resScipy = scipy.ndimage.median_filter(input=RANDOM_FLOAT_MAT,
- size=kernel,
- mode=mode)
-
- resSilx = medfilt2d(image=RANDOM_FLOAT_MAT,
- kernel_size=kernel,
- conditional=False,
- mode=mode)
-
- self.assertTrue(numpy.array_equal(resScipy, resSilx))
-
- def testAscentOrLena(self):
- """Test vs scipy with """
- if hasattr(scipy.misc, 'ascent'):
- img = scipy.misc.ascent()
- else:
- img = scipy.misc.lena()
-
- kernels = [(3, 1), (3, 5), (5, 9), (9, 3)]
- modesToTest = _getScipyAndSilxCommonModes()
-
- for kernel in kernels:
- for mode in modesToTest:
- with self.subTest(kernel=kernel, mode=mode):
- resScipy = scipy.ndimage.median_filter(input=img,
- size=kernel,
- mode=mode)
-
- resSilx = medfilt2d(image=img,
- kernel_size=kernel,
- conditional=False,
- mode=mode)
-
- self.assertTrue(numpy.array_equal(resScipy, resSilx))
-
-
-def suite():
- test_suite = unittest.TestSuite()
- for test in [TestGeneralExecution,
- TestVsScipy,
- TestMedianFilterNearest,
- TestMedianFilterReflect,
- TestMedianFilterMirror,
- TestMedianFilterShrink,
- TestMedianFilterConstant]:
- test_suite.addTest(
- unittest.defaultTestLoader.loadTestsFromTestCase(test))
- return test_suite
-
-
-if __name__ == '__main__':
- unittest.main(defaultTest='suite')