Ejemplo n.º 1
0
def load_mesh_stl(fn, return_polydata_only=False):
    """
    Args:
        return_polydata_only (bool): If true, return polydata; if false (default), return (vertices, faces)
    """

    if not os.path.exists(fn):
        print('load_mesh_stl: File does not exist %s\n' % fn)
        return None

    reader = vtk.vtkSTLReader()
    reader.SetFileName(fn)
    reader.Update()

    polydata = reader.GetOutput()
    assert polydata is not None

    if return_polydata_only:
        return polydata

    vertices = vtk_to_numpy(polydata.GetPoints().GetData())
    a = vtk_to_numpy(polydata.GetPolys().GetData())
    faces = np.c_[a[1::4], a[2::4], a[3::4]]

    return vertices, faces
Ejemplo n.º 2
0
def fpm_reader(filename):
    reader = vtk.vtkXMLUnstructuredGridReader()
    reader.SetFileName(filename)
    reader.Update()
    vtk_data = reader.GetOutput()
    coord = numpy_support.vtk_to_numpy(vtk_data.GetPoints().GetData())
    concen = numpy_support.vtk_to_numpy(
        vtk_data.GetPointData().GetArray(0))[:, None]
    velocity = numpy_support.vtk_to_numpy(vtk_data.GetPointData().GetArray(1))
    point_data = np.concatenate((coord, concen, velocity), axis=-1)
    return point_data
Ejemplo n.º 3
0
def create_sample_element(cell_type, order=3, visualize=True):
    try:
        import vtk
        from vtkmodules.util.numpy_support import vtk_to_numpy
    except ImportError:
        raise ImportError("python bindings for vtk cannot be found")

    cell_type = cell_type.upper()
    vtk_cell_type = getattr(vtk, cell_type, None)
    if vtk_cell_type is None:
        raise ValueError("unknown cell type: '%s'" % cell_type)

    source = vtk.vtkCellTypeSource()
    source.SetCellType(vtk_cell_type)
    source.SetBlocksDimensions(1, 1, 1)
    if "LAGRANGE" in cell_type:
        source.SetCellOrder(order)
    source.Update()
    grid = source.GetOutput()

    if visualize:
        filename = "sample_%s.vtu" % cell_type.lower()
        print("cell type: %s" % cell_type)
        print("output: %s" % filename)

        writer = vtk.vtkXMLUnstructuredGridWriter()
        writer.SetFileName(filename)
        writer.SetCompressorTypeToNone()
        writer.SetDataModeToAscii()
        writer.SetInputData(grid)
        writer.Write()

    cell = grid.GetCell(0)
    points = vtk_to_numpy(cell.GetPoints().GetData()).T

    dim = cell.GetCellDimension()
    points = points[0:dim]

    if cell_type in VTK_LAGRANGE_SIMPLICES:
        from pyvisfile.vtk.vtk_ordering import vtk_lagrange_simplex_node_tuples
        nodes = np.array(vtk_lagrange_simplex_node_tuples(dim, order))

        error = la.norm(nodes / order - points.T)
        print("error[%d]: %.5e" % (order, error))
        assert error < 5.0e-7

    if visualize:
        filename = "sample_%s" % cell_type.lower()
        plot_node_ordering(filename, points, show=False)

        if cell_type in VTK_LAGRANGE_SIMPLICES:
            filename = "sample_%s_new" % cell_type.lower()
            plot_node_ordering(filename, nodes.T, show=False)
Ejemplo n.º 4
0
def data_array(data_array, location="PointData", name=None):
    if data_array:
        dataRange = data_array.GetRange(-1)
        nb_comp = data_array.GetNumberOfComponents()
        values = vtk_to_numpy(data_array)
        js_types = to_js_type[str(values.dtype)]
        return {
            "name": name if name else data_array.GetName(),
            "values": b64_encode_numpy(values),
            "numberOfComponents": nb_comp,
            "type": js_types,
            "location": location,
            "dataRange": dataRange,
        }
