Skip to main content

Connected components on 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. 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.

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. cc3d was compiled against numpy 1.16+ and unfortunately, there was a backwards incompatibilty between numpy 1.15 and 1.16. You can either try upgrading numpy or compiling 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 26, 18, and 6 are allowed
labels_out = cc3d.connected_components(labels_in, connectivity=connectivity)

# You can adjust the bit width of the output to accomodate
# different expected image statistics with memory usage tradeoffs.
# uint16, uint32 (default), and uint64 are supported.
labels_out = cc3d.connected_components(labels_in, out_dtype=np.uint16)

# You can extract individual components like so:
N = np.max(labels_out)
for segid in range(1, N+1):
  extracted_image = labels_out * (labels_out == segid)
  process(extracted_image)

# We also include a region adjacency graph function 
# that returns a set of undirected edges. It is not optimized 
# (70-80x slower than connected_components) but it could be improved.
graph = cc3d.region_graph(labels_out, 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.

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

Algorithm Description

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). [3] The description below describes the 26-connected algorithm, but once you understand it, deriving 18 and 6 are simple.

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.

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. b, (h | g, i)
  3. h, a, c
  4. d, (f | c, i)
  5. f, g, a
  6. a, c, g, i
  7. c, g, i
  8. g, i
  9. 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]

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)

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-1.5.0.tar.gz (393.4 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-1.5.0-cp38-cp38-win_amd64.whl (199.4 kB view details)

Uploaded CPython 3.8Windows x86-64

connected_components_3d-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl (198.1 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

connected_components_3d-1.5.0-cp37-cp37m-win_amd64.whl (204.8 kB view details)

Uploaded CPython 3.7mWindows x86-64

connected_components_3d-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl (197.0 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

connected_components_3d-1.5.0-cp36-cp36m-win_amd64.whl (204.8 kB view details)

Uploaded CPython 3.6mWindows x86-64

connected_components_3d-1.5.0-cp36-cp36m-macosx_10_13_x86_64.whl (196.8 kB view details)

Uploaded CPython 3.6mmacOS 10.13+ x86-64

connected_components_3d-1.5.0-cp36-cp36m-macosx_10_9_x86_64.whl (196.9 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

connected_components_3d-1.5.0-cp35-cp35m-macosx_10_6_intel.whl (362.1 kB view details)

Uploaded CPython 3.5mmacOS 10.6+ Intel (x86-64, i386)

connected_components_3d-1.5.0-cp27-cp27m-macosx_10_14_intel.whl (196.6 kB view details)

Uploaded CPython 2.7mmacOS 10.14+ Intel (x86-64, i386)

File details

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

File metadata

  • Download URL: connected-components-3d-1.5.0.tar.gz
  • Upload date:
  • Size: 393.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.6.6

File hashes

Hashes for connected-components-3d-1.5.0.tar.gz
Algorithm Hash digest
SHA256 e96551023465f05ba7ef4ec9b0ef67bf8f0162805818c9fdad29c118054a3959
MD5 2c1d3bd38beb24d58b762fb54189a77b
BLAKE2b-256 4743906b3626ebb3fad4bf8aade7c00fc27c8a1a88dfd88e3cb46263700dc7da

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-1.5.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 199.4 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/28.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.4

File hashes

Hashes for connected_components_3d-1.5.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 704e1ab5b39a8c3effca27f22c20620f02591c4d4af9293b50b1de6d3621c14c
MD5 09b2cbae3079e66c6d96fc74b2f98188
BLAKE2b-256 9d7c06452e3a0f51dcd45241a4af3bdddcdf14e3b707b04cb71197c58853a06e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for connected_components_3d-1.5.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3efee2d338423b8c1b7629eb136cbf3d4d9f39e90958a8ea043184d3f54c044a
MD5 69e2e65bf6c3b98eb648c62a042dcd95
BLAKE2b-256 2b9f0ab4176586ff91cf80d5627e0b3b37aba093b0bd9f21d5ba08bb1e86214d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 198.1 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-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6176ddf5518ff73b14a3eaecd8afa723c617bbd7f160ab3ae578b8fd623b77d3
MD5 3aaf52f97572cacf974d76c20c4f8d79
BLAKE2b-256 7da3a08d83a22999b1f5764ab3682b5f035922d02ba52ed2a3b7f0be705322ed

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-1.5.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 204.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/28.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.4

File hashes

Hashes for connected_components_3d-1.5.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 fe9c5e3b00eaf97b390c1ce77612cc6d72df83ccaf99e7210a9e77b3687782e9
MD5 398bb3b693da98c2403af1186dc9aba1
BLAKE2b-256 ade049b7c603ff088040695b095c2a0dd6f708488eb725252bd788d7b41a11ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for connected_components_3d-1.5.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8eff5dac15443ad6bd854e9e28fbee5703e73d7ff320b06b33a0c7038c3cf505
MD5 bd4c2b001ba3233591ae628d88be700c
BLAKE2b-256 97faecfd57254f53e245887542a79135f1d1e611540be4ecff1cdbb88536818b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 197.0 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-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0aa5308de82b1f35fc2fe65bf8288f610373f9946e61253df11ab17ae4c34c92
MD5 97aeea23f8cb92d9c3c355d7fbfc9462
BLAKE2b-256 157d1667bec6557fce370b98e01713639ca0addb8ccbfada7bae6c5a52cb54b8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-1.5.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 204.8 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/28.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.4

File hashes

Hashes for connected_components_3d-1.5.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 0e29138c00754c4e60ec6d5ea35d998d2c24cffee1d4534bc85186e4fc5f416f
MD5 5a7c5bbff30a3d52bc268b54e0728479
BLAKE2b-256 6a9dc072e2ad50b15b1c003916940b61b1e85e5a5c27e8b259ab843afef1cfd4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for connected_components_3d-1.5.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cf251d71f4543ebb0a36414b7f4f8cc7c8732754e2cba49e7b9563062f3dcd80
MD5 e38e04cb6e10709f7be85baa98b97080
BLAKE2b-256 b4b8b6824e167315b157179c1209331a373c90bc6f21c589c8823ada1989b0b7

See more details on using hashes here.

File details

Details for the file connected_components_3d-1.5.0-cp36-cp36m-macosx_10_13_x86_64.whl.

File metadata

  • Download URL: connected_components_3d-1.5.0-cp36-cp36m-macosx_10_13_x86_64.whl
  • Upload date:
  • Size: 196.8 kB
  • Tags: CPython 3.6m, macOS 10.13+ 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-1.5.0-cp36-cp36m-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d1228597c77b871d4bc7dab00a368c9e5809d3bc5397436c290d5ec3d8fd92ec
MD5 da3ebeb7e392f95e1fd189464fd6d35e
BLAKE2b-256 977ab81529eb425073c0b72e58404e17fde9783bd706ca6485e83f027faca4e2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: connected_components_3d-1.5.0-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 196.9 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-1.5.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d14d6c03a97bbda86e055513fc8cb1b66e2673fc1eb8532950099e0607bde93d
MD5 ebc4161ff85a03af6266ab87b2cbc744
BLAKE2b-256 86aee9f1557b158b945e7d0126d7dad2ebe46a107d4df28ece3af53af34c3be6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for connected_components_3d-1.5.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ee3b712076cdedab243d120357f4acb45d99bc1e1e383674b5c74710fe4cc2a0
MD5 08abe5c4d5ff0bd65fb9942eecfeda97
BLAKE2b-256 089a6d5b2faf4693093228322f0b1229a6b63886245caa48604788ed2918c954

See more details on using hashes here.

File details

Details for the file connected_components_3d-1.5.0-cp35-cp35m-macosx_10_6_intel.whl.

File metadata

  • Download URL: connected_components_3d-1.5.0-cp35-cp35m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 362.1 kB
  • Tags: CPython 3.5m, macOS 10.6+ Intel (x86-64, i386)
  • 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-1.5.0-cp35-cp35m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 805b25b686639310f4e92ae148b4dbca72662f981b8f9af48d762a74418f5952
MD5 949eb9d0a6cdeadbdc5d79a6f888667a
BLAKE2b-256 8dcd21f9519d45164981ffc4ab7c7771ffa485e204aaf87f0aee92b1a78f5e91

See more details on using hashes here.

File details

Details for the file connected_components_3d-1.5.0-cp34-cp34m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for connected_components_3d-1.5.0-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 77718f2d693b4465f5a03685cb72ae63babcdcbdf213595ca652f298a5641a52
MD5 6a13a80b58daea40de53b9f850fe9e49
BLAKE2b-256 fb7a25d712f0706bab96789be0cc98f0a1c6d3ed45ac40ce195fa11d7aeb77ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for connected_components_3d-1.5.0-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7d8e545b0d34244e185d61b203c05e13a053cf1d7aa02df2c4ab21e043c1263e
MD5 2de56d5beb90d26266d0f7e0b346baf8
BLAKE2b-256 c00d3a6c2fdc61342dc485d9e2a58e51f30124eb863dfb4c2187e84cf7f7e024

See more details on using hashes here.

File details

Details for the file connected_components_3d-1.5.0-cp27-cp27m-macosx_10_14_intel.whl.

File metadata

  • Download URL: connected_components_3d-1.5.0-cp27-cp27m-macosx_10_14_intel.whl
  • Upload date:
  • Size: 196.6 kB
  • Tags: CPython 2.7m, macOS 10.14+ Intel (x86-64, i386)
  • 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-1.5.0-cp27-cp27m-macosx_10_14_intel.whl
Algorithm Hash digest
SHA256 5f020857256857a70ed01589cd50cd6d16c832373a2a6c0ed5edbb79b537b35e
MD5 eed24d68fd5df8bdc6b6a20f4c2f292c
BLAKE2b-256 e12254d8f32c3d5221ffcebd4168ba8a42e07641cb6edda19bb5e9a878964a9a

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