stack-3d/image/downsample_tiffs.py

75 lines
3 KiB
Python
Raw Normal View History

2017-02-16 15:26:55 +00:00
"""
Downsample the tiffs for easier postprocessing
"""
import os
import logging
import math
from argparse import ArgumentParser
from functools import partial
import multiprocessing as mp
import skimage.external.tifffile
import skimage.transform
from skimage import exposure
import utility
def do_downsample(input_file, working_directory, downsample_ratios):
im = skimage.external.tifffile.imread(input_file)
downsampled = skimage.transform.downscale_local_mean(im, downsample_ratios)
out_path = working_directory + "/" + os.path.splitext(os.path.basename(input_file))[0] + "_downsampled.tiff"
scaled_image = exposure.rescale_intensity(downsampled, out_range=(0.0, 1.0))
skimage.external.tifffile.imsave(out_path, skimage.img_as_ubyte(scaled_image))
def downsample_tiffs(input_folder, downsample_ratios, channel = 0, series = 0):
file_names = []
dir_name = os.path.dirname(input_folder)
for eachFile in os.listdir(input_folder):
if eachFile.endswith(".tiff"):
file_names.append(dir_name + "/" + eachFile)
# Make a partial function for multiple arg mapping
working_directory = os.getcwd() + "/Downsampled_X"+str(downsample_ratios[2]) + "_Y"+str(downsample_ratios[1])
working_directory += "_Z"+str(downsample_ratios[0]) + "/"
if not os.path.exists(working_directory):
os.makedirs(working_directory)
partial_extract_pixel_values_only = partial(do_downsample,
working_directory=working_directory,
downsample_ratios=downsample_ratios)
# Limit to max 6 cpus
num_available_cpus = mp.cpu_count()
if num_available_cpus > 6:
num_available_cpus = 6
# Distribute across processes - Be conservative with available CPUs
run_cpus = int(math.floor(num_available_cpus/2))
if run_cpus == 0:
run_cpus = 1
#pool = mp.Pool(processes = run_cpus)
pool = mp.Pool(processes = 3)
pool.map(partial_extract_pixel_values_only, file_names)
if __name__ == "__main__":
# Do setup
tool_name = "zeiss_to_tiff"
utility.do_setup(tool_name)
logger1 = logging.getLogger('downsample_tiffs.'+tool_name)
# Suppress XML Parse warnings
pyxb_logger = logging.getLogger('pyxb')
pyxb_logger.setLevel(logging.CRITICAL)
parser = ArgumentParser()
parser.add_argument("-i", "--input_folder", type=str, help='Folder with tiffs to be downsampled.')
parser.add_argument("-x", "--x_reduction", type=int, help='Factor reduction in x.', default=1)
parser.add_argument("-y", "--y_reduction", type=int, help='Factor reduction in y.', default=1)
parser.add_argument("-z", "--z_reduction", type=int, help='Factor reduction in z.', default=1)
args = parser.parse_args()
logger1.info('Start Downsampling Images at: ' + args.input_folder)
downsample_ratios = (args.z_reduction, args.y_reduction, args.x_reduction)
downsample_tiffs(args.input_folder, downsample_ratios)
logger1.info('Completed Downsampling')