Ejemplo n.º 5
0
def VtkRead(filepath, t):
    if not const.VTK_WARNING:
        log_path = os.path.join(inv_paths.USER_LOG_DIR, "vtkoutput.txt")
        fow = vtkFileOutputWindow()
        fow.SetFileName(log_path.encode(const.FS_ENCODE))
        ow = vtkOutputWindow()
        ow.SetInstance(fow)

    global no_error

    if t == "bmp":
        reader = vtkBMPReader()

    elif t == "tiff" or t == "tif":
        reader = vtkTIFFReader()

    elif t == "png":
        reader = vtkPNGReader()

    elif t == "jpeg" or t == "jpg":
        reader = vtkJPEGReader()

    else:
        return False

    reader.AddObserver("ErrorEvent", VtkErrorToPy)
    reader.SetFileName(filepath)
    reader.Update()

    if no_error:
        image = reader.GetOutput()
        dim = image.GetDimensions()

        if reader.GetNumberOfScalarComponents() > 1:
            luminanceFilter = vtkImageLuminance()
            luminanceFilter.SetInputData(image)
            luminanceFilter.Update()

            image = vtkImageData()
            image.DeepCopy(luminanceFilter.GetOutput())

        img_array = numpy_support.vtk_to_numpy(
            image.GetPointData().GetScalars())
        img_array.shape = (dim[1], dim[0])

        return img_array
    else:
        no_error = True
        return False
Ejemplo n.º 6
0
    def _dump_ren_win(self):
        qDebug('ObjectRenderer: DUMPING RENDER')
        self._render_window.PushState()
        self.openGLInitState()
        self._render_window.Start()
        # Render
        self._render_window.Render()

        width, height = self._render_window.GetSize()
        arr = vtk.vtkUnsignedCharArray()
        self.ren_win.GetRGBACharPixelData(0, 0, width - 1, height - 1, 0, arr)
        data = vtk_to_numpy(arr).reshape(height, width, -1)[::-1]
        self._render_window.PopState()
        self.__m_vtkFboItem.window().resetOpenGLState()
        return data
Ejemplo n.º 7
0
def mip_z():
    ImageSlab = vtk.vtkImageSlabReslice()
    ImageSlab.SetInputData(imagedata)
    ImageSlab.SetResliceAxesOrigin(center)
    ImageSlab.SetResliceAxesDirectionCosines(DirectionCosines_z)
    ImageSlab.SetSlabThickness(ConstPixelSpacing[2] * ConstPixelDims[2])
    ImageSlab.SetBlendModeToMax()
    ImageSlab.SetSlabResolution(ConstPixelSpacing[2])
    ImageSlab.Update()
    image = ImageSlab.GetOutput()
    m = image.GetDimensions()
    vtk_data = image.GetPointData().GetScalars()
    arr = numpy_support.vtk_to_numpy(vtk_data).reshape(m[1], m[0])
    arr = (arr - np.min(arr)) / ((np.max(arr) - np.min(arr)) / 255)
    # cv2.imwrite( path + name +'.jpg', arr)
    return arr
Ejemplo n.º 8
0
 def CalculateHistogram(self):
     image = self.image
     r = int(image.GetScalarRange()[1] - image.GetScalarRange()[0])
     accumulate = vtkImageAccumulate()
     accumulate.SetInputData(image)
     accumulate.SetComponentExtent(0, r - 1, 0, 0, 0, 0)
     accumulate.SetComponentOrigin(image.GetScalarRange()[0], 0, 0)
     #  accumulate.ReleaseDataFlagOn()
     accumulate.Update()
     n_image = numpy_support.vtk_to_numpy(
         accumulate.GetOutput().GetPointData().GetScalars())
     del accumulate
     init, end = image.GetScalarRange()
     Publisher.sendMessage('Load histogram',
                           histogram=n_image,
                           init=init,
                           end=end)
