Skip to main content

Connected components on discrete and continuous multilabel 3D and 2D images. Handles 26, 18, and 6 connected variants; periodic boundaries (4, 8, & 6).

Project description

PyPI version DOI

cc3d: Connected Components on Multilabel 3D Images

Binary and multilabel connected components. (a) A binary image (foreground white,  background black) (b) 4-connected CCL of binary image (c) 8-connected CCL of binary image (d) A multilabel image (e) 4-connected CCL of multilabel image (f) 8-connected CCL of multilabel image
Fig. 1. Binary and Multilabel Connected Components Labeling (CCL) 2D images are shown for simplicity. Black is the background color (zero). (a) A binary image (foreground white, background black) (b) 4-connected CCL of binary image (c) 8-connected CCL of binary image (d) A multilabel image (e) 4-connected CCL of multilabel image (f) 8-connected CCL of multilabel image.

Continuous value connected components (top) A three tone grayscale image with signed additive low magnitude noise (bottom) Extracted components using continuous value CCL with a delta value greater than the noise magnitude but smaller than the difference between tones
Fig. 2. Continuous Value Connected Components Labeling (CCL) (top) A three tone grayscale image with signed additive low magnitude noise (bottom) Extracted components using continuous value CCL with a delta value greater than the noise magnitude but smaller than the difference between tones

cc3d is an implementation of connected components in three dimensions using a 26, 18, or 6-connected neighborhood in 3D or 4 and 8-connected in 2D. This package uses a 3D variant of the two pass method by Rosenfeld and Pflatz augmented with Union-Find and a decision tree based on the 2D 8-connected work of Wu, Otoo, and Suzuki. This implementation is compatible with images containing many different labels, not just binary images. It also supports continuously valued images such as grayscale microscope images with an algorithm that joins together nearby values.

I wrote this package because I was working on densely labeled 3D biomedical images of brain tissue (e.g. 512x512x512 voxels). Other off the shelf implementations I reviewed were limited to binary images. This rendered these other packages too slow for my use case as it required masking each label and running the connected components algorithm once each time. For reference, there are often between hundreds to thousands of labels in a given volume. The benefit of this package is that it labels all connected components in one shot, improving performance by one or more orders of magnitude.

In general, binary images are much more common (usually resulting from image thresholding), but multi-label images crop up in instance segmentation and semantic labeling as a classifier may label touching clusters of adjacent pixels differently. If a gap between different labels is guaranteed, then the problem degenerates into the binary version.

Check out benchmarks to see a comparison with SciPy on a few different tasks.

Python pip Installaction

If compatible binaries are available for your platform, installation is particularly simple.

pip install connected-components-3d

If compatible binaries are not available, you can install from source as follows.

Requires a C++ compiler.

pip install numpy
pip install connected-components-3d --no-binary :all:

Occasionally, you may appear to successfully install cc3d, but on import you'll see an error that includes: numpy.ufunc size changed, may indicate binary incompatibility. You can either try upgrading numpy or compiling cc3d from source in this case.

Python Manual Installation

Requires a C++ compiler.

pip install -r requirements.txt
python setup.py develop

Python Use

The following functions are available with examples below:

  • Connected Component Labeling (CCL)
  • Removal of small objects ("dust")
  • Extraction of k largest objects
  • Fast extraction of all objects one-by-one
  • Calculation of contact surface area and contact network
  • Extraction of a per voxel connectivity graph
import cc3d
import numpy as np

labels_in = np.ones((512, 512, 512), dtype=np.int32)
labels_out = cc3d.connected_components(labels_in) # 26-connected

connectivity = 6 # only 4,8 (2D) and 26, 18, and 6 (3D) are allowed
labels_out = cc3d.connected_components(labels_in, connectivity=connectivity)

# By default, cc3d works on multivalued labelings, but sometimes you want
# to treat a grayscale image as a binary image directly. It is also possible
# to process binary images more effectively. Binary image specific optimizations 
# are not implemented yet though, but may be in the future.
labels_out = cc3d.connected_components(labels_in, binary_image=True)
# same as above, but less efficient
labels_out = cc3d.connected_components(labels_in > 0) 

# If you need the borders to wrap around (e.g. for simulations, world maps)
# specify periodic_boundary=True, currently only supported for
# 4 and 8 (2d) and 6 (3d) connectivities.
labels_out = cc3d.connected_components(
  labels_in, connectivity=connectivity, periodic_boundary=True
)

# If you need a particular dtype you can specify np.uint16, np.uint32, or np.uint64
# You can go bigger, not smaller, than the default which is selected
# to be the smallest that can be safely used. This can save you the copy
# operation needed by labels_out.astype(...).
labels_out = cc3d.connected_components(labels_in, out_dtype=np.uint64)

# If you're working with continuously valued images like microscopy
# images you can use cc3d to perform a very rough segmentation. 
# If delta = 0, standard high speed processing. If delta > 0, then
# neighbor voxel values <= delta are considered the same component.
# The algorithm can be 2-10x slower though. Zero is considered
# background and will not join to any other voxel.
labels_out = cc3d.connected_components(labels_in, delta=10)

