CofeehousePy/deps/scikit-image/doc/examples/filters/plot_attribute_operators.py

119 lines
4.6 KiB
Python

"""
===================
Attribute operators
===================
Attribute operators (or connected operators) [1]_ is a family of contour
preserving filtering operations in mathematical morphology. They can be
implemented by max-trees [2]_, a compact hierarchical representation of the
image.
Here, we show how to use diameter closing [3]_ [4]_, which is compared to
morphological closing. Comparing the two results, we observe that the
difference between image and morphological closing also extracts the long line.
A thin but long line cannot contain the structuring element. The diameter
closing stops the filling as soon as a maximal extension is reached. The line
is therefore not filled and therefore not extracted by the difference.
"""
import numpy as np
import matplotlib.pyplot as plt
from skimage.morphology import diameter_closing
from skimage import data
from skimage.morphology import closing
from skimage.morphology import square
datasets = {
'retina': {'image': data.microaneurysms(),
'figsize': (15, 9),
'diameter': 10,
'vis_factor': 3,
'title': 'Detection of microaneurysm'},
'page': {'image': data.page(),
'figsize': (15, 7),
'diameter': 23,
'vis_factor': 1,
'title': 'Text detection'}
}
for dataset in datasets.values():
# image with printed letters
image = dataset['image']
figsize = dataset['figsize']
diameter = dataset['diameter']
fig, ax = plt.subplots(2, 3, figsize=figsize)
# Original image
ax[0, 0].imshow(image, cmap='gray', aspect='equal',
vmin=0, vmax=255)
ax[0, 0].set_title('Original', fontsize=16)
ax[0, 0].axis('off')
ax[1, 0].imshow(image, cmap='gray', aspect='equal',
vmin=0, vmax=255)
ax[1, 0].set_title('Original', fontsize=16)
ax[1, 0].axis('off')
# Diameter closing : we remove all dark structures with a maximal
# extension of less than <diameter> (12 or 23). I.e. in closed_attr, all
# local minima have at least a maximal extension of <diameter>.
closed_attr = diameter_closing(image, diameter, connectivity=2)
# We then calculate the difference to the original image.
tophat_attr = closed_attr - image
ax[0, 1].imshow(closed_attr, cmap='gray', aspect='equal',
vmin=0, vmax=255)
ax[0, 1].set_title('Diameter Closing', fontsize=16)
ax[0, 1].axis('off')
ax[0, 2].imshow(dataset['vis_factor'] * tophat_attr, cmap='gray',
aspect='equal', vmin=0, vmax=255)
ax[0, 2].set_title('Tophat (Difference)', fontsize=16)
ax[0, 2].axis('off')
# A morphological closing removes all dark structures that cannot
# contain a structuring element of a certain size.
closed = closing(image, square(diameter))
# Again we calculate the difference to the original image.
tophat = closed - image
ax[1, 1].imshow(closed, cmap='gray', aspect='equal',
vmin=0, vmax=255)
ax[1, 1].set_title('Morphological Closing', fontsize=16)
ax[1, 1].axis('off')
ax[1, 2].imshow(dataset['vis_factor'] * tophat, cmap='gray',
aspect='equal', vmin=0, vmax=255)
ax[1, 2].set_title('Tophat (Difference)', fontsize=16)
ax[1, 2].axis('off')
fig.suptitle(dataset['title'], fontsize=18)
fig.tight_layout(rect=(0, 0, 1, 0.88))
plt.show()
#####################################################################
# References
# ----------
# .. [1] Salembier, P., Oliveras, A., & Garrido, L. (1998). Antiextensive
# Connected Operators for Image and Sequence Processing.
# IEEE Transactions on Image Processing, 7(4), 555-570.
# :DOI:`10.1109/83.663500`
# .. [2] Carlinet, E., & Geraud, T. (2014). A Comparative Review of
# Component Tree Computation Algorithms. IEEE Transactions on Image
# Processing, 23(9), 3885-3895.
# :DOI:`10.1109/TIP.2014.2336551`
# .. [3] Vincent L., Proc. "Grayscale area openings and closings,
# their efficient implementation and applications",
# EURASIP Workshop on Mathematical Morphology and its
# Applications to Signal Processing, Barcelona, Spain, pp.22-27,
# May 1993.
# .. [4] Walter, T., & Klein, J.-C. (2002). Automatic Detection of
# Microaneurysms in Color Fundus Images of the Human Retina by Means
# of the Bounding Box Closing. In A. Colosimo, P. Sirabella,
# A. Giuliani (Eds.), Medical Data Analysis. Lecture Notes in Computer
# Science, vol 2526, pp. 210-220. Springer Berlin Heidelberg.
# :DOI:`10.1007/3-540-36104-9_23`