Ejemplo n.º 9
0
def mip_y():
    ImageSlab = vtk.vtkImageSlabReslice()
    ImageSlab.SetInputData(imagedata)
    ImageSlab.SetResliceAxesOrigin(center)
    ImageSlab.SetResliceAxesDirectionCosines(DirectionCosines_y)
    ImageSlab.SetSlabThickness(ConstPixelSpacing[1] * ConstPixelDims[1])
    ImageSlab.SetBlendModeToMax()
    ImageSlab.SetSlabResolution(ConstPixelSpacing[1])
    ImageSlab.Update()
    image = ImageSlab.GetOutput()
    m = image.GetDimensions()
    vtk_data = image.GetPointData().GetScalars()
    arr = numpy_support.vtk_to_numpy(vtk_data).reshape(m[1], m[0])
    arr = (arr - np.min(arr)) / ((np.max(arr) - np.min(arr)) / 255)
    width = int(ConstPixelDims[2] *
                (ConstPixelSpacing[2] / ConstPixelSpacing[0]))
    height = ConstPixelDims[0]
    dim = (width, height)
    resized = cv2.resize(np.rot90(arr, -1), dim, interpolation=cv2.INTER_AREA)
    # cv2.imwrite( path + name +'.jpg', resized)
    return resized
Ejemplo n.º 10
0
def polydata_to_mesh(polydata):
    """
    Extract vertice and face data from a polydata object.

    Returns:
        (vertices, faces)
    """

    vertices = np.array(
        [polydata.GetPoint(i) for i in range(polydata.GetNumberOfPoints())])

    try:
        face_data_arr = vtk_to_numpy(polydata.GetPolys().GetData())

        faces = np.c_[face_data_arr[1::4], face_data_arr[2::4],
                      face_data_arr[3::4]]
    except:
        sys.stderr.write('polydata_to_mesh: No faces are loaded.\n')
        faces = []

    return vertices, faces
Ejemplo n.º 11
0
def mip_x():
    ImageSlab = vtk.vtkImageSlabReslice()
    ImageSlab.SetInputData(imagedata)
    ImageSlab.SetResliceAxesOrigin(center)
    ImageSlab.SetResliceAxesDirectionCosines(DirectionCosines_x)
    ImageSlab.SetSlabThickness(ConstPixelSpacing[0] * ConstPixelDims[0])
    ImageSlab.SetBlendModeToMax()
    ImageSlab.SetSlabResolution(ConstPixelSpacing[0])
    ImageSlab.Update()
    image = ImageSlab.GetOutput()
    m = image.GetDimensions()
    vtk_data = image.GetPointData().GetScalars()
    arr = numpy_support.vtk_to_numpy(vtk_data).reshape(m[1], m[0])
    arr = (arr - numpy.min(arr)) / ((numpy.max(arr) - numpy.min(arr)) / 255)
    width = columns
    height = int(
        len(lstFilesDCM) * (ConstPixelSpacing[2] / ConstPixelSpacing[1]))
    dim = (width, height)
    resized = cv2.resize(numpy.rot90(arr, 1),
                         dim,
                         interpolation=cv2.INTER_AREA)
    return resized