# If you're working with an image that's larger than memory you can
# use mmapped files. The input and output files can be used independently.
# In this case an array labels.bin that is 5000x5000x2000 voxels and uint32_t
# in Fortran order is computed and the results are written to out.bin in Fortran
# order. You can find the properties of the file (shape, dtype, order) by inspecting
# labels_out.
labels_in = np.memmap("labels.bin", order="F", dtype=np.uint32, shape=(5000, 5000, 2000))
labels_out = cc3d.connected_components(labels_in, out_file="out.bin")

# Here's another strategy that you can use for huge files that won't even
# take up any disk space. Provide any iterator to this function that produces
# thick z sections of the input array that are in sequential order.
# The output is a highly compressed CrackleArray that is still random access.
# See: https://github.com/seung-lab/crackle
# You need to pip install connected-components-3d[stack] to get the extra modules.
def sections(labels_in):
  """
  A generator that produces thick Z slices
  of an image
  """
  for z in range(0, labels_in.shape[2], 100):
    yield labels_in[:,:,z:z+100]

# You can access compressed_labels_out using array notation
compressed_labels_out = cc3d.connected_components_stack(sections(labels))
# convert to numpy array, probably a big mistake since
# you probably expected it was going to blow up RAM
cc_labels = compressed_labels_out.numpy()
# if you don't like hanging onto this exotic format, you 
# can write it as a numpy array to disk in a memory efficient way.
compressed_labels_out.save("example.npy.gz")
# or hang onto it
compressed_labels_out.save("example.ckl")


# You can extract the number of labels (which is also the maximum 
# label value) like so:
labels_out, N = cc3d.connected_components(labels_in, return_N=True) # free
# -- OR -- 
labels_out = cc3d.connected_components(labels_in) 
N = np.max(labels_out) # costs a full read

# You can extract individual components using numpy operators
# This approach is slow, but makes a mutable copy.
for segid in range(1, N+1):
  extracted_image = labels_out * (labels_out == segid)
  process(extracted_image) # stand in for whatever you'd like to do

# If a read-only image is ok, this approach is MUCH faster
# if the image has many contiguous regions. A random image 
# can be slower. binary=True yields binary images instead
# of numbered images.
for label, image in cc3d.each(labels_out, binary=False, in_place=True):
  process(image) # stand in for whatever you'd like to do

# Image statistics like voxel counts, bounding boxes, and centroids.
stats = cc3d.statistics(labels_out)

# Remove dust from the input image. Removes objects with
# fewer than `threshold` voxels.
labels_out = cc3d.dust(
  labels_in, threshold=100, 
  connectivity=26, in_place=False
)

# Get a labeling of the k largest objects in the image.
# The output will be relabeled from 1 to N.
labels_out, N = cc3d.largest_k(
  labels_in, k=10, 
  connectivity=26, delta=0,
  return_N=True,
)
labels_in *= (labels_out > 0) # to get original labels

# Compute the contact surface area between all labels.
# Only face contacts are counted as edges and corners
# have zero area. To get a simple count of all contacting
# voxels, set `surface_area=False`. 
# { (1,2): 16 } aka { (label_1, label_2): contact surface area }
surface_per_contact = cc3d.contacts(
  labels_out, connectivity=connectivity,
  surface_area=True, anisotropy=(4,4,40)
)
# same as set(surface_per_contact.keys())
edges = cc3d.region_graph(labels_out, connectivity=connectivity)

# You can also generate a voxel connectivty graph that encodes
# which directions are passable from a given voxel as a bitfield.
# This could also be seen as a method of eroding voxels fractionally
# based on their label adjacencies.
# See help(cc3d.voxel_connectivity_graph) for details.
graph = cc3d.voxel_connectivity_graph(labels, connectivity=connectivity)

# ...and turn it back into labeled values (probably
# not exactly the same ones). Note: this function currently
# assumes an undirected graph, so single voxel alterations are
# likely to go awry.
new_labels = cc3d.color_connectivity_graph(graph, connectivity=connectivity)

Note: C and Fortran order arrays will be processed in row major and column major order respectively, so the numbering of labels will be "transposed". The scare quotes are there because the dimensions of the array will not change.

C++ Use

#include "cc3d.hpp"

// 3d array represented as 1d array
int* labels = new int[512*512*512](); 

uint32_t* cc_labels = cc3d::connected_components3d<int>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512
);

// The default template parameter for output type is uint32_t
uint64_t* cc_labels = cc3d::connected_components3d<int, uint64_t>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512
);

uint16_t* cc_labels = cc3d::connected_components3d<int, uint16_t>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512, 
  /*connectivity=*/18 // default is 26 connected
);

size_t N = 0;
uint16_t* cc_labels = cc3d::connected_components3d<int, uint16_t>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512, 
  /*connectivity=*/26, /*N=*/N // writes number of labels to N
);

#include "cc3d_continuous.hpp"

// For handling grayscale images. Note that the difference
// is the addition of the "delta" argument.
uint16_t* cc_labels = cc3d::connected_components3d<int, uint16_t>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512, 
  /*delta=*/10, /*connectivity=*/6 // default is 26 connected
);

#include "cc3d_graphs.hpp"

// edges is [ e11, e12, e21, e22, ... ]
std::vector<uint64_t> edges = cc3d::extract_region_graph<uint64_t>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512, 
  /*connectivity=*/18 // default is 26 connected
);

