Zusammenhangskomponenten-Markierung in Kacheln#

Die Markierung von Objekten in Kacheln ist eine anspruchsvolle Aufgabe. Wenn dieser Schritt nicht umgangen werden kann, bietet dask-image die richtige Funktionalität, um Beschriftungsbilder mit Beschriftungen zu erhalten, die mehrere Kacheln überqueren.

import numpy as np
import dask
import dask.array as da
from skimage.data import cells3d
from skimage.io import imread
from skimage.measure import label as skimage_label
import pyclesperanto_prototype as cle
from pyclesperanto_prototype import imshow
from dask_image.ndmeasure import label as daskimage_label
image = imread("../../data/blobs.tif") > 128
imshow(image)
../_images/bc8b964563969e824e1e452e9ee92af0a0b36f9e58fefa5725be34bf21a7f04b.png
tiles = da.from_array(image, chunks=(128, 128))
tiles
Array Chunk
Bytes 63.50 kiB 16.00 kiB
Shape (254, 256) (128, 128)
Count 4 Tasks 4 Chunks
Type bool numpy.ndarray
256 254

Wir werden die scikit-image-Funktion label() zur Verarbeitung unseres Bildes verwenden.

procedure = skimage_label

tile_map = da.map_blocks(procedure, tiles)

result = tile_map.compute()
imshow(result, labels=True)
../_images/85f5dc7fe2faef30a7c0698b3ac33dd3c8f3c7351c3eabf940aa698f5020eab0.png

In diesem Bild können wir bereits erkennen, dass das Ergebnis Artefakte an den Kachelgrenzen in der horizontalen und vertikalen Bildmitte aufweist. Um das Ergebnis weiter zu überprüfen, werden wir die Zusammenhangskomponenten-Markierung des Bildes ohne Kachelung berechnen.

reference = skimage_label(image)

imshow(reference, labels=True)
../_images/cdc69e90459a3a8cba2befb95af73d5516bbe4e985521e69b09df76db2dc5308.png

Als Nächstes können wir die maximale Intensität im Beschriftungsbild vergleichen, um zu sehen, ob die Gesamtzahl der Beschriftungen in diesen beiden Bildern gleich ist. Sie sind es nicht:

result.max(), reference.max()
(20, 63)

Durch die Berechnung der Standardabweichung der Pixelintensität im Ergebnisbild, gruppiert nach den Referenzbeschriftungen, können wir visualisieren, welche Objekte nicht korrekt segmentiert sind.

stddev_map = cle.standard_deviation_intensity_map(result, reference) > 0

imshow(stddev_map)
../_images/eb860aef8140012781f0c648b5db2f14c66501acef97671110743f440349f90c.png

Gekachelte Zusammenhangskomponenten-Markierung mit dask-image#

Die Bildverarbeitungsbibliothek dask-image hat eine verteilte Version der Zusammenhangskomponenten-Markierung verfügbar dask_image.ndmeasure.label:

result_di, num_labels = daskimage_label(image)

imshow(result_di, labels=True)
../_images/cdc69e90459a3a8cba2befb95af73d5516bbe4e985521e69b09df76db2dc5308.png

Beachten Sie, dass das Ergebnis dieser Operation ein dask-Array ist, und die Berechnung des Maximums zum Beispiel nicht einfach ist:

result_di.max(), reference.max()
(dask.array<amax-aggregate, shape=(), dtype=int32, chunksize=(), chunktype=numpy.ndarray>,
 63)
np.asarray(result_di).max(), reference.max()
(63, 63)