Ejemplo n.º 12
0
def bitmap2memmap(files, slice_size, orientation, spacing, resolution_percentage):
    """
    From a list of dicom files it creates memmap file in the temp folder and
    returns it and its related filename.
    """
    message = _("Generating multiplanar visualization...")
    if len(files) > 1:
        update_progress = vtk_utils.ShowProgress(
            len(files) - 1, dialog_type="ProgressDialog"
        )

    temp_file = tempfile.mktemp()

    if orientation == "SAGITTAL":
        if resolution_percentage == 1.0:
            shape = slice_size[1], slice_size[0], len(files)
        else:
            shape = (
                math.ceil(slice_size[1] * resolution_percentage),
                math.ceil(slice_size[0] * resolution_percentage),
                len(files),
            )

    elif orientation == "CORONAL":
        if resolution_percentage == 1.0:
            shape = slice_size[1], len(files), slice_size[0]
        else:
            shape = (
                math.ceil(slice_size[1] * resolution_percentage),
                len(files),
                math.ceil(slice_size[0] * resolution_percentage),
            )
    else:
        if resolution_percentage == 1.0:
            shape = len(files), slice_size[1], slice_size[0]
        else:
            shape = (
                len(files),
                math.ceil(slice_size[1] * resolution_percentage),
                math.ceil(slice_size[0] * resolution_percentage),
            )

    if resolution_percentage == 1.0:
        matrix = numpy.memmap(temp_file, mode="w+", dtype="int16", shape=shape)

    cont = 0
    max_scalar = None
    min_scalar = None

    xy_shape = None
    first_resample_entry = False

    for n, f in enumerate(files):
        image_as_array = bitmap_reader.ReadBitmap(f)
        image = converters.to_vtk(
            image_as_array,
            spacing=spacing,
            slice_number=1,
            orientation=orientation.upper(),
        )

        if resolution_percentage != 1.0:

            image_resized = ResampleImage2D(
                image,
                px=None,
                py=None,
                resolution_percentage=resolution_percentage,
                update_progress=None,
            )

            yx_shape = (
                image_resized.GetDimensions()[1],
                image_resized.GetDimensions()[0],
            )

            if not (first_resample_entry):
                shape = shape[0], yx_shape[0], yx_shape[1]
                matrix = numpy.memmap(temp_file, mode="w+", dtype="int16", shape=shape)
                first_resample_entry = True

            image = image_resized

        min_aux, max_aux = image.GetScalarRange()
        if min_scalar is None or min_aux < min_scalar:
            min_scalar = min_aux

        if max_scalar is None or max_aux > max_scalar:
            max_scalar = max_aux

        array = numpy_support.vtk_to_numpy(image.GetPointData().GetScalars())

        if array.dtype == "uint16":
            new_array = np.empty_like(array, dtype=np.int16)
            new_array = array - 32768
            array = new_array

        if orientation == "CORONAL":
            array.shape = matrix.shape[0], matrix.shape[2]
            matrix[:, n, :] = array[:, ::-1]
        elif orientation == "SAGITTAL":
            array.shape = matrix.shape[0], matrix.shape[1]
            # TODO: Verify if it's necessary to add the slices swapped only in
            # sagittal rmi or only in # Rasiane's case or is necessary in all
            # sagittal cases.
            matrix[:, :, n] = array[:, ::-1]
        else:
            array.shape = matrix.shape[1], matrix.shape[2]
            matrix[n] = array

        if len(files) > 1:
            update_progress(cont, message)
        cont += 1

    matrix.flush()
    scalar_range = min_scalar, max_scalar

    return matrix, scalar_range, temp_file
Ejemplo n.º 13
0
def mesh_array(array):
    if array:
        return b64_encode_numpy(vtk_to_numpy(array.GetData()))