// graph is a series of bitfields that describe inter-voxel
// connectivity based on adjacent labels. See "cc3d_graphs.hpp"
// for details on the bitfield. 
uint32_t* graph = extract_voxel_connectivity_graph<T>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512, 
  /*connectivity=*/6 // default is 26 connected
);

26-Connected CCL Algorithm

The algorithm contained in this package is an elaboration into 3D images of the 2D image connected components algorithm described by Rosenfeld and Pflatz (RP) in 1968 [1] (which is well illustrated by this youtube video) using an equivalency list implemented as Tarjan's Union-Find disjoint set with path compression and balancing [2] and augmented with a decision tree based on work by Wu, Otoo, and Suzuki (WOS), an approach commonly known as Scan plus Array-based Union-Find (SAUF). [3] The description below describes the 26-connected algorithm, but once you understand it, deriving 18 and 6 are simple. However, we recently made some changes that warrant further discursion on 6-connected.

First Principles in 2D

In RP's 4-connected two-pass method for binary 2D images, the algorithm raster scans and every time it first encounters a foreground pixel (the pixels to its top and left are background), it marks it with a new label. If there is a preexisting label in its neighborhood, it uses that label instead. Whenever two labels are adjacent, it records they are equivalent so that they can be relabeled consistently in the second pass. This equivalency table can be constructed in several ways, but some popular approaches are Union-Find with path compression with balancing by rank and Selkow's algorithm (which can avoid pipeline stalls). [4] However, Selkow's algorithm is designed for two trees of depth two, appropriate for binary images. We would like to process multiple labels at the same time, making Union-Find preferable.

In the second pass, the pixels are relabeled using the equivalency table. Union-Find establishes one label as the root label of a tree, and the root is considered the representative label. Each pixel is then labeled with the representative label. Union-Find is therefore appropriate for representing disjoint sets. Path compression with balancing radically reduces the height of the tree, which accelerates the second pass.

WOS approached the problem of accelerating 8-connected 2D connected components on binary images. 8-connected labeling is achieved by extending RP's forward pass mask to the top left and top right corner pixels. In Union-Find based connected components algorithms, the unify step in the first pass is the most expensive step. WOS showed how to optimize away a large fraction of these calls using a decision tree that takes advantage of local topology. For example, since the top-center neighbor of the current pixel is also adjacent to the other mask elements, all of which have already been processed by virtue of the raster scan direction, if it is present it is sufficient to copy its value and move on. If it is absent, pick one of the remaining foreground pixels, copy their value, and use unify for the mask element on the right as it is now known to be non-neighboring with the left hand side. WOS's algorithm continues in this fashion until a match is found or all mask elements are processed at which point a new label is created.

For several years, this algorithm was the world's fastest, though it has been superceded by a newer work that exchanges the static decision tree for a dynamic one or precalculated generated one amongst other improvements. However, WOS's work is significant for both its simplicity and speed and thus serves as the inspiration for this library. For 2D 8-connected images, we provide a specialization using Wu et al's original decision tree for a slight performance boost.

We're interested in exploring the block based approaches of Grana, Borghesani, and Cucchiara ([5],[7]), however their approach appears to critically rely on binary images. We'll continue to think about ways to incorporate it. We also considered the approach of He et al [8] which is also supposed to modestly faster than than WOS. However, it substitutes the Union-Find data structure (one array) with three arrays, which imposes a memory requirement that is at odds with our goal of processing large images.

Extending to 3D

The approach presented below is very similar to that of Sutheebanjard [6]. To move to a 3D 26-connected neighborhood, the mask must be extended into three dimensions in order to connect neighboring planes. Observe that the 8-connected mask covers the trailing half of the neighborhood (the part that will have been already processed) such that the current pixel can rely on those labels. Thus the mask for the 26-connected neighborhood covers only two out of three potential planes: the entire lower plane (nine voxels), and a mask identical to WOS's (four voxels) on the current plane. While some further optimizations are possible, to begin, the problem can be conceptually decomposed into two parts: establishing a 9-connected link to the bottom plane and then an 8-connected link to the current plane. This works because the current pixel functions as a hub that transmits the connection information from the 9-connected step to the 8-connected step.

Fig. 1: Mask for an 8-connected plane. If J,K,L, and M are all eliminated, only N remains and a new label is assigned.

j k l
m n .
. . .

The very first Z plane (Z=0) the algorithm runs against is special: the edge effect omits the bottom plane of the mask. Therefore, as the remaining mask is only comprosed of the 8-connected 2D mask, after this pass, the bottom of the image is 8-connected. At Z=1, the 9-connected part of the mask kicks in, forming connections to Z=0, making the current plane now (8 + 9) 17-connected. At Z=2, the 9-connected bottom mask now forms connections from Z=1 to Z=2 on the top, making Z=1 (17 + 9) 26-connected. By induction, when this process proceeds to completion it results in a 26-connected labeling of the volume.

Following inspiration from WOS, we construct a decision tree on the densely labeled bottom plane that minimizes the number of unifications we need to perform.

Fig 2. The mask for the lower plane in 3D.

a b c
d e f
g h i

