From 78a7b7307a3ad0131c04c9e59112e90a8ab7afad Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Tue, 30 Sep 2014 17:42:52 +0200 Subject: [PATCH] Rename and deprecate filter module to prevent shadowing of built-in keyword --- TODO.txt | 5 +- bento.info | 18 +++--- .../applications/plot_coins_segmentation.py | 2 +- .../applications/plot_rank_filters.py | 32 +++++----- doc/examples/plot_edge_filter.py | 2 +- doc/examples/plot_entropy.py | 2 +- doc/examples/plot_gabor.py | 2 +- doc/examples/plot_join_segmentations.py | 2 +- doc/examples/plot_label.py | 2 +- doc/examples/plot_local_equalize.py | 2 +- doc/examples/plot_local_otsu.py | 2 +- doc/examples/plot_marked_watershed.py | 2 +- doc/examples/plot_otsu.py | 2 +- doc/examples/plot_rank_mean.py | 2 +- doc/examples/plot_threshold_adaptive.py | 2 +- doc/examples/plot_tinting_grayscale_images.py | 2 +- doc/examples/plot_windowed_histogram.py | 4 +- doc/logo/scikit_image_logo.py | 2 +- doc/source/api_changes.txt | 1 + .../user_guide/tutorial_segmentation.txt | 2 +- doc/source/user_guide/viewer.txt | 2 +- skimage/__init__.py | 2 +- skimage/feature/_canny.py | 2 +- skimage/feature/peak.py | 2 +- skimage/filter/__init__.py | 63 +++---------------- skimage/filter/tests/test_filter_import.py | 10 +++ skimage/filters/__init__.py | 56 +++++++++++++++++ skimage/{filter => filters}/_ctmf.pyx | 0 skimage/{filter => filters}/_gabor.py | 0 skimage/{filter => filters}/_gaussian.py | 0 skimage/{filter => filters}/_rank_order.py | 0 skimage/{filter => filters}/edges.py | 0 skimage/{filter => filters}/lpi_filter.py | 0 skimage/{filter => filters}/rank/.gitignore | 0 skimage/{filter => filters}/rank/README.rst | 0 skimage/{filter => filters}/rank/__init__.py | 0 .../{filter => filters}/rank/_percentile.py | 0 skimage/{filter => filters}/rank/bilateral.py | 10 +-- .../{filter => filters}/rank/bilateral_cy.pyx | 0 skimage/{filter => filters}/rank/core_cy.pxd | 0 skimage/{filter => filters}/rank/core_cy.pyx | 0 skimage/{filter => filters}/rank/generic.py | 42 ++++++------- .../{filter => filters}/rank/generic_cy.pyx | 0 .../rank/percentile_cy.pyx | 0 .../rank/tests/test_rank.py | 2 +- skimage/{filter => filters}/setup.py | 2 +- .../{filter => filters}/tests/test_edges.py | 4 +- .../{filter => filters}/tests/test_gabor.py | 2 +- .../tests/test_gaussian.py | 2 +- .../tests/test_lpi_filter.py | 2 +- .../tests/test_thresholding.py | 8 +-- skimage/{filter => filters}/thresholding.py | 0 skimage/morphology/greyreconstruct.py | 2 +- skimage/morphology/watershed.py | 2 +- .../random_walker_segmentation.py | 2 +- skimage/setup.py | 2 +- skimage/viewer/tests/test_plugins.py | 2 +- skimage/viewer/tests/test_viewer.py | 2 +- viewer_examples/plugins/canny_simple.py | 2 +- viewer_examples/plugins/collection_plugin.py | 2 +- viewer_examples/plugins/median_filter.py | 2 +- viewer_examples/plugins/watershed_demo.py | 2 +- 62 files changed, 171 insertions(+), 150 deletions(-) create mode 100644 skimage/filter/tests/test_filter_import.py create mode 100644 skimage/filters/__init__.py rename skimage/{filter => filters}/_ctmf.pyx (100%) rename skimage/{filter => filters}/_gabor.py (100%) rename skimage/{filter => filters}/_gaussian.py (100%) rename skimage/{filter => filters}/_rank_order.py (100%) rename skimage/{filter => filters}/edges.py (100%) rename skimage/{filter => filters}/lpi_filter.py (100%) rename skimage/{filter => filters}/rank/.gitignore (100%) rename skimage/{filter => filters}/rank/README.rst (100%) rename skimage/{filter => filters}/rank/__init__.py (100%) rename skimage/{filter => filters}/rank/_percentile.py (100%) rename skimage/{filter => filters}/rank/bilateral.py (96%) rename skimage/{filter => filters}/rank/bilateral_cy.pyx (100%) rename skimage/{filter => filters}/rank/core_cy.pxd (100%) rename skimage/{filter => filters}/rank/core_cy.pyx (100%) rename skimage/{filter => filters}/rank/generic.py (96%) rename skimage/{filter => filters}/rank/generic_cy.pyx (100%) rename skimage/{filter => filters}/rank/percentile_cy.pyx (100%) rename skimage/{filter => filters}/rank/tests/test_rank.py (99%) rename skimage/{filter => filters}/setup.py (96%) rename skimage/{filter => filters}/tests/test_edges.py (99%) rename skimage/{filter => filters}/tests/test_gabor.py (97%) rename skimage/{filter => filters}/tests/test_gaussian.py (96%) rename skimage/{filter => filters}/tests/test_lpi_filter.py (98%) rename skimage/{filter => filters}/tests/test_thresholding.py (97%) rename skimage/{filter => filters}/thresholding.py (100%) diff --git a/TODO.txt b/TODO.txt index 3e6b3a7e..a5a2bb61 100644 --- a/TODO.txt +++ b/TODO.txt @@ -3,8 +3,9 @@ Remember to list any API changes below in `doc/source/api_changes.txt`. Version 0.13 ------------ * Remove deprecated `None` defaults for `skimage.exposure.rescale_intensity` -* Remove deprecated `skimage.filter.canny` import in filter/__init__.py file (canny is now in `skimage.feature.canny`). +* Remove deprecated `skimage.filters.canny` import in filters/__init__.py file (canny is now in `skimage.feature.canny`). * Don't forget to complete api_changes.txt. (`GitHub discuss `__ ) +* Remove deprecated ``skimage.filter`` module. Version 0.12 ------------ @@ -20,4 +21,4 @@ Version 0.12 `skimage.transform.ProjectiveTransform._matrix`, `skimage.transform.PolynomialTransform._params`, `skimage.transform.PiecewiseAffineTransform.affines_*` attributes -* Remove deprecated functions `skimage.filter.denoise_*` +* Remove deprecated functions `skimage.filters.denoise_*` diff --git a/bento.info b/bento.info index 7518abbc..1ba9bbc3 100644 --- a/bento.info +++ b/bento.info @@ -33,7 +33,7 @@ UseBackends: Waf Library: Packages: skimage, skimage.color, skimage.data, skimage.draw, skimage.exposure, - skimage.feature, skimage.filter, skimage.graph, skimage.io, + skimage.feature, skimage.filters, skimage.graph, skimage.io, skimage.io._plugins, skimage.measure, skimage.morphology, skimage.scripts, skimage.restoration, skimage.segmentation, skimage.transform, skimage.util @@ -61,9 +61,9 @@ Library: Extension: skimage.transform._hough_transform Sources: skimage/transform/_hough_transform.pyx - Extension: skimage.filter._ctmf + Extension: skimage.filters._ctmf Sources: - skimage/filter/_ctmf.pyx + skimage/filters/_ctmf.pyx Extension: skimage.measure._ccomp Sources: skimage/measure/_ccomp.pyx @@ -127,18 +127,18 @@ Library: Extension: skimage._shared.geometry Sources: skimage/_shared/geometry.pyx - Extension: skimage.filter.rank.generic_cy + Extension: skimage.filters.rank.generic_cy Sources: - skimage/filter/rank/generic_cy.pyx - Extension: skimage.filter.rank.percentile_cy + skimage/filters/rank/generic_cy.pyx + Extension: skimage.filters.rank.percentile_cy Sources: skimage/filter/rank/percentile_cy.pyx - Extension: skimage.filter.rank.core_cy + Extension: skimage.filters.rank.core_cy Sources: skimage/filter/rank/core_cy.pyx - Extension: skimage.filter.rank.bilateral_cy + Extension: skimage.filters.rank.bilateral_cy Sources: - skimage/filter/rank/bilateral_cy.pyx + skimage/filters/rank/bilateral_cy.pyx Extension: skimage.restoration._unwrap_1d Sources: skimage/restoration/_unwrap_1d.pyx diff --git a/doc/examples/applications/plot_coins_segmentation.py b/doc/examples/applications/plot_coins_segmentation.py index 50eec0bb..98f5212f 100644 --- a/doc/examples/applications/plot_coins_segmentation.py +++ b/doc/examples/applications/plot_coins_segmentation.py @@ -109,7 +109,7 @@ find an elevation map using the Sobel gradient of the image. """ -from skimage.filter import sobel +from skimage.filters import sobel elevation_map = sobel(coins) diff --git a/doc/examples/applications/plot_rank_filters.py b/doc/examples/applications/plot_rank_filters.py index 6530c6d6..fc918608 100644 --- a/doc/examples/applications/plot_rank_filters.py +++ b/doc/examples/applications/plot_rank_filters.py @@ -62,7 +62,7 @@ randomly set to 0. The **median** filter is applied to remove the noise. """ -from skimage.filter.rank import median +from skimage.filters.rank import median from skimage.morphology import disk noise = np.random.random(noisy_image.shape) @@ -107,7 +107,7 @@ image. """ -from skimage.filter.rank import mean +from skimage.filters.rank import mean fig, (ax1, ax2) = plt.subplots(1, 2, figsize=[10, 7]) @@ -133,11 +133,11 @@ the central one. .. note:: A different implementation is available for color images in - `skimage.filter.denoise_bilateral`. + `skimage.filters.denoise_bilateral`. """ -from skimage.filter.rank import mean_bilateral +from skimage.filters.rank import mean_bilateral noisy_image = img_as_ubyte(data.camera()) @@ -183,7 +183,7 @@ equalization emphasizes every local gray-level variations. """ from skimage import exposure -from skimage.filter import rank +from skimage.filters import rank noisy_image = img_as_ubyte(data.camera()) @@ -230,7 +230,7 @@ picture. """ -from skimage.filter.rank import autolevel +from skimage.filters.rank import autolevel noisy_image = img_as_ubyte(data.camera()) @@ -260,7 +260,7 @@ result. """ -from skimage.filter.rank import autolevel_percentile +from skimage.filters.rank import autolevel_percentile image = data.camera() @@ -298,7 +298,7 @@ otherwise by the minimum local. """ -from skimage.filter.rank import enhance_contrast +from skimage.filters.rank import enhance_contrast noisy_image = img_as_ubyte(data.camera()) @@ -330,7 +330,7 @@ percentile *p0* and *p1* instead of the local minimum and maximum. """ -from skimage.filter.rank import enhance_contrast_percentile +from skimage.filters.rank import enhance_contrast_percentile noisy_image = img_as_ubyte(data.camera()) @@ -366,19 +366,19 @@ threshold is determined by maximizing the variance between two classes of pixels of the local neighborhood defined by a structuring element. The example compares the local threshold with the global threshold -`skimage.filter.threshold_otsu`. +`skimage.filters.threshold_otsu`. .. note:: Local is much slower than global thresholding. A function for global Otsu - thresholding can be found in : `skimage.filter.threshold_otsu`. + thresholding can be found in : `skimage.filters.threshold_otsu`. .. [4] http://en.wikipedia.org/wiki/Otsu's_method """ -from skimage.filter.rank import otsu -from skimage.filter import threshold_otsu +from skimage.filters.rank import otsu +from skimage.filters import threshold_otsu p8 = data.page() @@ -459,7 +459,7 @@ closing and morphological gradient. """ -from skimage.filter.rank import maximum, minimum, gradient +from skimage.filters.rank import maximum, minimum, gradient noisy_image = img_as_ubyte(data.camera()) @@ -511,7 +511,7 @@ images. """ from skimage import data -from skimage.filter.rank import entropy +from skimage.filters.rank import entropy from skimage.morphology import disk import numpy as np import matplotlib.pyplot as plt @@ -549,7 +549,7 @@ from time import time from scipy.ndimage.filters import percentile_filter from skimage.morphology import dilation -from skimage.filter.rank import median, maximum +from skimage.filters.rank import median, maximum def exec_and_timeit(func): diff --git a/doc/examples/plot_edge_filter.py b/doc/examples/plot_edge_filter.py index b43aae38..7eba57df 100644 --- a/doc/examples/plot_edge_filter.py +++ b/doc/examples/plot_edge_filter.py @@ -11,7 +11,7 @@ gradient of the image intensity function. import matplotlib.pyplot as plt from skimage.data import camera -from skimage.filter import roberts, sobel +from skimage.filters import roberts, sobel image = camera() diff --git a/doc/examples/plot_entropy.py b/doc/examples/plot_entropy.py index b92a5bf3..f33f26ff 100644 --- a/doc/examples/plot_entropy.py +++ b/doc/examples/plot_entropy.py @@ -10,7 +10,7 @@ coded in an image. import matplotlib.pyplot as plt from skimage import data -from skimage.filter.rank import entropy +from skimage.filters.rank import entropy from skimage.morphology import disk from skimage.util import img_as_ubyte diff --git a/doc/examples/plot_gabor.py b/doc/examples/plot_gabor.py index 87d99589..e5cc7760 100644 --- a/doc/examples/plot_gabor.py +++ b/doc/examples/plot_gabor.py @@ -21,7 +21,7 @@ from scipy import ndimage as nd from skimage import data from skimage.util import img_as_float -from skimage.filter import gabor_kernel +from skimage.filters import gabor_kernel def compute_feats(image, kernels): diff --git a/doc/examples/plot_join_segmentations.py b/doc/examples/plot_join_segmentations.py index 849f087c..c10105c5 100644 --- a/doc/examples/plot_join_segmentations.py +++ b/doc/examples/plot_join_segmentations.py @@ -14,7 +14,7 @@ import numpy as np from scipy import ndimage as nd import matplotlib.pyplot as plt -from skimage.filter import sobel +from skimage.filters import sobel from skimage.segmentation import slic, join_segmentations from skimage.morphology import watershed from skimage.color import label2rgb diff --git a/doc/examples/plot_label.py b/doc/examples/plot_label.py index 9912eddf..dd3e777d 100644 --- a/doc/examples/plot_label.py +++ b/doc/examples/plot_label.py @@ -17,7 +17,7 @@ import matplotlib.pyplot as plt import matplotlib.patches as mpatches from skimage import data -from skimage.filter import threshold_otsu +from skimage.filters import threshold_otsu from skimage.segmentation import clear_border from skimage.morphology import label, closing, square from skimage.measure import regionprops diff --git a/doc/examples/plot_local_equalize.py b/doc/examples/plot_local_equalize.py index b3c11d55..507921b7 100644 --- a/doc/examples/plot_local_equalize.py +++ b/doc/examples/plot_local_equalize.py @@ -28,7 +28,7 @@ from skimage.util.dtype import dtype_range from skimage.util import img_as_ubyte from skimage import exposure from skimage.morphology import disk -from skimage.filter import rank +from skimage.filters import rank matplotlib.rcParams['font.size'] = 9 diff --git a/doc/examples/plot_local_otsu.py b/doc/examples/plot_local_otsu.py index d40af6b6..655e9328 100644 --- a/doc/examples/plot_local_otsu.py +++ b/doc/examples/plot_local_otsu.py @@ -20,7 +20,7 @@ import matplotlib.pyplot as plt from skimage import data from skimage.morphology import disk -from skimage.filter import threshold_otsu, rank +from skimage.filters import threshold_otsu, rank from skimage.util import img_as_ubyte diff --git a/doc/examples/plot_marked_watershed.py b/doc/examples/plot_marked_watershed.py index 0e1f1c58..766a1d25 100644 --- a/doc/examples/plot_marked_watershed.py +++ b/doc/examples/plot_marked_watershed.py @@ -19,7 +19,7 @@ import matplotlib.pyplot as plt from skimage.morphology import watershed, disk from skimage import data -from skimage.filter import rank +from skimage.filters import rank from skimage.util import img_as_ubyte diff --git a/doc/examples/plot_otsu.py b/doc/examples/plot_otsu.py index 059093ab..14a7e7cb 100644 --- a/doc/examples/plot_otsu.py +++ b/doc/examples/plot_otsu.py @@ -18,7 +18,7 @@ import matplotlib import matplotlib.pyplot as plt from skimage.data import camera -from skimage.filter import threshold_otsu +from skimage.filters import threshold_otsu matplotlib.rcParams['font.size'] = 9 diff --git a/doc/examples/plot_rank_mean.py b/doc/examples/plot_rank_mean.py index 6f16c440..e8f2394c 100644 --- a/doc/examples/plot_rank_mean.py +++ b/doc/examples/plot_rank_mean.py @@ -23,7 +23,7 @@ import matplotlib.pyplot as plt from skimage import data from skimage.morphology import disk -from skimage.filter import rank +from skimage.filters import rank image = (data.coins()).astype(np.uint16) * 16 diff --git a/doc/examples/plot_threshold_adaptive.py b/doc/examples/plot_threshold_adaptive.py index e1e3cbee..9bf7b0c6 100644 --- a/doc/examples/plot_threshold_adaptive.py +++ b/doc/examples/plot_threshold_adaptive.py @@ -18,7 +18,7 @@ local neighborhood minus an offset value. import matplotlib.pyplot as plt from skimage import data -from skimage.filter import threshold_otsu, threshold_adaptive +from skimage.filters import threshold_otsu, threshold_adaptive image = data.page() diff --git a/doc/examples/plot_tinting_grayscale_images.py b/doc/examples/plot_tinting_grayscale_images.py index 8b07b41d..f3ff5466 100644 --- a/doc/examples/plot_tinting_grayscale_images.py +++ b/doc/examples/plot_tinting_grayscale_images.py @@ -116,7 +116,7 @@ thresholding. In practice, you might want to define a region for tinting based on segmentation results or blob detection methods. """ -from skimage.filter import rank +from skimage.filters import rank # Square regions defined as slices over the first two dimensions. top_left = (slice(100),) * 2 diff --git a/doc/examples/plot_windowed_histogram.py b/doc/examples/plot_windowed_histogram.py index 4d51c3e8..ebd6ea2f 100644 --- a/doc/examples/plot_windowed_histogram.py +++ b/doc/examples/plot_windowed_histogram.py @@ -13,7 +13,7 @@ extracted and a histogram of its greyscale values is computed. Next, for each pixel in the test image, a histogram of the greyscale values in a region of the image surrounding the pixel is computed. -`skimage.filter.rank.windowed_histogram` is used for this task, as it employs +`skimage.filters.rank.windowed_histogram` is used for this task, as it employs an efficient sliding window based algorithm that is able to compute these histograms quickly [2]_. The local histogram for the region surrounding each pixel in the image is compared to that of the single coin, with a similarity @@ -42,7 +42,7 @@ import matplotlib.pyplot as plt from skimage import data, transform from skimage.util import img_as_ubyte from skimage.morphology import disk -from skimage.filter import rank +from skimage.filters import rank matplotlib.rcParams['font.size'] = 9 diff --git a/doc/logo/scikit_image_logo.py b/doc/logo/scikit_image_logo.py index 85ba5199..48e38aad 100644 --- a/doc/logo/scikit_image_logo.py +++ b/doc/logo/scikit_image_logo.py @@ -20,7 +20,7 @@ import skimage.io as sio from skimage import img_as_float from skimage.color import gray2rgb, rgb2gray from skimage.exposure import rescale_intensity -from skimage.filter import sobel +from skimage.filters import sobel import scipy_logo diff --git a/doc/source/api_changes.txt b/doc/source/api_changes.txt index 8ebcc6ed..89763732 100644 --- a/doc/source/api_changes.txt +++ b/doc/source/api_changes.txt @@ -1,5 +1,6 @@ Version 0.11 ------------ +- The ``skimage.filter`` has been renamed to ``skimage.filters``. - Some edge detectors returned values greater than 1--their results are now appropriately scaled with a factor of ``sqrt(2)``. diff --git a/doc/source/user_guide/tutorial_segmentation.txt b/doc/source/user_guide/tutorial_segmentation.txt index d183102f..0c373062 100644 --- a/doc/source/user_guide/tutorial_segmentation.txt +++ b/doc/source/user_guide/tutorial_segmentation.txt @@ -117,7 +117,7 @@ The choice of the elevation map is critical for good segmentation. Here, the amplitude of the gradient provides a good elevation map. We use the Sobel operator for computing the amplitude of the gradient:: - >>> from skimage.filter import sobel + >>> from skimage.filters import sobel >>> elevation_map = sobel(coins) From the 3-D surface plot shown below, we see that high barriers effectively diff --git a/doc/source/user_guide/viewer.txt b/doc/source/user_guide/viewer.txt index 3145effd..eac6b3c3 100644 --- a/doc/source/user_guide/viewer.txt +++ b/doc/source/user_guide/viewer.txt @@ -51,7 +51,7 @@ call the total-variation denoising function, ``denoise_tv_bregman``: .. code-block:: python - from skimage.filter import denoise_tv_bregman + from skimage.filters import denoise_tv_bregman from skimage.viewer.plugins.base import Plugin denoise_plugin = Plugin(image_filter=denoise_tv_bregman) diff --git a/skimage/__init__.py b/skimage/__init__.py index da7c983c..fb38f87a 100644 --- a/skimage/__init__.py +++ b/skimage/__init__.py @@ -19,7 +19,7 @@ exposure Image intensity adjustment, e.g., histogram equalization, etc. feature Feature detection and extraction, e.g., texture analysis corners, etc. -filter +filters Sharpening, edge finding, rank filters, thresholding, etc. graph Graph-theoretic operations, e.g., shortest paths. diff --git a/skimage/feature/_canny.py b/skimage/feature/_canny.py index a1ba2fb8..e98b88e2 100644 --- a/skimage/feature/_canny.py +++ b/skimage/feature/_canny.py @@ -109,7 +109,7 @@ def canny(image, sigma=1., low_threshold=None, high_threshold=None, mask=None): Examples -------- - >>> from skimage import filter + >>> from skimage import filters >>> # Generate noisy image of a square >>> im = np.zeros((256, 256)) >>> im[64:-64, 64:-64] = 1 diff --git a/skimage/feature/peak.py b/skimage/feature/peak.py index 378d22b4..e70f6df1 100644 --- a/skimage/feature/peak.py +++ b/skimage/feature/peak.py @@ -1,6 +1,6 @@ import numpy as np import scipy.ndimage as ndi -from ..filter import rank_order +from ..filters import rank_order def peak_local_max(image, min_distance=10, threshold_abs=0, threshold_rel=0.1, diff --git a/skimage/filter/__init__.py b/skimage/filter/__init__.py index e5b58447..d7f6906f 100644 --- a/skimage/filter/__init__.py +++ b/skimage/filter/__init__.py @@ -1,56 +1,9 @@ -from .lpi_filter import inverse, wiener, LPIFilter2D -from ._gaussian import gaussian_filter -from .edges import (sobel, hsobel, vsobel, scharr, hscharr, vscharr, prewitt, - hprewitt, vprewitt, roberts, roberts_positive_diagonal, - roberts_negative_diagonal) -from ._rank_order import rank_order -from ._gabor import gabor_kernel, gabor_filter -from .thresholding import (threshold_adaptive, threshold_otsu, threshold_yen, - threshold_isodata) -from . import rank +from skimage._shared.utils import skimage_deprecation +from warnings import warn +warn(skimage_deprecation('The `skimage.filter` module has been renamed to ' + '`skimage.filters`. This placeholder module ' + 'will be removed in v0.13.')) +del warn +del skimage_deprecation -from skimage._shared.utils import deprecated -from skimage import restoration -denoise_bilateral = deprecated('skimage.restoration.denoise_bilateral')\ - (restoration.denoise_bilateral) -denoise_tv_bregman = deprecated('skimage.restoration.denoise_tv_bregman')\ - (restoration.denoise_tv_bregman) -denoise_tv_chambolle = deprecated('skimage.restoration.denoise_tv_chambolle')\ - (restoration.denoise_tv_chambolle) - -# Backward compatibility v<0.11 -@deprecated('skimage.feature.canny') -def canny(*args, **kwargs): - # Hack to avoid circular import - from skimage.feature._canny import canny as canny_ - return canny_(*args, **kwargs) - - -__all__ = ['inverse', - 'wiener', - 'LPIFilter2D', - 'gaussian_filter', - 'canny', - 'sobel', - 'hsobel', - 'vsobel', - 'scharr', - 'hscharr', - 'vscharr', - 'prewitt', - 'hprewitt', - 'vprewitt', - 'roberts', - 'roberts_positive_diagonal', - 'roberts_negative_diagonal', - 'denoise_tv_chambolle', - 'denoise_bilateral', - 'denoise_tv_bregman', - 'rank_order', - 'gabor_kernel', - 'gabor_filter', - 'threshold_adaptive', - 'threshold_otsu', - 'threshold_yen', - 'threshold_isodata', - 'rank'] +from ..filters import * diff --git a/skimage/filter/tests/test_filter_import.py b/skimage/filter/tests/test_filter_import.py new file mode 100644 index 00000000..732b5344 --- /dev/null +++ b/skimage/filter/tests/test_filter_import.py @@ -0,0 +1,10 @@ +from skimage._shared.utils import all_warnings, skimage_deprecation +from numpy.testing import assert_warns + +def import_filter(): + from skimage import filter as F + assert('sobel' in dir(F)) + +def test_filter_import(): + with all_warnings(): + assert_warns(skimage_deprecation, import_filter) diff --git a/skimage/filters/__init__.py b/skimage/filters/__init__.py new file mode 100644 index 00000000..0228957e --- /dev/null +++ b/skimage/filters/__init__.py @@ -0,0 +1,56 @@ +from .lpi_filter import inverse, wiener, LPIFilter2D +from ._gaussian import gaussian_filter +from .edges import (sobel, hsobel, vsobel, scharr, hscharr, vscharr, prewitt, + hprewitt, vprewitt, roberts, roberts_positive_diagonal, + roberts_negative_diagonal) +from ._rank_order import rank_order +from ._gabor import gabor_kernel, gabor_filter +from .thresholding import (threshold_adaptive, threshold_otsu, threshold_yen, + threshold_isodata) +from . import rank + +from skimage._shared.utils import deprecated +from skimage import restoration +denoise_bilateral = deprecated('skimage.restoration.denoise_bilateral')\ + (restoration.denoise_bilateral) +denoise_tv_bregman = deprecated('skimage.restoration.denoise_tv_bregman')\ + (restoration.denoise_tv_bregman) +denoise_tv_chambolle = deprecated('skimage.restoration.denoise_tv_chambolle')\ + (restoration.denoise_tv_chambolle) + +# Backward compatibility v<0.11 +@deprecated +def canny(*args, **kwargs): + # Hack to avoid circular import + from skimage.feature._canny import canny as canny_ + return canny_(*args, **kwargs) + + +__all__ = ['inverse', + 'wiener', + 'LPIFilter2D', + 'gaussian_filter', + 'canny', + 'sobel', + 'hsobel', + 'vsobel', + 'scharr', + 'hscharr', + 'vscharr', + 'prewitt', + 'hprewitt', + 'vprewitt', + 'roberts', + 'roberts_positive_diagonal', + 'roberts_negative_diagonal', + 'denoise_tv_chambolle', + 'denoise_bilateral', + 'denoise_tv_bregman', + 'rank_order', + 'gabor_kernel', + 'gabor_filter', + 'threshold_adaptive', + 'threshold_otsu', + 'threshold_yen', + 'threshold_isodata', + 'rank'] diff --git a/skimage/filter/_ctmf.pyx b/skimage/filters/_ctmf.pyx similarity index 100% rename from skimage/filter/_ctmf.pyx rename to skimage/filters/_ctmf.pyx diff --git a/skimage/filter/_gabor.py b/skimage/filters/_gabor.py similarity index 100% rename from skimage/filter/_gabor.py rename to skimage/filters/_gabor.py diff --git a/skimage/filter/_gaussian.py b/skimage/filters/_gaussian.py similarity index 100% rename from skimage/filter/_gaussian.py rename to skimage/filters/_gaussian.py diff --git a/skimage/filter/_rank_order.py b/skimage/filters/_rank_order.py similarity index 100% rename from skimage/filter/_rank_order.py rename to skimage/filters/_rank_order.py diff --git a/skimage/filter/edges.py b/skimage/filters/edges.py similarity index 100% rename from skimage/filter/edges.py rename to skimage/filters/edges.py diff --git a/skimage/filter/lpi_filter.py b/skimage/filters/lpi_filter.py similarity index 100% rename from skimage/filter/lpi_filter.py rename to skimage/filters/lpi_filter.py diff --git a/skimage/filter/rank/.gitignore b/skimage/filters/rank/.gitignore similarity index 100% rename from skimage/filter/rank/.gitignore rename to skimage/filters/rank/.gitignore diff --git a/skimage/filter/rank/README.rst b/skimage/filters/rank/README.rst similarity index 100% rename from skimage/filter/rank/README.rst rename to skimage/filters/rank/README.rst diff --git a/skimage/filter/rank/__init__.py b/skimage/filters/rank/__init__.py similarity index 100% rename from skimage/filter/rank/__init__.py rename to skimage/filters/rank/__init__.py diff --git a/skimage/filter/rank/_percentile.py b/skimage/filters/rank/_percentile.py similarity index 100% rename from skimage/filter/rank/_percentile.py rename to skimage/filters/rank/_percentile.py diff --git a/skimage/filter/rank/bilateral.py b/skimage/filters/rank/bilateral.py similarity index 96% rename from skimage/filter/rank/bilateral.py rename to skimage/filters/rank/bilateral.py index 05a5664a..25fe45b6 100644 --- a/skimage/filter/rank/bilateral.py +++ b/skimage/filters/rank/bilateral.py @@ -89,13 +89,13 @@ def mean_bilateral(image, selem, out=None, mask=None, shift_x=False, See also -------- - skimage.filter.denoise_bilateral for a Gaussian bilateral filter. + skimage.filters.denoise_bilateral for a Gaussian bilateral filter. Examples -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import mean_bilateral + >>> from skimage.filters.rank import mean_bilateral >>> img = data.camera().astype(np.uint16) >>> bilat_img = mean_bilateral(img, disk(20), s0=10,s1=10) @@ -142,7 +142,7 @@ def pop_bilateral(image, selem, out=None, mask=None, shift_x=False, Examples -------- >>> from skimage.morphology import square - >>> import skimage.filter.rank as rank + >>> import skimage.filters.rank as rank >>> img = 255 * np.array([[0, 0, 0, 0, 0], ... [0, 1, 1, 1, 0], ... [0, 1, 1, 1, 0], @@ -206,13 +206,13 @@ def sum_bilateral(image, selem, out=None, mask=None, shift_x=False, See also -------- - skimage.filter.denoise_bilateral for a Gaussian bilateral filter. + skimage.filters.denoise_bilateral for a Gaussian bilateral filter. Examples -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import sum_bilateral + >>> from skimage.filters.rank import sum_bilateral >>> img = data.camera().astype(np.uint16) >>> bilat_img = sum_bilateral(img, disk(10), s0=10, s1=10) diff --git a/skimage/filter/rank/bilateral_cy.pyx b/skimage/filters/rank/bilateral_cy.pyx similarity index 100% rename from skimage/filter/rank/bilateral_cy.pyx rename to skimage/filters/rank/bilateral_cy.pyx diff --git a/skimage/filter/rank/core_cy.pxd b/skimage/filters/rank/core_cy.pxd similarity index 100% rename from skimage/filter/rank/core_cy.pxd rename to skimage/filters/rank/core_cy.pxd diff --git a/skimage/filter/rank/core_cy.pyx b/skimage/filters/rank/core_cy.pyx similarity index 100% rename from skimage/filter/rank/core_cy.pyx rename to skimage/filters/rank/core_cy.pyx diff --git a/skimage/filter/rank/generic.py b/skimage/filters/rank/generic.py similarity index 96% rename from skimage/filter/rank/generic.py rename to skimage/filters/rank/generic.py index d0a9baec..e1f6e8e5 100644 --- a/skimage/filter/rank/generic.py +++ b/skimage/filters/rank/generic.py @@ -126,7 +126,7 @@ def autolevel(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import autolevel + >>> from skimage.filters.rank import autolevel >>> img = data.camera() >>> auto = autolevel(img, disk(5)) @@ -168,7 +168,7 @@ def bottomhat(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import bottomhat + >>> from skimage.filters.rank import bottomhat >>> img = data.camera() >>> out = bottomhat(img, disk(5)) @@ -207,7 +207,7 @@ def equalize(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import equalize + >>> from skimage.filters.rank import equalize >>> img = data.camera() >>> equ = equalize(img, disk(5)) @@ -246,7 +246,7 @@ def gradient(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import gradient + >>> from skimage.filters.rank import gradient >>> img = data.camera() >>> out = gradient(img, disk(5)) @@ -287,14 +287,14 @@ def maximum(image, selem, out=None, mask=None, shift_x=False, shift_y=False): Notes ----- - The lower algorithm complexity makes the `skimage.filter.rank.maximum` + The lower algorithm complexity makes the `skimage.filters.rank.maximum` more efficient for larger images and structuring elements. Examples -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import maximum + >>> from skimage.filters.rank import maximum >>> img = data.camera() >>> out = maximum(img, disk(5)) @@ -333,7 +333,7 @@ def mean(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import mean + >>> from skimage.filters.rank import mean >>> img = data.camera() >>> avg = mean(img, disk(5)) @@ -372,7 +372,7 @@ def subtract_mean(image, selem, out=None, mask=None, shift_x=False, -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import subtract_mean + >>> from skimage.filters.rank import subtract_mean >>> img = data.camera() >>> out = subtract_mean(img, disk(5)) @@ -411,7 +411,7 @@ def median(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import median + >>> from skimage.filters.rank import median >>> img = data.camera() >>> med = median(img, disk(5)) @@ -452,14 +452,14 @@ def minimum(image, selem, out=None, mask=None, shift_x=False, shift_y=False): Notes ----- - The lower algorithm complexity makes the `skimage.filter.rank.minimum` more + The lower algorithm complexity makes the `skimage.filters.rank.minimum` more efficient for larger images and structuring elements. Examples -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import minimum + >>> from skimage.filters.rank import minimum >>> img = data.camera() >>> out = minimum(img, disk(5)) @@ -500,7 +500,7 @@ def modal(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import modal + >>> from skimage.filters.rank import modal >>> img = data.camera() >>> out = modal(img, disk(5)) @@ -544,7 +544,7 @@ def enhance_contrast(image, selem, out=None, mask=None, shift_x=False, -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import enhance_contrast + >>> from skimage.filters.rank import enhance_contrast >>> img = data.camera() >>> out = enhance_contrast(img, disk(5)) @@ -585,7 +585,7 @@ def pop(image, selem, out=None, mask=None, shift_x=False, shift_y=False): Examples -------- >>> from skimage.morphology import square - >>> import skimage.filter.rank as rank + >>> import skimage.filters.rank as rank >>> img = 255 * np.array([[0, 0, 0, 0, 0], ... [0, 1, 1, 1, 0], ... [0, 1, 1, 1, 0], @@ -635,7 +635,7 @@ def sum(image, selem, out=None, mask=None, shift_x=False, shift_y=False): Examples -------- >>> from skimage.morphology import square - >>> import skimage.filter.rank as rank + >>> import skimage.filters.rank as rank >>> img = np.array([[0, 0, 0, 0, 0], ... [0, 1, 1, 1, 0], ... [0, 1, 1, 1, 0], @@ -685,7 +685,7 @@ def threshold(image, selem, out=None, mask=None, shift_x=False, shift_y=False): Examples -------- >>> from skimage.morphology import square - >>> from skimage.filter.rank import threshold + >>> from skimage.filters.rank import threshold >>> img = 255 * np.array([[0, 0, 0, 0, 0], ... [0, 1, 1, 1, 0], ... [0, 1, 1, 1, 0], @@ -736,7 +736,7 @@ def tophat(image, selem, out=None, mask=None, shift_x=False, shift_y=False): -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import tophat + >>> from skimage.filters.rank import tophat >>> img = data.camera() >>> out = tophat(img, disk(5)) @@ -781,7 +781,7 @@ def noise_filter(image, selem, out=None, mask=None, shift_x=False, -------- >>> from skimage import data >>> from skimage.morphology import disk - >>> from skimage.filter.rank import noise_filter + >>> from skimage.filters.rank import noise_filter >>> img = data.camera() >>> out = noise_filter(img, disk(5)) @@ -833,7 +833,7 @@ def entropy(image, selem, out=None, mask=None, shift_x=False, shift_y=False): Examples -------- >>> from skimage import data - >>> from skimage.filter.rank import entropy + >>> from skimage.filters.rank import entropy >>> from skimage.morphology import disk >>> img = data.camera() >>> ent = entropy(img, disk(5)) @@ -877,7 +877,7 @@ def otsu(image, selem, out=None, mask=None, shift_x=False, shift_y=False): Examples -------- >>> from skimage import data - >>> from skimage.filter.rank import otsu + >>> from skimage.filters.rank import otsu >>> from skimage.morphology import disk >>> img = data.camera() >>> local_otsu = otsu(img, disk(5)) @@ -926,7 +926,7 @@ def windowed_histogram(image, selem, out=None, mask=None, Examples -------- >>> from skimage import data - >>> from skimage.filter.rank import windowed_histogram + >>> from skimage.filters.rank import windowed_histogram >>> from skimage.morphology import disk >>> img = data.camera() >>> hist_img = windowed_histogram(img, disk(5)) diff --git a/skimage/filter/rank/generic_cy.pyx b/skimage/filters/rank/generic_cy.pyx similarity index 100% rename from skimage/filter/rank/generic_cy.pyx rename to skimage/filters/rank/generic_cy.pyx diff --git a/skimage/filter/rank/percentile_cy.pyx b/skimage/filters/rank/percentile_cy.pyx similarity index 100% rename from skimage/filter/rank/percentile_cy.pyx rename to skimage/filters/rank/percentile_cy.pyx diff --git a/skimage/filter/rank/tests/test_rank.py b/skimage/filters/rank/tests/test_rank.py similarity index 99% rename from skimage/filter/rank/tests/test_rank.py rename to skimage/filters/rank/tests/test_rank.py index 48d02462..7359fe87 100644 --- a/skimage/filter/rank/tests/test_rank.py +++ b/skimage/filters/rank/tests/test_rank.py @@ -4,7 +4,7 @@ from numpy.testing import run_module_suite, assert_array_equal, assert_raises from skimage import img_as_ubyte, img_as_uint, img_as_float from skimage import data, util from skimage.morphology import cmorph, disk -from skimage.filter import rank +from skimage.filters import rank np.random.seed(0) diff --git a/skimage/filter/setup.py b/skimage/filters/setup.py similarity index 96% rename from skimage/filter/setup.py rename to skimage/filters/setup.py index 2f5a72e6..8bfebcb7 100644 --- a/skimage/filter/setup.py +++ b/skimage/filters/setup.py @@ -9,7 +9,7 @@ base_path = os.path.abspath(os.path.dirname(__file__)) def configuration(parent_package='', top_path=None): from numpy.distutils.misc_util import Configuration, get_numpy_include_dirs - config = Configuration('filter', parent_package, top_path) + config = Configuration('filters', parent_package, top_path) config.add_data_dir('tests') config.add_data_dir('rank/tests') diff --git a/skimage/filter/tests/test_edges.py b/skimage/filters/tests/test_edges.py similarity index 99% rename from skimage/filter/tests/test_edges.py rename to skimage/filters/tests/test_edges.py index ac363e52..9e7a714e 100644 --- a/skimage/filter/tests/test_edges.py +++ b/skimage/filters/tests/test_edges.py @@ -2,8 +2,8 @@ import numpy as np from numpy.testing import (assert_array_almost_equal as assert_close, assert_, assert_allclose) -import skimage.filter as F -from skimage.filter.edges import _mask_filter_result +import skimage.filters as F +from skimage.filters.edges import _mask_filter_result def test_roberts_zeros(): diff --git a/skimage/filter/tests/test_gabor.py b/skimage/filters/tests/test_gabor.py similarity index 97% rename from skimage/filter/tests/test_gabor.py rename to skimage/filters/tests/test_gabor.py index 7035d82a..34b26e1f 100644 --- a/skimage/filter/tests/test_gabor.py +++ b/skimage/filters/tests/test_gabor.py @@ -2,7 +2,7 @@ import numpy as np from numpy.testing import (assert_equal, assert_almost_equal, assert_array_almost_equal) -from skimage.filter._gabor import gabor_kernel, gabor_filter, _sigma_prefactor +from skimage.filters._gabor import gabor_kernel, gabor_filter, _sigma_prefactor def test_gabor_kernel_size(): diff --git a/skimage/filter/tests/test_gaussian.py b/skimage/filters/tests/test_gaussian.py similarity index 96% rename from skimage/filter/tests/test_gaussian.py rename to skimage/filters/tests/test_gaussian.py index 9118bfae..612dd9e4 100644 --- a/skimage/filter/tests/test_gaussian.py +++ b/skimage/filters/tests/test_gaussian.py @@ -1,5 +1,5 @@ import numpy as np -from skimage.filter._gaussian import gaussian_filter +from skimage.filters._gaussian import gaussian_filter def test_null_sigma(): diff --git a/skimage/filter/tests/test_lpi_filter.py b/skimage/filters/tests/test_lpi_filter.py similarity index 98% rename from skimage/filter/tests/test_lpi_filter.py rename to skimage/filters/tests/test_lpi_filter.py index f6176691..12b3ab00 100644 --- a/skimage/filter/tests/test_lpi_filter.py +++ b/skimage/filters/tests/test_lpi_filter.py @@ -5,7 +5,7 @@ from numpy.testing import * from skimage import data_dir from skimage.io import * -from skimage.filter import * +from skimage.filters import * class TestLPIFilter2D(object): diff --git a/skimage/filter/tests/test_thresholding.py b/skimage/filters/tests/test_thresholding.py similarity index 97% rename from skimage/filter/tests/test_thresholding.py rename to skimage/filters/tests/test_thresholding.py index cd9cc553..5de758e8 100644 --- a/skimage/filter/tests/test_thresholding.py +++ b/skimage/filters/tests/test_thresholding.py @@ -3,10 +3,10 @@ from numpy.testing import assert_equal, assert_almost_equal import skimage from skimage import data -from skimage.filter.thresholding import (threshold_adaptive, - threshold_otsu, - threshold_yen, - threshold_isodata) +from skimage.filters.thresholding import (threshold_adaptive, + threshold_otsu, + threshold_yen, + threshold_isodata) class TestSimpleImage(): diff --git a/skimage/filter/thresholding.py b/skimage/filters/thresholding.py similarity index 100% rename from skimage/filter/thresholding.py rename to skimage/filters/thresholding.py diff --git a/skimage/morphology/greyreconstruct.py b/skimage/morphology/greyreconstruct.py index ec7aa182..3e147e29 100644 --- a/skimage/morphology/greyreconstruct.py +++ b/skimage/morphology/greyreconstruct.py @@ -11,7 +11,7 @@ Original author: Lee Kamentsky """ import numpy as np -from skimage.filter._rank_order import rank_order +from skimage.filters._rank_order import rank_order def reconstruction(seed, mask, method='dilation', selem=None, offset=None): diff --git a/skimage/morphology/watershed.py b/skimage/morphology/watershed.py index 977223a0..d7f1255d 100644 --- a/skimage/morphology/watershed.py +++ b/skimage/morphology/watershed.py @@ -27,7 +27,7 @@ Original author: Lee Kamentsky from _heapq import heappush, heappop import numpy as np import scipy.ndimage -from ..filter import rank_order +from ..filters import rank_order from .._shared.utils import deprecated from . import _watershed diff --git a/skimage/segmentation/random_walker_segmentation.py b/skimage/segmentation/random_walker_segmentation.py index bcb57739..3458ab80 100644 --- a/skimage/segmentation/random_walker_segmentation.py +++ b/skimage/segmentation/random_walker_segmentation.py @@ -39,7 +39,7 @@ except ImportError: amg_loaded = False from scipy.sparse.linalg import cg from ..util import img_as_float -from ..filter import rank_order +from ..filters import rank_order #-----------Laplacian-------------------- diff --git a/skimage/setup.py b/skimage/setup.py index 9a8c8ac2..94d00ea8 100644 --- a/skimage/setup.py +++ b/skimage/setup.py @@ -13,7 +13,7 @@ def configuration(parent_package='', top_path=None): config.add_subpackage('exposure') config.add_subpackage('feature') config.add_subpackage('restoration') - config.add_subpackage('filter') + config.add_subpackage('filters') config.add_subpackage('graph') config.add_subpackage('io') config.add_subpackage('measure') diff --git a/skimage/viewer/tests/test_plugins.py b/skimage/viewer/tests/test_plugins.py index 497708a4..6823635a 100644 --- a/skimage/viewer/tests/test_plugins.py +++ b/skimage/viewer/tests/test_plugins.py @@ -2,7 +2,7 @@ import numpy as np import skimage import skimage.data as data -from skimage.filter.rank import median +from skimage.filters.rank import median from skimage.morphology import disk from skimage.viewer import ImageViewer, viewer_available from numpy.testing import assert_equal, assert_allclose, assert_almost_equal diff --git a/skimage/viewer/tests/test_viewer.py b/skimage/viewer/tests/test_viewer.py index 7a110953..99d8e364 100644 --- a/skimage/viewer/tests/test_viewer.py +++ b/skimage/viewer/tests/test_viewer.py @@ -4,7 +4,7 @@ from skimage.viewer.qt import QtGui, QtCore from skimage.viewer import ImageViewer, CollectionViewer, viewer_available from skimage.transform import pyramid_gaussian from skimage.viewer.plugins import OverlayPlugin -from skimage.filter import sobel +from skimage.filters import sobel from numpy.testing import assert_equal from numpy.testing.decorators import skipif from skimage._shared.version_requirements import is_installed diff --git a/viewer_examples/plugins/canny_simple.py b/viewer_examples/plugins/canny_simple.py index 641ca138..6e811f52 100644 --- a/viewer_examples/plugins/canny_simple.py +++ b/viewer_examples/plugins/canny_simple.py @@ -1,5 +1,5 @@ from skimage import data -from skimage.filter import canny +from skimage.filters import canny from skimage.viewer import ImageViewer from skimage.viewer.widgets import Slider diff --git a/viewer_examples/plugins/collection_plugin.py b/viewer_examples/plugins/collection_plugin.py index 65ff1f21..83c0223a 100644 --- a/viewer_examples/plugins/collection_plugin.py +++ b/viewer_examples/plugins/collection_plugin.py @@ -8,7 +8,7 @@ Demo of a CollectionViewer for viewing collections of images with the """ from skimage import data -from skimage.filter import rank +from skimage.filters import rank from skimage.morphology import disk from skimage.viewer import CollectionViewer diff --git a/viewer_examples/plugins/median_filter.py b/viewer_examples/plugins/median_filter.py index beb313eb..5a4549a1 100644 --- a/viewer_examples/plugins/median_filter.py +++ b/viewer_examples/plugins/median_filter.py @@ -1,5 +1,5 @@ from skimage import data -from skimage.filter.rank import median +from skimage.filters.rank import median from skimage.morphology import disk from skimage.viewer import ImageViewer diff --git a/viewer_examples/plugins/watershed_demo.py b/viewer_examples/plugins/watershed_demo.py index 612ec6c9..2f043f9d 100644 --- a/viewer_examples/plugins/watershed_demo.py +++ b/viewer_examples/plugins/watershed_demo.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt from skimage import data -from skimage import filter +from skimage import filters from skimage import morphology from skimage.viewer import ImageViewer from skimage.viewer.widgets import history