Ejemplo n.º 14
0
def create_sample_element(cell_type, order=3, visualize=True):
    from distutils.version import LooseVersion
    if LooseVersion(vtk.VTK_VERSION) > "8.2.0":
        vtk_version = (2, 2)
    else:
        vtk_version = (2, 1)

    cell_type = cell_type.upper()
    vtk_cell_type = getattr(vtk, cell_type, None)
    if vtk_cell_type is None:
        raise ValueError("unknown cell type: '%s'" % cell_type)

    source = vtk.vtkCellTypeSource()
    source.SetCellType(vtk_cell_type)
    source.SetBlocksDimensions(1, 1, 1)
    if "LAGRANGE" in cell_type:
        source.SetCellOrder(order)

    # 0 - single precision; 1 - double precision
    source.SetOutputPrecision(1)
    source.Update()

    grid = source.GetOutput()
    cell = grid.GetCell(0)
    points = vtk_to_numpy(cell.GetPoints().GetData()).copy().T

    dim = cell.GetCellDimension()
    points = points[0:dim]

    basename = f"sample_{cell_type.lower()}"
    if visualize:
        filename = f"{basename}.vtu"

        print("vtk xml version:", vtk_version)
        print("cell type: %s" % cell_type)
        print("output: %s" % filename)

        writer = vtk.vtkXMLUnstructuredGridWriter()
        writer.SetFileName(filename)
        writer.SetCompressorTypeToNone()
        writer.SetDataModeToAscii()
        writer.SetInputData(grid)
        writer.Write()

    # NOTE: vtkCellTypeSource always tesselates a square and the way it does
    # that to get tetrahedra changed in
    #   https://gitlab.kitware.com/vtk/vtk/-/merge_requests/6529
    if LooseVersion(vtk.VTK_VERSION) > "8.2.0" \
            and cell_type == "VTK_LAGRANGE_TETRAHEDRON":
        rot = np.array([
            [1, -1, 0],
            [0, 1, -1],
            [0, 0, 2]
            ])
        points = rot @ points

    if cell_type in VTK_LAGRANGE_SIMPLICES:
        from pyvisfile.vtk.vtk_ordering import (
                vtk_lagrange_simplex_node_tuples,
                vtk_lagrange_simplex_node_tuples_to_permutation)

        node_tuples = vtk_lagrange_simplex_node_tuples(dim, order,
            vtk_version=vtk_version)
        vtk_lagrange_simplex_node_tuples_to_permutation(node_tuples)

        nodes = np.array(node_tuples) / order
        error = la.norm(nodes - points.T)
    elif cell_type in VTK_LAGRANGE_QUADS:
        from pyvisfile.vtk.vtk_ordering import (
                vtk_lagrange_quad_node_tuples,
                vtk_lagrange_quad_node_tuples_to_permutation)

        node_tuples = vtk_lagrange_quad_node_tuples(dim, order,
            vtk_version=vtk_version)
        vtk_lagrange_quad_node_tuples_to_permutation(node_tuples)

        nodes = np.array(node_tuples) / order
        error = la.norm(nodes - points.T)
    else:
        error = None

    # NOTE: skipping the curve check because the ordering is off in the
    # vtkCellTypeSource output
    #   https://gitlab.kitware.com/vtk/vtk/-/merge_requests/6555
    if LooseVersion(vtk.VTK_VERSION) <= "8.2.0" \
            and cell_type == "VTK_LAGRANGE_CURVE":
        error = None

    if error is not None:
        if error < 5.0e-15:
            print(f"\033[92m[PASSED] order {order:2d} error {error:.5e}\033[0m")
        else:
            print(f"\033[91m[FAILED] order {order:2d} error {error:.5e}\033[0m")

    if not visualize:
        return

    filename = f"{basename}_vtk"
    plot_node_ordering(filename, points, show=False)

    if cell_type in (VTK_LAGRANGE_SIMPLICES + VTK_LAGRANGE_QUADS):
        filename = f"{basename}_pyvisfile"
        plot_node_ordering(filename, nodes.T, show=False)
Ejemplo n.º 15
0
ImageSlab.SetInputData(imagedata)
ImageSlab.SetResliceAxesOrigin(center)
ImageSlab.SetResliceAxesDirectionCosines(DirectionCosines_y)
ImageSlab.SetSlabThickness(ConstPixelSpacing[1] * ConstPixelDims[1])
ImageSlab.SetBlendModeToMax()
ImageSlab.SetSlabResolution(ConstPixelSpacing[1])
ImageSlab.Update()

image = ImageSlab.GetOutput()
m = image.GetDimensions()
# print(m)
writer = vtk.vtkMetaImageWriter()
writer.SetInputData(image)
writer.SetFileName("E:/Dicom/test/DicomResource/test11.mhd")
writer.Write()