As e is connected to all other voxels, if present, it can simply be copied. If e is absent, b and h fully cover the mask. If b is absent, h, a, c comprise a covering. If h is absent, b, g, i are one. Below is a list of coverings such that each proceeding entry in the list assumes the first letters in the entries above are background.

  1. e
  2. k, (h | g, i)
  3. b, (h | g, i)
  4. h, a, c
  5. m, (f | c, i)
  6. d, (f | c, i)
  7. f, g, a
  8. a, c, g, i
  9. c, g, i
  10. g, i
  11. i

The decision tree is then constructed such that each of these coverings will be evaluated using the fewest unifications possible. It's possible to further optimize this by noting that e and b are both fully connected to the upper 2D mask. Therefore, if either of them are present, we can skip the 8-connected unification step. It's also possible to try the DF covering first if B is background, which would save one unification versus HAC given even statistics, but it seems to be slightly slower on the dataset I attempted. To move from binary data to multilabel data, I simply replaced tests for foreground and background with tests for matching labels.

In order to make a reasonably fast implementation, I implemented union-find with path compression. I conservatively used an IDs array qual to the size of the image for the union-find data structure instead of a sparse map. The union-find data structure plus the output labels means the memory consumption will be input + output + rank + equivalences. If your input labels are 32-bit, the memory usage will be 4x the input size. This becomes more problematic when 64-bit labels are used, but if you know something about your data, you can decrease the size of the union-find data structure. I previously used union-by-size but for some reason it merely reduced performance and increased memory usage so it was removed.

For more information on the history of connected components algorithms, and an even faster approach for 2D 8-connected components, consult Grana et al's paper on Block Based Decision Trees. [5,7]

Phantom Labels

In the course of thinking of improvements to several algorithms, we developed a technique we term "Phantom Labeling" for improving the SAUF method directly.

Definition: Phantom Labels are elements of a CCL mask that 
transmit connectivity information between other elements of the 
mask but cannot directly pass their value to the current pixel 
during the first pass of a SAUF derived algorithm.

Reproducing Fig. 1 again, but with new letters for the more limited problem, the standard SAUF mask appears like so:

Fig. 3: Mask for an 8-connected plane.

a b c
d x .
. . .

This results in a decision tree like so assuming x is a foreground pixel.

if b:
    x := b
elif a:
    x := a 
    if c:
        unify(a,c)
elif d:
    x := d
    if c: 
        unify(c,d)
elif c:
    x := c
else:
    x := new label

There is an opportunity here for eliminating up to half of the unify calls, one of the more expensive operations in modern CCL by slightly modifying the mask:

Fig. 4: 8-connected mask modified to include phantom label P.

. P .
a b c
d x .
. . .

This results in a modified decision tree.

if b:
    x := b
elif a:
    x := a 
    if c and not P: <--- change here
        unify(a,c)
elif d:
    x := d
    if c: 
        unify(c,d)
elif c:
    x := c
else:
    x := new label

The novelty of this technique is unclear, but it is very simple to apply and results in substantial speed ups for the 4 and 6 connected problems, a minor improvement for 8-connected, and is readily compatible with the multi-label approach unlike block based approaches.

4 and 6-Connected CCL Algorithm

Here is where the phantom label technique shines. It's a bit harder to find 4 and 6 connected algorithms in the literature, I assume because many of the techniques invented for the 8-way problem, such as the Union-Find data structure for the equivalency table and run-based approaches, are applicable to the simpler problem. However, the SAUF decision tree approach was lacking as every pixel required a unify call in the 4-way problem and two in the 6-way problem.

Fig. 5: 4-connected mask modified to include phantom label P.

P b .
a x .
if a:
    x := a
    if b and not P:
        unify(a,b)
elif b:
    x := b
else:
    x := new label

This gives a decent improvement on the order of 10-20%. If you're lucky, you might not incur even a single label merge operation. In the 6-way problem, there are three phantom labels that can be exploited and the improvement is closer to 50% on our data, a fairly substantial amount. Again, with luck you might avoid any unify operations at all.

Fig. 6: Mask for the 6-way problem with phantom labels P, Q, and R added.

P b
a x
. Q
R c

You can even use multiple routes to propagate information if a label is missing. For example, if path (a,P,b) is unavailable due to a missing P, you could potentially transmit information using path (a,R,c,Q,b).

Four Pass Algorithm

We introduce two additional passes over the image label prior to running the two-pass SAUF algorithm. These additional passes are used to collect statistcs for optimizing the SAUF passes.

Estimating Provisional Labels

The first additional pass is used to over-estimate the number of provisional labels generated by the first SAUF pass. A better estimation allows a smaller allocation for the Union-Find datastructure. For some operating systems, the reduced size of the allocation and improved caching recovers more time than is spent collecting statistics.

This can be computed by counting the number of transitions between labels along each row of the image. This scan is easily written such that the instructions can be vectorized to minimize the cost of the scan. The number of transitions is guaranteed to be larger than or equal to the number of provisional labels as all provisional labels are generated in this fashion and then reduced by stealing a label from a neighboring voxel.

A hierarchy of estimators can be written as:

0 <= provisional labels <= X transitions <= static estimate <= voxels

