Skeleton, saving to VTK format¶
This example demonstrates determination of a line skeleton of a binary image. The skeletonization process reduces all foreground structures into their approximate centerlines.
The skeleton can be traced into a graph structure, where skeleton branches are edges and their intersections are vertices. The traced branches contain information about the branch, e.g., its length.
Finally, the traced skeleton is saved into a .vtk file. The generated .vtk file is compatible, e.g., with ParaView:
def skeleton_vtk(): """ Creates skeleton, traces it to a graph/network structure, and saves the skeleton branches in a .vtk file. """ # Generate a simple image for demonstration geometry = pi.newimage(ImageDataType.UINT8, 100, 100) p0 = [1, 1, 0] p1 = [25, 50, 0] p2 = [75, 50, 0] p3 = [5, 95, 0] p4 = [95, 95, 0] pi.line(geometry, p0, p1, 255) pi.line(geometry, p1, p2, 255) pi.line(geometry, p0, p2, 255) pi.line(geometry, p1, p3, 255) pi.line(geometry, p2, p4, 255) # Save the geometry pi.writeraw(geometry, output_file("geometry")) # Convert geometry to line skeleton pi.lineskeleton(geometry) # Write the skeleton so that it can be visualized pi.writeraw(geometry, output_file("skeleton")) # Create images for tracing the skeleton into a graph vertices = pi.newimage(ImageDataType.FLOAT32) edges = pi.newimage(ImageDataType.UINT64) measurements = pi.newimage(ImageDataType.FLOAT32) points = pi.newimage(ImageDataType.INT32) # Trace the skeleton # The last 1 gives count of threads. For images with small number of branches # (like here) single-threaded processing is faster. pi.tracelineskeleton(geometry, vertices, edges, measurements, points, True, 1) # Convert the traced skeleton into points and lines format, as the .vtk files # need that format. vtkpoints = pi.newimage() vtklines = pi.newimage() pi.getpointsandlines(vertices, edges, measurements, points, vtkpoints, vtklines) pi.writevtk(vtkpoints, vtklines, output_file("vtk_test_file"))