From d83feafd5ecd330798cc15cff044662c85227a19 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:01:27 +1100 Subject: [PATCH 1/7] Natural sorting of filenames (so we don't have to left pad numbers with zeros) --- imagereg/main.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/imagereg/main.py b/imagereg/main.py index 386d457..08afa3e 100644 --- a/imagereg/main.py +++ b/imagereg/main.py @@ -1,4 +1,5 @@ import csv +import glob import logging import os @@ -12,6 +13,7 @@ GPU_AVAILABLE = False import click +import natsort import numpy # this line is not redundant import pandas as pd import skimage.draw @@ -236,17 +238,21 @@ def find_filenames(filename_pattern): Parameters ---------- - filename_pattern : str - Regex pattern matching files of interest. +- filename_pattern : str +- Regex pattern matching files of interest. Returns ------- filenames Ordered list of filenames (alphabetical ordering). """ - image_collection = skimage.io.imread_collection( - load_pattern=filename_pattern) - filenames = image_collection.files + filenames = glob.glob(filename_pattern) + filenames = natsort.natsorted(filenames) + n_filenames = len(filenames) + if n_filenames == 0: + raise RuntimeError("No matching files found at this location.") + else: + print(n_filenames, "matching filenames found.") return filenames @@ -356,14 +362,14 @@ def run_full_pipeline(input_directory, regex_pattern, output_directory): def pipeline(input_directory, regex_pattern, output_directory): # Set up output file location check_directory(output_directory) + filename_pattern = os.path.join(input_directory, regex_pattern) + filenames = find_filenames(filename_pattern) output_relative_shifts = os.path.join( output_directory, 'relative_shifts.csv') output_cumulative_shifts = os.path.join( output_directory, 'cumulative_shifts.csv') - # Set up inputs - full_regex_pattern = os.path.join(input_directory, regex_pattern) - filenames = find_filenames(full_regex_pattern) # Pipeline stage 1 + print('Running pipeline stage 1') # Calculate relative shifts with open(output_relative_shifts, "w") as f: writes = csv.writer(f, delimiter=',', quoting=csv.QUOTE_ALL) @@ -371,11 +377,13 @@ def pipeline(input_directory, regex_pattern, output_directory): writes.writerows([[0, 0]]) # the first frame is the anchor, no shift writes.writerows(calculate_relative_shifts(filenames)) # Pipeline stage 2 + print('Running pipeline stage 2') # Calculate the cumulative shifts relative_shift_df = pd.read_csv(output_relative_shifts) cumulative_shift_df = calculate_cumulative_shifts(relative_shift_df) cumulative_shift_df.to_csv(output_cumulative_shifts) # Pipeline stage 3 + print('Running pipeline stage 3') # Aligning and saving the images # Must have relative_shift_df and cumulative_shift_df both in memory pad_width = calculate_padding(cumulative_shift_df) From 8e129ff9d1d8f84ab8381c18b35ee4dcb6a46527 Mon Sep 17 00:00:00 2001 From: Genevieve Buckley <30920819+GenevieveBuckley@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:04:39 +1100 Subject: [PATCH 2/7] Add natsort to requirements file --- requirements/requirements-default.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/requirements-default.txt b/requirements/requirements-default.txt index e124232..ed2de09 100644 --- a/requirements/requirements-default.txt +++ b/requirements/requirements-default.txt @@ -1,5 +1,6 @@ click==7.0 ipython==7.7.0 +natsort==0.1.0 numpy==1.16.4 pandas==0.24.2 scipy==1.4.1 From f0b89bb37b2c0e1c4fe9f2df657ae03ec09be7ec Mon Sep 17 00:00:00 2001 From: andyboyd50 Date: Fri, 30 Sep 2022 17:56:49 +1000 Subject: [PATCH 3/7] Add progress bars with tqdm --- imagereg/main.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/imagereg/main.py b/imagereg/main.py index 08afa3e..fe90eeb 100644 --- a/imagereg/main.py +++ b/imagereg/main.py @@ -18,6 +18,7 @@ import pandas as pd import skimage.draw import skimage.io +from tqdm import tqdm def align_images(image, shift, pad_width=None): @@ -176,7 +177,7 @@ def calculate_relative_shifts(filenames): Ordered list of filenames """ my_generator = read_files(filenames) - for (img1, img2) in my_generator: + for (img1, img2) in tqdm(my_generator, total=len(filenames)): shift = register_translation(img1, img2) yield shift @@ -310,7 +311,7 @@ def align_and_save_images(filenames, output_directory, cumulative_shift_df, ------- output_filename, aligned_image """ - for filename, (idx, row) in zip(filenames, cumulative_shift_df.iterrows()): + for filename, (idx, row) in tqdm(zip(filenames, cumulative_shift_df.iterrows()), total=len(filenames)): image = skimage.io.imread(filename) image = np.array(image) # not redundant, if you import cupy as np shift = [int(row['x_shift']), int(row['y_shift'])] @@ -322,8 +323,8 @@ def align_and_save_images(filenames, output_directory, cumulative_shift_df, skimage.io.imsave(output_filename, np.asnumpy(aligned_image)) else: skimage.io.imsave(output_filename, aligned_image) - print('Saved: {}'.format(output_filename)) - yield output_filename, aligned_image + # print('Saved: {}'.format(output_filename)) + # yield output_filename, aligned_image def check_directory(directory_path): @@ -382,15 +383,15 @@ def pipeline(input_directory, regex_pattern, output_directory): relative_shift_df = pd.read_csv(output_relative_shifts) cumulative_shift_df = calculate_cumulative_shifts(relative_shift_df) cumulative_shift_df.to_csv(output_cumulative_shifts) + print('Pipeline stage 2 complete') # Pipeline stage 3 print('Running pipeline stage 3') # Aligning and saving the images # Must have relative_shift_df and cumulative_shift_df both in memory pad_width = calculate_padding(cumulative_shift_df) - mygenerator = align_and_save_images( + align_and_save_images( filenames, output_directory, cumulative_shift_df, pad_width=pad_width) - for filename_out, _ in mygenerator: - print(filename_out) + print("Finished.") if __name__ == '__main__': From d1b9a14df1c135ed1aae2b5ad69269945c8de975 Mon Sep 17 00:00:00 2001 From: andyboyd50 Date: Fri, 30 Sep 2022 18:00:43 +1000 Subject: [PATCH 4/7] Add tqdm dependency for progress bars --- requirements/requirements-default.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/requirements-default.txt b/requirements/requirements-default.txt index ed2de09..576a7d6 100644 --- a/requirements/requirements-default.txt +++ b/requirements/requirements-default.txt @@ -5,3 +5,4 @@ numpy==1.16.4 pandas==0.24.2 scipy==1.4.1 scikit-image==0.15.0 +tqdm==4.64.0 From 660c54cacdeda7932d0bf2893b0b1e99978580a6 Mon Sep 17 00:00:00 2001 From: andyboyd50 Date: Fri, 30 Sep 2022 18:01:08 +1000 Subject: [PATCH 5/7] Uncomment line, was commented out by accident --- imagereg/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/imagereg/main.py b/imagereg/main.py index fe90eeb..897be3a 100644 --- a/imagereg/main.py +++ b/imagereg/main.py @@ -323,8 +323,7 @@ def align_and_save_images(filenames, output_directory, cumulative_shift_df, skimage.io.imsave(output_filename, np.asnumpy(aligned_image)) else: skimage.io.imsave(output_filename, aligned_image) - # print('Saved: {}'.format(output_filename)) - # yield output_filename, aligned_image + yield output_filename, aligned_image def check_directory(directory_path): From d90b5d6c811ff3b134d17ff4e5e85649bb741471 Mon Sep 17 00:00:00 2001 From: andyboyd50 Date: Mon, 3 Oct 2022 13:45:21 +1100 Subject: [PATCH 6/7] Update to fix numpy deprecation warning --- imagereg/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imagereg/main.py b/imagereg/main.py index 897be3a..a1d3658 100644 --- a/imagereg/main.py +++ b/imagereg/main.py @@ -93,7 +93,7 @@ def register_translation(src_image, target_image, midpoints = np.array([float(np.fix(axis_size / 2)) for axis_size in shape]) shifts = np.array(maxima, dtype=np.float64) shifts[shifts > midpoints] -= np.array(shape)[shifts > midpoints] - shifts = np.flip(shifts, axis=0).astype(np.int) # x, y order + shifts = np.flip(shifts, axis=0).astype(int) # x, y order return shifts From 3aac410583ad29e5ea59ac47a4db78508f6609ac Mon Sep 17 00:00:00 2001 From: andyboyd50 Date: Mon, 3 Oct 2022 13:46:23 +1100 Subject: [PATCH 7/7] Don't return generator, just run save_and_align_images --- imagereg/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/imagereg/main.py b/imagereg/main.py index a1d3658..6d033ca 100644 --- a/imagereg/main.py +++ b/imagereg/main.py @@ -323,7 +323,6 @@ def align_and_save_images(filenames, output_directory, cumulative_shift_df, skimage.io.imsave(output_filename, np.asnumpy(aligned_image)) else: skimage.io.imsave(output_filename, aligned_image) - yield output_filename, aligned_image def check_directory(directory_path):