Binary images can also be estimated statically as voxels / 2 for 4 and 6-way, voxels / 4 for 8 and 18 way, and voxels / 8 for 26 connected. For multi-label images, the best static estimate is voxels as no assumptions can be made about how labels connect to each other (in the worst case all eight voxels in a cube have different labels).

It is also possible to check XY and XYZ transitions to get a tighter bound, but in experiments, the amount of time spent checking those directions exceeded the benefit obtained by checking the X pass. Often the X pass alone results in factors as high as voxels / 100.

Estimation of the number of labels also allows aborting processing before the first SAUF pass in the case of an all background cube.

Estimating Foreground Location

The second additional pass is estimating the location of the foreground. In the literature, this strategy is sometimes referred to as a "one-and-a-half pass" where the foreground location is computed during the first SAUF pass and then used to skip processing of background voxels during the relabeling pass.

Here we perform this check up front so that it can be performed minimally. Instead of integrating the calculation into the first pass which could force some computation on every voxel, we scan each row from the left to find the first foreground voxel and then scan from the right to the find the foreground voxel at the end. The results are tabulated in a uint32 table of starts and ends to each row of size 2 * sy * sz. This ensures that the volume is scanned at most once, and most likely much less if the shapes fill the space reasonably well. Then, both passes of the SAUF method scan only the part of each row indicated by this table.

Certain shapes and distributions defeat the efficiency of scanning only the starts and ends of the row (such as random images or an image with foreground on the start and end of each row and nowhere else). However, for a great many shapes, this provides substantial efficiencies and minimal downside for a dense multi-label image as only two YZ slices of the images are scanned before the table is completed.

Early Abortion Points

There are three locations in the algorithm at which further processing can be aborted early without changing the result.

  1. After estimating provisional labels if zero transitions are detected (an all zeros volume). A black image is returned.
  2. After the first SAUF pass if the number of provisional labels is zero or one. In this case, the provisional labels are guaranteed to be identical to final labels.
  3. After assigning final labels to each provisional label in a translation array. If the number of final labels equals the number of provisional labels, the provisional labels were accurately assigned and the relabeling scan can be skipped.

Papers Using cc3d

