Detección de bordes#

En clesperanto, se implementan múltiples filtros para la detección de bordes.

Ver también

import pyclesperanto_prototype as cle
from skimage.io import imread
import matplotlib.pyplot as plt

cle.select_device("RTX")
<gfx90c on Platform: AMD Accelerated Parallel Processing (2 refs)>
blobs = imread("../../data/blobs.tif")
blobs.shape
(254, 256)
cle.imshow(blobs)
../_images/697332ed931701bd777704b279b47e121b548544b81f7a635c3783b21c04fb53.png

Operador Sobel#

ver también

blobs_sobel = cle.sobel(blobs)
cle.imshow(blobs_sobel)
../_images/6f78a059d541f817ce00965d380f7561c27cd8d61a9c1d0cd261392d819f8164.png

Operador Laplace#

ver también

blobs_laplace = cle.laplace_box(blobs)
cle.imshow(blobs_laplace)
../_images/97b9899f717c757b0ddca2c1bad676aaf671f2fa3697d9eb8cebc46be9099e88.png

Laplaciano de Gaussiana#

También conocido como el filtro del sombrero mexicano

blobs_laplacian_of_gaussian = cle.laplace_box(cle.gaussian_blur(blobs, sigma_x=1, sigma_y=1))
cle.imshow(blobs_laplacian_of_gaussian)
../_images/4039d3563c2a36f9db4b9be7e26ded824be8eda4d4037357dfcb945cf44ecf2e.png
blobs_laplacian_of_gaussian = cle.laplace_box(cle.gaussian_blur(blobs, sigma_x=5, sigma_y=5))
cle.imshow(blobs_laplacian_of_gaussian)
../_images/9bd4cce450e487d9177d0a1ecf7113bf18e721495aeb5da88645442a0d7ee226.png

Filtro de Varianza Local#

blobs_edges = cle.variance_box(blobs, radius_x=5, radius_y=5)
cle.imshow(blobs_edges)
../_images/3c75eedc70e388d2225c1cca24088c11ced4c7a4b45aee2b9c122af42578e3f4.png

Desviación estándar local#

… es simplemente la raíz cuadrada de la varianza local

blobs_edges = cle.standard_deviation_box(blobs, radius_x=5, radius_y=5)
cle.imshow(blobs_edges)
../_images/39b5a73b96057262d6fab7a9d85d9f36478cb83ec7d58fdc22a773b40ac86f9e.png

La detección de bordes no es mejora de bordes#

Intuitivamente, uno podría aplicar un filtro de detección de bordes para mejorar los bordes en imágenes que muestran bordes. Probemos con una imagen que muestra membranas. Es una imagen 3D, por cierto.

image = imread("../../data/EM_C_6_c0.tif")
image.shape
(256, 256, 256)
cle.imshow(image[60])
../_images/756fcdd11282e04ef342228a2a2fd94ed9875e723db8d3b7c1515358353a0ddc.png
image_sobel = cle.sobel(image)
cle.imshow(image_sobel[60])
../_images/105c5d8c02a5c62db015972a88654442b975ce4cfaeadb386cd35ccb857bf86b.png

Al mirar con mucho cuidado, se puede observar que los bordes son un poco más gruesos en la segunda imagen. El filtro de detección de bordes detecta dos bordes, el lado de aumento de señal de la membrana y el lado de disminución de señal en el lado opuesto. Hagamos zoom:

fig, axs = plt.subplots(1, 2)
cle.imshow(                image[60, 125:145, 135:155], plot=axs[0])
cle.imshow(cle.pull(image_sobel)[60, 125:145, 135:155], plot=axs[1])
../_images/d3fed6be6e92aa6bfb9b673f0b6147e393226ec22a5e933e2fdb494cfdd4402c.png

Mejorando los bordes#

Por lo tanto, para mejorar los bordes en una imagen de membrana, otros filtros son más útiles. La mejora puede significar, por ejemplo, hacer las membranas más gruesas y potencialmente cerrar brechas.

Desviación estándar local#

image_std = cle.standard_deviation_box(image, radius_x=5, radius_y=5, radius_z=5)
cle.imshow(image_std[60])
../_images/b6e7b76ab9326c710c8a16b5244ff6f9bb497bc3294d2f85f4f0d2b36dac296b.png

Máximo local#

image_max = cle.maximum_box(image, radius_x=5, radius_y=5, radius_z=5)
cle.imshow(image_max[60])
../_images/61ca117a376d1a7f27388d3ad6474e499ccbcb215e05b5c7a24922d4af457597.png