Skip to main content

Connected components on 2D and 3D images. Supports multiple labels.

Project description

Build Status PyPI version

Connected Components 3D

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 can be used with 2D or 3D images.

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

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)

# 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)

# 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)

# We also include a region adjacency graph function 
# that returns a set of undirected edges.
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)

If you know approximately how many labels you are going to generate, you can save some memory by specifying a number a safety factor above that range. The max label ID in your input labels must be less than max_labels. This option is only recommended for expert users.

labels_out = connected_components(labels_in, max_labels=20000)

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
);

#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 Berkely 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 Porcessing. 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 EEducation. 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.1.0.tar.gz (521.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

connected_components_3d-3.1.0-cp39-cp39-win_amd64.whl (245.3 kB view details)

Uploaded CPython 3.9Windows x86-64

connected_components_3d-3.1.0-cp39-cp39-win32.whl (252.2 kB view details)

Uploaded CPython 3.9Windows x86

connected_components_3d-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl (344.9 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

connected_components_3d-3.1.0-cp38-cp38-win_amd64.whl (248.2 kB view details)

Uploaded CPython 3.8Windows x86-64

connected_components_3d-3.1.0-cp38-cp38-win32.whl (254.8 kB view details)

Uploaded CPython 3.8Windows x86

connected_components_3d-3.1.0-cp38-cp38-manylinux2010_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

connected_components_3d-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl (337.9 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

connected_components_3d-3.1.0-cp37-cp37m-win_amd64.whl (240.8 kB view details)

Uploaded CPython 3.7mWindows x86-64

connected_components_3d-3.1.0-cp37-cp37m-win32.whl (247.5 kB view details)

Uploaded CPython 3.7mWindows x86

connected_components_3d-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

connected_components_3d-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl (333.7 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

connected_components_3d-3.1.0-cp36-cp36m-win_amd64.whl (240.7 kB view details)

Uploaded CPython 3.6mWindows x86-64

connected_components_3d-3.1.0-cp36-cp36m-win32.whl (247.5 kB view details)

Uploaded CPython 3.6mWindows x86

connected_components_3d-3.1.0-cp36-cp36m-manylinux2010_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

connected_components_3d-3.1.0-cp36-cp36m-macosx_10_9_x86_64.whl (346.8 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

connected_components_3d-3.1.0-cp35-cp35m-manylinux2010_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.5mmanylinux: glibc 2.12+ x86-64

connected_components_3d-3.1.0-cp27-cp27m-manylinux2010_x86_64.whl (1.6 MB view details)

Uploaded CPython 2.7mmanylinux: glibc 2.12+ x86-64

connected_components_3d-3.1.0-cp27-cp27m-macosx_10_15_x86_64.whl (331.7 kB view details)

Uploaded CPython 2.7mmacOS 10.15+ x86-64

File details

Details for the file connected-components-3d-3.1.0.tar.gz.

File metadata

  • Download URL: connected-components-3d-3.1.0.tar.gz
  • Upload date:
  • Size: 521.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected-components-3d-3.1.0.tar.gz
Algorithm Hash digest
SHA256 897f0841e22ca4cd82a121e57f74e1edd44c16e092b2648ceff82d9cf61d6705
MD5 84e350c9f1b3ad3204d8f2ca9adf310b
BLAKE2b-256 f87e01c48631cdd87b5e84775b935d8da7d906a87406ed0164f47e1803c817ea

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-3.1.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 245.3 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 c66271c6a14982557570a9bc490fdf30b67e66c174cbae82adeda5f9f4a272ae
MD5 d33e45a4189fb8ad77a652e18b719685
BLAKE2b-256 a2b7562ada5fd4e5ec76341861e12d3bdbb7af1c72fe269829768b7c56f5ffe1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-3.1.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 252.2 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 02d35f199b15ae0c169ca204276ac91ad2a766a5a7e88b24abbf1a3d1774e0cb
MD5 38ea3847423f260c2807a58fc533cc73
BLAKE2b-256 67c6b7cf224d1063d444a10f23d793abdbf932354c2df6b34e1787677c8ad0ca

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 10c6b77dc1130c5272e42ee1c32646b904e081efa127b28276b4217d2034cd96
MD5 c6ff46bfa9b2669c41ae447ea17f8e19
BLAKE2b-256 49c1938d003f82b466ac4368e5c9b1a3808f29c85f4c5d66248d00d09c0019dc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 344.9 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 20ae83353dbfbf0f74fd7f7bed5eacf0d93a64aa65b7cb397577253615b9f9ee
MD5 0c166610cf85d37cecda45f296d8dc32
BLAKE2b-256 d61432d02c0a46213ff3a6dcbe9da8ac051c8d0f0b2dbc995c16559645fa156a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-3.1.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 248.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2bc27d99c11766838f39b594b9c85bed9c2229eeb49b4d4598fae3a6af7497d6
MD5 829ac55a279018faab454500706a4530
BLAKE2b-256 740e5172b3a5503217d9f751956f0aaeaac34b22d98db72460dc5e16b98ef57e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-3.1.0-cp38-cp38-win32.whl
  • Upload date:
  • Size: 254.8 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 cc8ff56a99cfbdd5e2c830f328f2a89b6aab2ceb356f2a8609c4b49a1636cd74
MD5 b243421adda15b363adc648e74e0c973
BLAKE2b-256 c0dca6ca8c2ce0ee9eb0f143178a71d72894745d14f25903d0b39ef2d0a28bc9

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 765992995a32ef3d2ecb748d1533546189b465aede336ddd1e423cc8c88d18b5
MD5 44921460d2a14975c832f1a55af3fe37
BLAKE2b-256 cf2f94af8b8b0809ea3212bf372fbf6671916005701d7deea68fd51ecae66571

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 27cb55118eb9200f53fe3256ebcef1c3c1fd820b81ad0ed03f8ab79ace0f065d
MD5 23fc79f5e9ba6e4b503b4b38c3d22234
BLAKE2b-256 cd5ae7e4f586bfda73d5499fd03ed9ca8ac25933cb43769fcf1aa1d5aaa9f043

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp38-cp38-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 175925645cd4514b85fad9a2867d3be1f8211b43025127e010ff0ec478aa3e5c
MD5 01bb1b4e16e43918e0c6ce3ed269d496
BLAKE2b-256 0c91aa3818363f259e32acc3bd70a122eeda2b20f4f0d9f2b690cae1e7346e8d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 337.9 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6bd0a1a0f7568f15caabfb4a064bcfa689925eed63914febca86c069ef044c8b
MD5 af3502bf8540cbff5f78a717016160b4
BLAKE2b-256 fb5712c12ac32109a111a64a7ea957c570072ee577c8afac4c3ac2e058803056

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 240.8 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 5cfa63fb63104814e0665a7afc8aef0e2dcd5445692233a02c22ed156a37614d
MD5 be2092a214269f027adf152e7ce3e032
BLAKE2b-256 b46ebb9cecee0f7932625ad66e9e9d18d47b17eb279e20ee9ba39c1091df1b45

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp37-cp37m-win32.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 247.5 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 7fc11fa320d873ba1d72bef0899debc800745be0c93a16a01c179c33f8dfaab5
MD5 c6129f4af27a822f436f538f2b2b758d
BLAKE2b-256 67677948d77aa90f31624504f61a1a44d6cb6a3e4924d0a72e0f9d7bfc0f79c8

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 20ecaa71dcb3b8a344ec61b2cd0a5ca475145bd20f1f29aa81bb94fd8dd56b18
MD5 f8e9d143865e3c4185acfd9d1f2f8123
BLAKE2b-256 19b5aad84e07b7ec783f5fcb845bc4c9d3088d67a876403d80132a8cfd7bc766

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 4240a84eb715cfcad809041c35149bc510198584df717b8fcb3ec97e9417cf8d
MD5 c5bca47342ea041c76aa3cdb15f6d95d
BLAKE2b-256 a8d8e7c32ca0e4b80edf35239db0a4aa86e319f48e2695d07ad460c1f7a05015

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bfbd9d405b08188a809f169529fefa35232150ec4ffd5bffeadb491d41d2dc5a
MD5 35af22bd5e5df831f7c69cdb8c50ab34
BLAKE2b-256 72804c0167517ab228e01caeb68cea9604e1e778ab38dbb00886156571988a39

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 333.7 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 633aab8b102495f586641ab684fb527ff70d48f71b75881e61dfd1e5cc3e26cf
MD5 f844e5a2fb160f901af2e0665968a4a5
BLAKE2b-256 aece3095f115c85fe63fb554e56072b3c53eed01afa8dafa0f5fae4bfd28671c

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 240.7 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 a18d06da9e87dbec5f564a96d4e7c0f8a1c299dbd7cd0e251078583a559d35de
MD5 264108fb99db9186742f5b8e3c446fca
BLAKE2b-256 dd18160166d497d0c38d4e8d3f9cfa1363f2638652b123dbfcc1ca0f8ab795e9

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp36-cp36m-win32.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 247.5 kB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 10e8515378ce6b2f3f76b4f0f43fe76a53b741bd4958cc75295fdfbbe6c35c0b
MD5 4d358d46a5f5afba4614e242bcd73d28
BLAKE2b-256 936712eeed3893a786bd9fc13aea95f2af681b1a2d17922aae6fd7e3a7f05427

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp36-cp36m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dbb29a91bd4eb0e6e18f8100e028da6ffe425d779170f4d476bfa45e48e68e93
MD5 775b896264201fba02a847eaa4718128
BLAKE2b-256 e32d664f3fa29c39c72b0e43b8c495242a9a99f214ce519b8bece5627761e5cb

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3ad7c348d3e2c1df0e4fc8d4a154067020f988fca7b2654b5c3491c6de66a282
MD5 06c58703d2d8a5e2da4a317e7ed4b9f5
BLAKE2b-256 cef9e8ea7e905b0e445772c5ac7b5c42f4e6d242284b7bf11899c505893ab347

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 c2a03fc431794ec4949e7c779bd3b0066be1bc0b9e1ac9f48a3bc4988ad7c20b
MD5 ed6c42a2316c54dda5bfa5a427d6487c
BLAKE2b-256 06fc8daa32826a11e9a7b139976d0a24fc29fde860100c79d022f64453a67a2f

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 346.8 kB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 55504f759af2203c3a7f146c08396122001e93cd3547f7f33c50d225a25726a9
MD5 c7795a4b26ceaa89c204652ad9d78077
BLAKE2b-256 e46800e2b96c20ca92669b446c9d0a715a9ae07e9c4b7d5f2ef7f4be6a7c0040

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp35-cp35m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp35-cp35m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dcf39d1ae7ef79388b3fdcec98c4c304b12d2a0eb7c788a0cb48009cfdbc6ee7
MD5 8cc0ed8edcf12410896d379c3f0655d2
BLAKE2b-256 0f5adbfe700c7361237cd5b6730029037acfca7b477d4014f15b46f4b42a441c

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp35-cp35m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp35-cp35m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.5m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp35-cp35m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2101a8614f053db51babeb734915f4cae316921ad5857f83ba6b3cca07e64180
MD5 25bbb3966093bfe9b157a1450a472073
BLAKE2b-256 62621bf6e8fd228b2ea7af64b70fa500881ff1f21b1d0248f17cc310c2d70e87

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9a552e5d8046361f1a1b5b94061442193b84f76152c5b786ec0a4d43ff88adad
MD5 29d9b6cbd49c14b719b82c53133077f1
BLAKE2b-256 9121b00e3ddc5d96f95a84576bd4ab447a39b61b4e7f4c6132487d22a35b8a77

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp27-cp27m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp27-cp27m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 2.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp27-cp27m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 5afada0abd0a17c91a09739c6e7f52d8d7866087bcab864abe417cf771d93eb3
MD5 840f35b864023538d0abfda5a0bb61c3
BLAKE2b-256 9cf7f5f975bfac51d7bb209df61352792d89e159432e76e5f154262efd15e978

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-3.1.0-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 4d742efa7ab44c1584f340d096872ede63cfe0555150b579e45099c1ea0abb09
MD5 365835895415adea1d47c3a5a5ab704c
BLAKE2b-256 10a454db3f58dd3f9b0447fe94874312859cc6a8791964f3f62da11b58cde5ae

See more details on using hashes here.

File details

Details for the file connected_components_3d-3.1.0-cp27-cp27m-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-3.1.0-cp27-cp27m-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 331.7 kB
  • Tags: CPython 2.7m, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for connected_components_3d-3.1.0-cp27-cp27m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 36e98f2c750e541c8976bfd973cf2f526521127e71b3e24e5decaf8a898960bd
MD5 1e3704e56b39887d103f303ba790e6ee
BLAKE2b-256 7699c3a704d630b99658583fefd1d328184e8a5e9f0cfd14196099de4b4a5d86

See more details on using hashes here.

Supported by

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