From 53c78d4feebe95a7a78f3c65d2629904a425eda4 Mon Sep 17 00:00:00 2001 From: Thiago Franco de Moraes Date: Mon, 20 Jan 2020 18:25:19 -0300 Subject: [PATCH] Resizing image when creating surface with low and medium quality --- invesalius/data/imagedata_utils.py | 10 ++++++++++ invesalius/data/surface.py | 59 ++++++++++++++++++++++++++++++++--------------------------- invesalius/data/surface_process.py | 4 ++-- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/invesalius/data/imagedata_utils.py b/invesalius/data/imagedata_utils.py index ea09d75..cc2d59c 100644 --- a/invesalius/data/imagedata_utils.py +++ b/invesalius/data/imagedata_utils.py @@ -125,6 +125,16 @@ def resize_slice(im_array, resolution_percentage): return out +def resize_image_array(image, resolution_percentage, as_mmap=False): + out = zoom(image, resolution_percentage, image.dtype, order=2) + if as_mmap: + fname = tempfile.mktemp(suffix="_resized") + out_mmap = np.memmap(fname, shape=out.shape, dtype=out.dtype, mode='w+') + out_mmap[:] = out + return out_mmap + return out + + def read_dcm_slice_as_np2(filename, resolution_percentage=1.0): reader = gdcm.ImageReader() reader.SetFileName(filename) diff --git a/invesalius/data/surface.py b/invesalius/data/surface.py index deae890..5e5fee6 100644 --- a/invesalius/data/surface.py +++ b/invesalius/data/surface.py @@ -598,6 +598,10 @@ class SurfaceManager(): filename_img = slice_.matrix_filename spacing = slice_.spacing + mask_temp_file = mask.temp_file + mask_shape = mask.matrix.shape + mask_dtype = mask.matrix.dtype + algorithm = surface_parameters['method']['algorithm'] options = surface_parameters['method']['options'] @@ -608,6 +612,8 @@ class SurfaceManager(): fill_border_holes = surface_parameters['options'].get('fill_border_holes', True) + print(surface_parameters) + mode = 'CONTOUR' # 'GRAYSCALE' min_value, max_value = mask.threshold_range colour = mask.colour[:3] @@ -641,6 +647,16 @@ class SurfaceManager(): else: flip_image = True + if imagedata_resolution > 0: + spacing = tuple([s * imagedata_resolution for s in spacing]) + matrix = iu.resize_image_array(matrix, 1.0/imagedata_resolution, True) + mask = iu.resize_image_array(mask.matrix, 1.0/imagedata_resolution, True) + + filename_img = matrix.filename + mask_temp_file = mask.filename + mask_shape = mask.shape + mask_dtype = mask.dtype + n_processors = multiprocessing.cpu_count() o_piece = 1 @@ -653,6 +669,8 @@ class SurfaceManager(): manager = multiprocessing.Manager() msg_queue = manager.Queue(1) + print("Resolution", imagedata_resolution) + # If InVesalius is running without GUI if wx.GetApp() is None: for i in range(n_pieces): @@ -662,8 +680,8 @@ class SurfaceManager(): print("new_piece", roi) f = pool.apply_async(surface_process.create_surface_piece, args = (filename_img, matrix.shape, matrix.dtype, - mask.temp_file, mask.matrix.shape, - mask.matrix.dtype, roi, spacing, mode, + mask_temp_file, mask_shape, + mask_dtype, roi, spacing, mode, min_value, max_value, decimate_reduction, smooth_relaxation_factor, smooth_iterations, language, flip_image, @@ -720,31 +738,18 @@ class SurfaceManager(): end = init + piece_size + o_piece roi = slice(init, end) print("new_piece", roi) - try: - f = pool.apply_async(surface_process.create_surface_piece, - args = (filename_img, matrix.shape, matrix.dtype, - mask.temp_file, mask.matrix.shape, - mask.matrix.dtype, roi, spacing, mode, - min_value, max_value, decimate_reduction, - smooth_relaxation_factor, - smooth_iterations, language, flip_image, - algorithm != 'Default', algorithm, - imagedata_resolution, fill_border_holes), - callback=lambda x: filenames.append(x), - error_callback=functools.partial(self._on_callback_error, - dialog=sp)) - # python2 - except TypeError: - f = pool.apply_async(surface_process.create_surface_piece, - args = (filename_img, matrix.shape, matrix.dtype, - mask.temp_file, mask.matrix.shape, - mask.matrix.dtype, roi, spacing, mode, - min_value, max_value, decimate_reduction, - smooth_relaxation_factor, - smooth_iterations, language, flip_image, - algorithm != 'Default', algorithm, - imagedata_resolution, fill_border_holes), - callback=lambda x: filenames.append(x)) + f = pool.apply_async(surface_process.create_surface_piece, + args = (filename_img, matrix.shape, matrix.dtype, + mask_temp_file, mask_shape, + mask_dtype, roi, spacing, mode, + min_value, max_value, decimate_reduction, + smooth_relaxation_factor, + smooth_iterations, language, flip_image, + algorithm != 'Default', algorithm, + imagedata_resolution, fill_border_holes), + callback=lambda x: filenames.append(x), + error_callback=functools.partial(self._on_callback_error, + dialog=sp)) while len(filenames) != n_pieces: if sp.WasCancelled() or not sp.running: diff --git a/invesalius/data/surface_process.py b/invesalius/data/surface_process.py index 3ba1632..19a0ed3 100644 --- a/invesalius/data/surface_process.py +++ b/invesalius/data/surface_process.py @@ -131,8 +131,8 @@ def create_surface_piece(filename, shape, dtype, mask_filename, mask_shape, image = converters.to_vtk(a_image, spacing, roi.start, "AXIAL", padding=padding) del a_image - if imagedata_resolution: - image = ResampleImage3D(image, imagedata_resolution) + # if imagedata_resolution: + # image = ResampleImage3D(image, imagedata_resolution) flip = vtk.vtkImageFlip() flip.SetInputData(image) -- libgit2 0.21.2