vtk_data = image.GetPointData().GetScalars()
arr = numpy_support.vtk_to_numpy(vtk_data).reshape(m[1], m[0])
# print(numpy.max(arr))
# print(numpy.min(arr))
arr = (arr - numpy.min(arr)) / ((numpy.max(arr) - numpy.min(arr)) / 255)

print(numpy.shape(arr))

width = int(len(lstFilesDCM) * (ConstPixelSpacing[2] / ConstPixelSpacing[0]))
height = Dim[0]
dim = (width, height)
resized = cv2.resize(numpy.rot90(arr, -1), dim, interpolation=cv2.INTER_AREA)

cv2.imwrite('mip12.png', resized)
def Poly2Label2D(poly, dim, origin, spacing):
    '''
    Input:
        poly: numpy array (n*2), poly to convert
        dim: dimention of target label
        origin: origin of target label
        spacing: spacing of target label
    Output: numpy array, result 2D label
    Description: Convert a 2D contour to 2D label
    '''
    # 1 构建poly
    NumOfPoints = len(poly)
    Points = vtk.vtkPoints()
    polydata = vtk.vtkPolyData()
    Points.Reset()
    i = 0
    while i < NumOfPoints:
        Points.InsertPoint(i, (poly[i][0], poly[i][1], 0))
        i += 1
    polydata.Modified()
    lines = vtk.vtkCellArray()
    lines.InsertNextCell(NumOfPoints+1)
    i = 0
    while i < NumOfPoints:
        lines.InsertCellPoint(i)
        i += 1
    lines.InsertCellPoint(0)
    polydata.SetPoints(Points)
    polydata.SetLines(lines)
    polydata.Modified()

    # 2 建立空白图像
    Image = vtk.vtkImageData()
    Image.SetDimensions(dim[0], dim[1], 1)
    Image.SetOrigin(origin[0], origin[1], 0)
    Image.SetSpacing(spacing[0], spacing[1], 0)
    Image.AllocateScalars(vtk.VTK_INT, 1)
    count = Image.GetNumberOfPoints()
    # Fill every entry of the image data with "0"
    for i in range(count):
        Image.GetPointData().GetScalars().SetTuple1(i, 0)

    # 3 LinearExtrusionFilter
    extrudeFilter = vtk.vtkLinearExtrusionFilter()
    extrudeFilter.SetInputData(polydata)
    extrudeFilter.SetScaleFactor(1)
    extrudeFilter.SetExtrusionTypeToNormalExtrusion()
    extrudeFilter.SetVector( 0, 0, 1)

    # 4 poly沿z轴平移-0.5
    m1 = vtk.vtkMatrix4x4()
    m1.SetElement(2, 3, -0.5)
    linearTransform = vtk.vtkMatrixToLinearTransform()
    linearTransform.GetMatrix().DeepCopy(m1)
    transformPolyData = vtk.vtkTransformPolyDataFilter()
    transformPolyData.SetInputConnection(extrudeFilter.GetOutputPort())
    transformPolyData.SetTransform(linearTransform)

    # 5 转换
    dataToStencil = vtk.vtkPolyDataToImageStencil()
    dataToStencil.SetInputConnection(transformPolyData.GetOutputPort())
    dataToStencil.SetOutputSpacing(spacing[0], spacing[1], 0)
    dataToStencil.SetOutputOrigin(origin[0], origin[1], 0)
    stencil = vtk.vtkImageStencil()
    stencil.SetStencilConnection(dataToStencil.GetOutputPort())
    stencil.SetInputData(Image)
    stencil.ReverseStencilOn()
    stencil.SetBackgroundValue(1)
    stencil.Update()

    # 6 vtk 2 numpy
    dataObj = stencil.GetOutput()
    vtkArray = dataObj.GetPointData().GetArray(0)
    numpyarray = numpy_support.vtk_to_numpy(vtkArray)
    Output = numpy.reshape(numpyarray, dim, order='F')

    return Output