Skip to content

meshing

Return surface voxels.

Source code in navis/conversion/meshing.py
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
def get_surface_voxels(voxels):
    """Return surface voxels."""
    # Use bounding boxes to keep matrix small
    bb_min = voxels.min(axis=0)
    #bb_max = voxels.max(axis=0)
    #dim = bb_max - bb_min

    # Voxel offset
    voxel_off = voxels - bb_min

    # Generate empty array
    mat = _voxels_to_matrix(voxel_off)

    # Erode
    mat_erode = binary_erosion(mat)

    # Substract
    mat_surface = np.bitwise_and(mat, np.invert(mat_erode))

    # Turn back into voxels
    voxels_surface = _matrix_to_voxels(mat_surface) + bb_min

    return voxels_surface

Pack 2-d array along second axis.

Source code in navis/conversion/meshing.py
355
356
357
358
359
360
361
362
def pack_array(arr, base=8):
    """Pack 2-d array along second axis."""
    N = 2 ** base
    packed = np.zeros(arr.shape, dtype='uint64')
    packed[:, 0] = arr[:, 0] * N ** 2
    packed[:, 1] = arr[:, 1] * N
    packed[:, 2] = arr[:, 2]
    return packed.sum(axis=1)

Parse .obj string and return vertices and faces.

Source code in navis/conversion/meshing.py
422
423
424
425
426
427
428
429
430
431
432
433
434
435
def parse_obj(obj):
    """Parse .obj string and return vertices and faces."""
    lines = obj.split('\n')
    verts = []
    faces = []
    for l in lines:
        if l.startswith('v '):
            verts.append([float(v) for v in l[2:].split(' ')])
        elif l.startswith('f '):
            f = [v.split('//')[0] for v in l[2:].split(' ')]
            faces.append([int(v) for v in f])

    # `.obj` faces start with vertex indices of 1 -> set to 0
    return np.array(verts), np.array(faces) - 1

Removes surface voxels.

Source code in navis/conversion/meshing.py
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
def remove_surface_voxels(voxels, **kwargs):
    """Removes surface voxels."""
    # Use bounding boxes to keep matrix small
    bb_min = voxels.min(axis=0)
    #bb_max = voxels.max(axis=0)
    #dim = bb_max - bb_min

    # Voxel offset
    voxel_off = voxels - bb_min

    # Generate empty array
    mat = _voxels_to_matrix(voxel_off)

    # Erode
    mat_erode = binary_erosion(mat, **kwargs)

    # Turn back into voxels
    voxels_erode = _matrix_to_voxels(mat_erode) + bb_min

    return voxels_erode

Unpack 2-d array.

Source code in navis/conversion/meshing.py
365
366
367
368
369
370
371
372
def unpack_array(arr, base=8):
    """Unpack 2-d array."""
    N = 2 ** base - 1
    unpacked = np.zeros((arr.shape[0], 3), dtype='uint64')
    unpacked[:, 0] = (arr >> (base * 2)) & N
    unpacked[:, 1] = (arr >> base) & N
    unpacked[:, 2] = arr & N
    return unpacked