A number of papers are using cc3d now. Many of them seem to be deep learning applications as instance segmentation is liable to generate touching non-binary labels. Some are in geoscience, neuroscience, and medical fields. If cc3d is helpful to you, please feel free to email us and let us know. We might be able to offer some tips if its performance critical (though we can't guarantee timeliness of response). There are so many variations of the CCL problem, you might be surprised at what you can do.

https://scholar.google.com/scholar?as_ylo=2019&q=connected-components-3d&hl=en&as_sdt=0,31

References

  1. A. Rosenfeld and J. Pfaltz. "Sequential Operations in Digital Picture Processing". Journal of the ACM. Vol. 13, Issue 4, Oct. 1966, Pg. 471-494. doi: 10.1145/321356.321357 (link)
  2. R. E. Tarjan. "Efficiency of a good but not linear set union algorithm". Journal of the ACM, 22:215-225, 1975. (link)
  3. K. Wu, E. Otoo, K. Suzuki. "Two Strategies to Speed up Connected Component Labeling Algorithms". Lawrence Berkeley National Laboratory. LBNL-29102, 2005. (link)
  4. S. Selkow. "The Tree-to-Tree Editing Problem". Information Processing Letters. Vol. 6, No. 6. June 1977. doi: 10.1016/0020-0190(77)90064-3 (link)
  5. C. Grana, D. Borghesani, R. Cucchiara. "Optimized Block-based Connected Components Labeling with Decision Trees". IEEE Transactions on Image Processing. Vol. 19, Iss. 6. June 2010. doi: 10.1109/TIP.2010.2044963 (link)
  6. P. Sutheebanjard. "Decision Tree for 3-D Connected Components Labeling". Proc. 2012 International Symposium on Information Technology in Medicine and Education. doi: 10.1109/ITiME.2012.6291402 (link)
  7. C. Grana, D. Borghesani, R. Cucchiara. "Fast Block Based Connected Components Labeling". Proc. 16th IEEE Intl. Conf. on Image Processing. 2009. doi: 10.1109/ICIP.2009.5413731 (link)
  8. L. He, Y. Chao and K. Suzuki, "A Linear-Time Two-Scan Labeling Algorithm", IEEE International Conference on Image Processing, vol. 5, pp. 241-244, 2007.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

connected_components_3d-3.20.0.tar.gz (761.2 kB view details)

Uploaded Source

Built Distributions

connected_components_3d-3.20.0-cp313-cp313-win_amd64.whl (531.4 kB view details)

Uploaded CPython 3.13 Windows x86-64

connected_components_3d-3.20.0-cp313-cp313-win32.whl (589.0 kB view details)

Uploaded CPython 3.13 Windows x86

connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (4.2 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ i686

connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.0 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

connected_components_3d-3.20.0-cp313-cp313-macosx_11_0_arm64.whl (703.7 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

connected_components_3d-3.20.0-cp313-cp313-macosx_10_13_x86_64.whl (806.4 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

connected_components_3d-3.20.0-cp312-cp312-win_amd64.whl (532.7 kB view details)

Uploaded CPython 3.12 Windows x86-64

connected_components_3d-3.20.0-cp312-cp312-win32.whl (588.9 kB view details)

Uploaded CPython 3.12 Windows x86

connected_components_3d-3.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

connected_components_3d-3.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

connected_components_3d-3.20.0-cp312-cp312-macosx_11_0_arm64.whl (707.0 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

connected_components_3d-3.20.0-cp312-cp312-macosx_10_13_x86_64.whl (809.7 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

connected_components_3d-3.20.0-cp311-cp311-win_amd64.whl (550.3 kB view details)

Uploaded CPython 3.11 Windows x86-64

connected_components_3d-3.20.0-cp311-cp311-win32.whl (598.5 kB view details)

Uploaded CPython 3.11 Windows x86

connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (4.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686

connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

connected_components_3d-3.20.0-cp311-cp311-macosx_11_0_arm64.whl (711.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

connected_components_3d-3.20.0-cp311-cp311-macosx_10_9_x86_64.whl (802.5 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

connected_components_3d-3.20.0-cp310-cp310-win_amd64.whl (545.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

connected_components_3d-3.20.0-cp310-cp310-win32.whl (598.6 kB view details)

Uploaded CPython 3.10 Windows x86

connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (4.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686

connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.9 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

connected_components_3d-3.20.0-cp310-cp310-macosx_11_0_arm64.whl (711.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

connected_components_3d-3.20.0-cp310-cp310-macosx_10_9_x86_64.whl (801.6 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

connected_components_3d-3.20.0-cp39-cp39-win_amd64.whl (545.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

connected_components_3d-3.20.0-cp39-cp39-win32.whl (598.6 kB view details)

Uploaded CPython 3.9 Windows x86

connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (4.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

connected_components_3d-3.20.0-cp39-cp39-macosx_11_0_arm64.whl (711.4 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

connected_components_3d-3.20.0-cp39-cp39-macosx_10_9_x86_64.whl (802.0 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

connected_components_3d-3.20.0-cp38-cp38-win_amd64.whl (552.8 kB view details)

Uploaded CPython 3.8 Windows x86-64

connected_components_3d-3.20.0-cp38-cp38-win32.whl (602.4 kB view details)

Uploaded CPython 3.8 Windows x86

connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (4.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

connected_components_3d-3.20.0-cp38-cp38-macosx_11_0_arm64.whl (712.3 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

connected_components_3d-3.20.0-cp38-cp38-macosx_10_9_x86_64.whl (796.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

File details

Details for the file connected_components_3d-3.20.0.tar.gz.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0.tar.gz
Algorithm Hash digest
SHA256 476e7ef3bffc104c7df8319ed92054f62f8da1f9b09666da1947164b8b20e304
MD5 77f3783abab6669197636f6737935752
BLAKE2b-256 97c9fcf507a14a7ea8f8fd1f127a8d197cdb02c73d79ae1ac232e93d95371127

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a27fd7a968e7b5958994a96c261d33ca2b69d6c61797f103517633c1e131014c
MD5 ad53c1c4be0428caf48874f4c7e3d502
BLAKE2b-256 9db0310021e8d1e22c56f357be504fa72ab6dfeae65ace7b79fb80ad7dad0e2a

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp313-cp313-win32.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 04c193dc7bb4b29f283144351dcee8a2a63aeeefba3dc2295aae5ce963181f14
MD5 62e06728357b769b6595dee81c58e91b
BLAKE2b-256 a6935f80eb05123565817043e224acc0d0471f3a04bf6d8095b1b4e66875def9

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f283786532f7d5f54876ac66394496f16105032b343d21c7e89adbe1af5d505d
MD5 9f28c43fbfd024310878732bdd39e317
BLAKE2b-256 cffd7ed212fd17c2db24738ff3f0c4c140e8b95323f7d25524a0e766eb57aa97

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6e0bc3a6b8e2033ee2f60965e01770031d36150e97ccc56e13060529c0171ffa
MD5 13717dcff7f47da244b5eddb439402f5
BLAKE2b-256 55ed869106b79471eb0bbc8db829eaa9dbb3fcf1c28b2fb088ddff26b2b01a9d

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2e7d29a4a2965e3ac9a308210302ab2c77c055d3bcafbde764b00a6eb44f6e14
MD5 1ab46ff6ae5ceed16ec55b37af4ede4c
BLAKE2b-256 858c245bf2eb0a48e59d852643a277e947ab60bc89205229aafdeb2de493cd3b

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4a3e4c5f6a83aa55163ccda9e21706208c7bd9d93be97a62024f1f196f0a5062
MD5 fa4d1453c686c577c58b8b9e5345453e
BLAKE2b-256 e0295b9198ca4f9c487cda1e984cb984401aeeb914c1c814a115a9138260d184

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ebc5c2d3190096a68bd85445c6c2f7b19a9662c526d6f3d25883f33e3ce44ebe
MD5 8e3bc08c831a3842dd730ea4d0f5ab4c
BLAKE2b-256 b7252bd6da7e328aa82d0dce779afd87cccfa562220e7f1efde880fa29d636e1

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 19728ec6ee6fa1e11649cd18502fdce0652313ac7f95345e66a711a31cdc41d7
MD5 e4947dd082e5325296ba2bd86972a0cf
BLAKE2b-256 c0c51160c468689c84e8d906c184ac0c53820241666993b9adc9c5a409bfb662

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp312-cp312-win32.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 ce3a41617a1b2443332af990ccf9215177f1f7a279707b79ef31c81a64455bcd
MD5 ca123f024835b1a2cd5fc8d1e0548b8f
BLAKE2b-256 a13cef3cff99a14ed8de30402c887591dbe7e911d5179d0a42fb2dd0bf8c3418

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 13127186feb562740c892e3948a7d454b98b4d42b8954ae35d5b277f7ac912b2
MD5 23043750016b8cdbbd94cc11a05d3e85
BLAKE2b-256 846533f7e3ecadc02a83901239053c54192181a87675575d64b1c4bbf2af04b7

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c1a178d0e092b251d75c9eff2bb46a2d9f884587d775b22dc4bd186427f51fbf
MD5 de906f00b9d6e70e6b1a65b3723442e1
BLAKE2b-256 47deb0ff48a0ba4bdd818be53483f69666a826a1025bd647afc9c0c89d0efc50

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 468afc75cb2ecd6c0b0459a0a7cad4806f098ab2dad9d6474d78dd2e14a7d551
MD5 d42aaa749467c30182d981d76ca55a8c
BLAKE2b-256 b5c3492f2efc47c958d544241511eecc3c9b8ee2fc955b4d806e2f34c0891509

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 311f74743a9e144abf2897b4022b1568367222a7c966c30af908323350d59630
MD5 5d8b8ef4f3aa795c612a05c43117bfb0
BLAKE2b-256 413ef264f2e42a021f0ca6c2ec6704538db2c1f4c1989cfa09eebba0e3e0cd9e

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2e6028cd314974d544f183208a1881e37816c1a588afbd15d290526ed64202f7
MD5 2867731c102d717523bd0582e6892978
BLAKE2b-256 b9c857e7dda797395c7e3a2e769e72a097da1df1af3e7e6991749fe65a221be2

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp311-cp311-win32.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 336ea14ae3d73d01ef067bcb85e8d17a23df2feffd37482f822c2efe10f0cde7
MD5 8233a06f2c32ad24293ad220aa0e8e05
BLAKE2b-256 66ff9c68ce50242d6e07429fe93918b3e1c0112cfd287bd0adf26c1e24298ad8

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9a138495b69cc113cde4625adfe3abc53d008e353e64a4cf6e3a24c6adde7209
MD5 19240561e5ddb8b2c9f243725f673f09
BLAKE2b-256 350f48cf10f6c80a65e8738f8c370d97d07c21028b9987471b2277ba0f266aa2

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 39eb13012bcf8813322d531d7ec06ffb9ceb80430dc5d4eacc07f460fcf1e7ed
MD5 7cb7e68c54e998634f70fd557529b6a9
BLAKE2b-256 69d570ff8e1a1cbd6f31bcbdd786aa3ccef9f2a1390bc2712442d8124127b4cd

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 54776a13ce438c5dd490bcb7a6ec05fd47b08889c7753c5663d97a666e65f4a3
MD5 ebd1a8d27925996d2ae45a9985f57c37
BLAKE2b-256 4a3d29faf71b64017d2ee7666190376ea56906dd0ca7640b14dd11c38cd3ddef

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2dffe4c5bd8051538bf7c605488e052b8735da5f5385169e9281ed60ee2a2c6b
MD5 df320ceea77d00b64f17f4c4e809bab6
BLAKE2b-256 e3ccadbe3c4f4dfadc2a45f36e643cbfdc5525c463c101971610c16005ed0592

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 527a2cbf00f59cd126e7d36654d4f7d92418722f879b5c27fc1b433df1503410
MD5 01dc1c3d6ddab89e2cbeb586d3062cb1
BLAKE2b-256 51f939d766ad033da98554e118229222f456206dfa28ba523c2b0680ec3161a4

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 618f63556cdf7a46ad967170541beb99f179dd85210c8b567abffab6b2758801
MD5 47c2ac53b88b066d1bf314f8e58f374a
BLAKE2b-256 751bca7ae081ab24d7d9e2460aa9cb58097e62ba033c692d7856334aedfdf22b

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp310-cp310-win32.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 e112755af59114db537f9e20a7f30d78b436857451777fda715a6a8bc0528fc9
MD5 ca130b9b7cc292badb8c8c071746f76b
BLAKE2b-256 5229704aa4c2aa7cb03240d40571cd734b71582bfac32bdd84a8e6b43d78a63e

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6f4a20d3f465b63b0d4cb274766a368d42ba139af3c728f72bd6ee581aca4d0f
MD5 e6ff6d83b8b036ef64f86a507327565e
BLAKE2b-256 1c1671e78d7ff9a16fc821937e41a84e60c0c9379fcf4cf16c62baa0076e0bf0

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c2b91ec2d8e59f1771e6e17a94eb368ef16131697adcadde6e611b4edb621763
MD5 c4607895026727f5a2b6a8caf7c16af5
BLAKE2b-256 fde1832b81a339f5b5458f9774726b118645a2b0973caad9065891f8594df460

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 31d6fd279e10d223623df79e5c5de2e950f4f6e3f68c3d30aa336748c6b5873b
MD5 165524924eea7aedbeb826aadd8035c7
BLAKE2b-256 a29e8af255b7ebfd7881c8b62fe653b0116ae6dfbe30dd314226945f86bef39c

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b186174dc446a6294674b0ffb25c5973a4d8a2f73ab70b64627e0f8e0803ae1f
MD5 0f48fa79aac9f10cd04f0a5e88479a92
BLAKE2b-256 9a6b1fd4afb50dd56eff9eca302aa01feb300f2d2afa9e6535b6594a04bd9088

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fea05f867ab5f0c80f3bfd86c12c7310a0febee5c93e55b3875f84d4de0f779c
MD5 c270ee319e2167fb42586aff58aba0ec
BLAKE2b-256 62f9c37f51137a7bf4f51ef1ebfe2d7d4a145eadf16aaf3e8dc74043420fad57

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c16abbd8cea00aae0a38d00094bcd32ebcb958d2d0fe6635e36faa049b530b77
MD5 07ab592d2c7703574ef687f09163dd67
BLAKE2b-256 73df7d4deb8e2bdd6d73181f7e4c38b8e472d831909d921d60279b28071073cd

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp39-cp39-win32.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 a6a619f4f3d80f151d9f37a48c26e1dc4654f1c3dd079b15d55594abd7c19d5d
MD5 61ebab4d065134810b64afe75ad90452
BLAKE2b-256 e5b48f8a8119bea078f766c0ba77f6f4e88123c39e5b368f537ef9a3a0f7d06d

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 596d55974dd0ff8e56227c1f81f599080e5d3e81f34445a19c3c25d81a4af278
MD5 36b624cbd35860ffef9f5d7085dca75d
BLAKE2b-256 45ebca30e710e9423099a105ea6d43e96f8587c53d801f820abdd7ffa600f391

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ab03de650ea06e432dbded823847b947c03d1f07fd4a568ec5e85824ba8fe582
MD5 dace97b758d48e8801e007ad19b02ee8
BLAKE2b-256 ca5343d9ac23708adb58d0d4053b31f69b28d1ceef3f175aca3057eb78fde9b0

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6b976c8e8f95a12849eef9461ad562e5dfbb5798ed3238153ed060b28a2924c0
MD5 d00c0d1ad27c172a625f7ae126039f9e
BLAKE2b-256 6879cf8b98c7227bce2a0dad6ef2681e1301b4f045499d5e1545b49229398d2e

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 066f714b24102f6d91f2db9573d05b3221c52d22c3c8ec371fb1a7fbe1cc3c8d
MD5 7421dfd42aca545e81fbf6d2ef906a81
BLAKE2b-256 41ea88c0440eb6f1f50b05e08cfe133cb880c69fa918a960b8ae4d24236c6b86

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 05fd7a8467cd4ccda399a42c6849344c0b610c5db6252e75df0e359fa1920e89
MD5 da1502a6f8cbc7881c4a47364eefda4b
BLAKE2b-256 36876f8817ac53a37e58bdfc63b98f4f69e330ccecdb59c68d0e069e1c7432bc

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2bb8796eadb5583eb5531d0fd99d0684192eac58b42204c2cbdfe62eefb76967
MD5 231453bfccc3a5c2f333cea8a688a507
BLAKE2b-256 10f2a84caf173a95f3186318fb47caf31f78201c1a1fec4e17f43c6c43018a16

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp38-cp38-win32.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 8e4d98439271d85fbc6ca89b9c86b5013a5e844d2d171d5b48fee537904feadb
MD5 1298463e08cc23ca65ba0472187b20df
BLAKE2b-256 142bc69b37c6cf4cc61f8b1ad901a20c1328f268798b9669f58cbe604ab95bab

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b30f90f7b40438d2969b77b3efee38cb9cd8b6384f77aa1ae42f87cac992953e
MD5 74ed7f5b0c92e4a62fa064552032380e
BLAKE2b-256 14fab29cbe4884eb1eb6ddc8ed8d789b48841bc3bcda219428cff4c5dd6cc27f

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c4373ff737216c88fcd3fc56d10511130b5cc0c3e7753ffeeecf160130dae333
MD5 3ae3775487b2319f99c31c727683f112
BLAKE2b-256 73731ab412a0ccc763d3b55b4213f955c7fcdde33396de16cce860dcb8b1843d

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f2a3ace2c9f92c8151dcca3acc82403d1fe64838922b86450f69e867a1f15897
MD5 60b8c0b60c69361a0d5ea689dd00b470
BLAKE2b-256 6d06f7e40646b7fc37721c9822f7a1b10794a3876b5b9bf26a1e4e5f946b8d1c

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ef4083eaed0a59cc2309daeff2dce39f31bfbba99ed5bec73f85816344d25b40
MD5 60db2bc0c0ab014e1ae9eba74f60ced3
BLAKE2b-256 927ff588adcd970d04c1fe1106751bf631c235d9db5a59176b5c71158d5d8a09

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.20.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.20.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 07f76c8d7a24dd40f7cd6ba0d2bfe736938f03082acff6c14efad7b347d06317
MD5 e79109fd78c200c06d30928a922f4af1
BLAKE2b-256 8a36036ab4516723d0b50773f10c629456d67ee3aa4df3e3eb282e2b1ba7bc2c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page