From 146cd825095da9e47dee343adfc3624ed059dcbd Mon Sep 17 00:00:00 2001 From: Niklas Gahm Date: Fri, 30 Nov 2018 16:58:38 -0600 Subject: [PATCH 1/4] Fixed Naming Convention Guide Fixed a small typo in the Naming Convention Guide --- Processing Code/File Naming Convention Guide.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Processing Code/File Naming Convention Guide.txt b/Processing Code/File Naming Convention Guide.txt index fe20335..169485c 100644 --- a/Processing Code/File Naming Convention Guide.txt +++ b/Processing Code/File Naming Convention Guide.txt @@ -2,7 +2,7 @@ As a direct output from the steering code you will have one top directory with m The top directory should end in: -_[number of images in the x-dimension]x_[number of images in the y-dimension]y_[number of images in the z-dimension]z_[depth of cutting between z-slices]um_cuts +_[number of images in the x-dimension]x_[number of images in the y-dimension]y_[number of images in the z-dimension]z_[depth of cutting between z-slices][cut scale (um,mm,cm)]_cuts e.g. 2018-10-16-Tiled_Beads_20x_1ms_3x_3y_3z_10um_cuts where 2018-10-16-Tiled_Beads_20x_1ms is the data set name From 2ee2aa79dcd5601707337c7a5cce7601c9ca7b4e Mon Sep 17 00:00:00 2001 From: Niklas Gahm Date: Fri, 30 Nov 2018 17:07:22 -0600 Subject: [PATCH 2/4] Added Processing Code Protocol Uploading a protocol for how to use the Axial Sectioning Processing Code. --- Processing Code/Processing Protocol.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Processing Code/Processing Protocol.txt diff --git a/Processing Code/Processing Protocol.txt b/Processing Code/Processing Protocol.txt new file mode 100644 index 0000000..c395425 --- /dev/null +++ b/Processing Code/Processing Protocol.txt @@ -0,0 +1,13 @@ +This protocol describes how to process data from the SETI system. +Author: Niklas Gahm +Last Revision: 2018/11/30 + + +1. Run Launch_Axial_Sectioning_v11.m +2. In the GUI select the reconstruction mode + - Individual Images is if you wish to process an unrelated collection of images acquired with SETI + - Image Stack is if you acquired an image cube of data + - Rejection Profile is if you are processing data acquired through the special rejection profile mode and want to quantify the intensity falloff from rejection +3. Set all options (NOTE: All options have mouse-over text describing what they do/mean) +4. Select a valid folder to process through the Select Folder to Process Button +5. Push the Process Data button From e5889486304b4a982f59f4e6fd196676d06d7164 Mon Sep 17 00:00:00 2001 From: Niklas Gahm Date: Fri, 30 Nov 2018 17:37:02 -0600 Subject: [PATCH 3/4] Updated GUI Updated the GUI figure and underlying functions for the latest round of usability feedback. --- .../Axial_Sectioning_Framework_v11_GUI.fig | Bin 26952 -> 27157 bytes .../Axial_Sectioning_Framework_v11_GUI.m | 86 +++++++++++------- 2 files changed, 52 insertions(+), 34 deletions(-) diff --git a/Processing Code/Functions/Axial_Sectioning_Framework_v11_GUI.fig b/Processing Code/Functions/Axial_Sectioning_Framework_v11_GUI.fig index faf308fce432fdccaf6215fafd1c1c08aae88f34..c712db59f15ed33db5046fa23e3b880138330c7d 100644 GIT binary patch literal 27157 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 X*b@E0k6C1jCIze_Lb!@xP~!gspiD%@ literal 26952 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 X?l*Zqm838FUgu`0;)wPRB@`JZmYmG$ diff --git a/Processing Code/Functions/Axial_Sectioning_Framework_v11_GUI.m b/Processing Code/Functions/Axial_Sectioning_Framework_v11_GUI.m index 4f2f1b0..566d660 100644 --- a/Processing Code/Functions/Axial_Sectioning_Framework_v11_GUI.m +++ b/Processing Code/Functions/Axial_Sectioning_Framework_v11_GUI.m @@ -22,7 +22,7 @@ % Edit the above text to modify the response to help Axial_Sectioning_Framework_v11_GUI -% Last Modified by GUIDE v2.5 29-Nov-2018 09:50:32 +% Last Modified by GUIDE v2.5 30-Nov-2018 17:33:42 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; @@ -115,9 +115,23 @@ function process_data_button_Callback(hObject, eventdata, handles) error('No Folder Selected for Processing.') end +% Get BitDepth +switch get(handles.bit_depth, 'Value') + case 1 + bit_depth = 8; + case 2 + bit_depth = 16; + case 3 + bit_depth = 32; + case 4 + bit_depth = 64; + otherwise + error('Invalid Output Bit Depth Selected'); +end + + % Get Values steering_code_raw_data_flag = get(handles.steering_code_raw, 'Value'); -max_int = str2double(get(handles.max_int, 'String')); sim_points = str2double(get(handles.sim_points, 'String')); overlap_percent = str2double(get(handles.overlap_percent, 'String')) / 100; threshold_percent = str2double(get(handles.threshold_percent, ... @@ -146,7 +160,7 @@ function process_data_button_Callback(hObject, eventdata, handles) % Run Axial Sectioning Framework Axial_Sectioning_Framework_v11(steering_code_raw_data_flag, ... microscope_configuration_file, img_save_type, rec_mode, fpath, ... - max_int, sim_points, save_intermediaries_flag, flat_field_flag, ... + bit_depth, sim_points, save_intermediaries_flag, flat_field_flag, ... flat_field_path, overlap_percent, threshold_percent); % Close GUI @@ -162,6 +176,7 @@ function steering_code_raw_Callback(hObject, eventdata, handles) % Hint: get(hObject,'Value') returns toggle state of steering_code_raw + % --- Executes on selection change in microscope_config_file. function microscope_config_file_Callback(hObject, eventdata, handles) % hObject handle to microscope_config_file (see GCBO) @@ -218,6 +233,7 @@ function microscope_config_file_CreateFcn(hObject, eventdata, handles) end + % --- Executes on selection change in rec_mode_select. function rec_mode_select_Callback(hObject, eventdata, handles) % hObject handle to rec_mode_select (see GCBO) @@ -226,15 +242,12 @@ function rec_mode_select_Callback(hObject, eventdata, handles) % Make Sure a Valid Selection Is Made rec_mode_num = get(handles.rec_mode_select, 'Value'); -if rec_mode_num > 4 +if rec_mode_num > 3 uiwait(msgbox('Please Select a Supported Form of Reconstruction')); end % Set Panel Visibility rec_mode_list = get(handles.rec_mode_select, 'String'); -if rec_mode_num > 3 - error('Unsupported Reconstrution Mode'); -end rec_mode = rec_mode_list{rec_mode_num}; handles = panel_visibility_setter(rec_mode, handles); @@ -255,6 +268,7 @@ function rec_mode_select_CreateFcn(hObject, eventdata, handles) end + % --- Executes on button press in process_folder_selection. function process_folder_selection_Callback(hObject, eventdata, handles) % hObject handle to process_folder_selection (see GCBO) @@ -274,28 +288,6 @@ function process_folder_selection_Callback(hObject, eventdata, handles) -function max_int_Callback(hObject, eventdata, handles) -% hObject handle to max_int (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles structure with handles and user data (see GUIDATA) - -% Hints: get(hObject,'String') returns contents of max_int as text -% str2double(get(hObject,'String')) returns contents of max_int as a double - - -% --- Executes during object creation, after setting all properties. -function max_int_CreateFcn(hObject, eventdata, handles) -% hObject handle to max_int (see GCBO) -% eventdata reserved - to be defined in a future version of MATLAB -% handles empty - handles not created until after all CreateFcns called - -% Hint: edit controls usually have a white background on Windows. -% See ISPC and COMPUTER. -if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) - set(hObject,'BackgroundColor','white'); -end - - % --- Executes on button press in save_intermediaries_flag. function save_intermediaries_flag_Callback(hObject, eventdata, handles) % hObject handle to save_intermediaries_flag (see GCBO) @@ -328,6 +320,7 @@ function sim_points_CreateFcn(hObject, eventdata, handles) end + % --- Executes on button press in flat_field_flag. function flat_field_flag_Callback(hObject, eventdata, handles) % hObject handle to flat_field_flag (see GCBO) @@ -399,6 +392,31 @@ function threshold_percent_CreateFcn(hObject, eventdata, handles) +% --- Executes on selection change in bit_depth. +function bit_depth_Callback(hObject, eventdata, handles) +% hObject handle to bit_depth (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: contents = cellstr(get(hObject,'String')) returns bit_depth contents as cell array +% contents{get(hObject,'Value')} returns selected item from bit_depth + + +% --- Executes during object creation, after setting all properties. +function bit_depth_CreateFcn(hObject, eventdata, handles) +% hObject handle to bit_depth (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + + % Function to check and set Panel visibility function handles = panel_visibility_setter(rec_mode, handles) @@ -417,8 +435,8 @@ function threshold_percent_CreateFcn(hObject, eventdata, handles) end -% Function to set all the ToolTip Strings +% Function to set all the ToolTip Strings function handles = tooltip_string_setter(handles) % Reconstruction Mode Tooltip rec_mode_str_1 = 'Select how the processing code will reconstruct your images.'; @@ -459,10 +477,10 @@ function threshold_percent_CreateFcn(hObject, eventdata, handles) set(handles.text8, 'TooltipString', ... selected_folder_flat_field_str_full); -% Maximum Integer Tooltip -max_int_str_full = 'Set the maximum integer value output images should contain.'; -set(handles.text6, 'TooltipString', max_int_str_full); -set(handles.max_int, 'TooltipString', max_int_str_full); +% Bit Depth Tooltip +bit_depth_str_full = 'Select the Bit Depth output images should contain.'; +set(handles.text6, 'TooltipString', bit_depth_str_full); +set(handles.bit_depth, 'TooltipString', bit_depth_str_full); % Image Save Type Tif Tooltip img_save_type_tif_str_full = 'Select for all output images to be saved as .tif'; From cce07eeb09d3512e32a77f0ca3695313a503ded9 Mon Sep 17 00:00:00 2001 From: Niklas Gahm Date: Fri, 30 Nov 2018 18:34:22 -0600 Subject: [PATCH 4/4] Updated all Save Functions and Added Load Bars This commit changes how all the save functions handle the output image bit depth to fit with the updated GUI. Also included load bars on functions that are a slow point of the code. --- .../Axial_Sectioning_Framework_v11.m | 94 ++++--------------- .../axial_framework_pre_processing_v2.m | 12 ++- .../Functions/axial_img_tiling_v3.m | 21 +++++ .../Functions/axial_img_z_stack_saver.m | 20 ++-- .../Functions/img_bit_depth_converter.m | 27 ++++++ .../Functions/sim_img_reconstructer_v3.m | 10 +- 6 files changed, 94 insertions(+), 90 deletions(-) create mode 100644 Processing Code/Functions/img_bit_depth_converter.m diff --git a/Processing Code/Functions/Axial_Sectioning_Framework_v11.m b/Processing Code/Functions/Axial_Sectioning_Framework_v11.m index 893eaa1..2c101ca 100644 --- a/Processing Code/Functions/Axial_Sectioning_Framework_v11.m +++ b/Processing Code/Functions/Axial_Sectioning_Framework_v11.m @@ -1,91 +1,29 @@ function [] = Axial_Sectioning_Framework_v11(... steering_code_raw_data_flag, microscope_configuration, ... - img_save_type, rec_mode, file_path, max_int, sim_points, ... + img_save_type, rec_mode, file_path, bit_depth, sim_points, ... save_intermediaries_flag, flat_field_flag, flat_field_path, ... overlap_percent, threshold_percent) %% Axial Sectioning Structured Illumination Reconstruction Framework % By: Niklas Gahm % 2017/06/29 % -% This is a framework that loads up the needed images to be processed and -% reconstructed for an axial sectioning system -% -% Variables: -% max_int - The maximum intensity to be used in an output image. -% out_of_focus_flag - This is a binary flag for whether or not the -% image sequence being reconstructed is from an out of -% focus plane, if so an in-focus image needs to be -% acquired for normalization purposes. -% batch_flag - This is a binary flag to tell the script that -% all images in the folder should be processed using -% the specified method -% rejection_profile_flag - This is a binary flag to tell the script -% to generate a rejection profile from a series of images -% it needs to have batch_flag = 1 and -% out_of_focus_flag = 1 to work. -% rejection_step_size - This is the step size between the image -% sequences used to generate the rejection profile. -% rejection_step_size_units - This is the units in which the step -% size are. This is used to display on the rejection -% profile graph, so please format it appropriately. -% rejection_profile_name - This is the name that will be used to save -% all the rejection profiles that are used. -% steering_code_raw_data_flag - This is a flag that all the data is -% straight from the co-designed steering code. -% microscope_configuration - This is the configuration file to use -% which contains multiple variables based on the -% configuration of the hardware used. -% -% Usage: -% When you run the framework please select the first image of the -% series that is being used for reconstruction, make sure that the -% files end in {i, j, or k} for a 3 image reconstruction. If the -% sequence is from an out-of-focus plane you will need to have an -% in-focus image to normalize the intensity to. -% When using the in-focus batch mode, out_of_focus_flag = 0, -% batch_flag = 1) this script will ignore all sub-folders within the -% folder selected. -% When using the out-of-focus batch mode, (out_of_focus_flag = 1, -% batch_flag = 1) you will select a folder wherein all sub folders -% will be ignored and it is assumed you are following a naming -% convention of IF_[name]_[i,j,...] and OF_[name]_[1,2,...]_[i,j,...] -% wherein [1,2,...] are the in-sequence stepping out from the -% in-focus point. -% When using the rejection profile generator please follow the -% out-of-focus batch mode usage guidelines. Make sure that your image -% sequences are at an even step size spacing and that you fill in the -% appropriate rejection_step_size and rejection_step_size_units. Also -% each unique set of lp/mm need to be in their own folder. And there -% need to be no other folders present. This assumes each sub-folder -% is labelled as [lp/mm]_lpmm -% The umanager_raw_flag mode exists solely to make the data -% organizing easier. It should only be used the first time since it -% solely exists to re-organize and re-name the data properly. It can -% only be used in batch mode. +% This is a framework called by a corresponding GUI which loads a series +% of images, processes, reconstructs, tiles, and saves them for an axial +% sectioning system. % % Supported Filetypes: % .tif % -% Supported Microscope Configurations: -% SETI_4x_460nm - SETI Microscope with 4x Nikon Plan APO using 460nm -% wavelength -% SETI_10x_460nm - -% % Supported Reconstruction Types % 3_Sub_Image - Basic SIM reconstruction with 3 images {i,j,k} % 4_Sub_Image - Basic SIM reconstruction with 3 images {i,j,k,u} % 5_Sub_Image - Basic SIM reconstruction with 3 images {i,j,k,u,w} % % Supported Reconstruction Modes -% Single Image - This is for reconstructing a single in-focus image % Image Batch - This is for reconstructing a set of arbritrary % in-focus images -% Z-Stack - This is for reconstructing a z-stack from a batch of raw -% images -% Atlas - This is for reconstructing an xy larger stitched together -% image -% Atlas Z-Stack - This is for reconstructing an xy stitched together -% atlas image which also has multiple z-depths +% Image Stack - This is for reconstructing an image cube from a batch +% of raw images % Rejection Profile - This is for generating an out-of-field % rejection profile from a batch of images which % will have theory matched to each rejection profile @@ -94,11 +32,6 @@ % Common Actuators Used for Stepping: % SETI - Newport Precision 100 TPI - 254 um per 1 turn % -% To Be Added: -% - Flat-Field Correction -% - Add z-stack 3D Rendering Prep -% - Add Atlasing -% % 2017/06/29 - Started % 2017/06/29 - Finished Initial Version % 2017/07/05 - Finished Adding In-Focus Batch Mode @@ -110,6 +43,7 @@ % 2017/08/07 - Fixed Ascending Order Bug % 2017/12/04 - Fixed Rejection Profile Theory % 2017/12/06 - Improved User Interface +% 2018/11/30 - Finished Full Release Version @@ -140,6 +74,10 @@ num_z] = arch_path_generator(file_path); +%% Calculated Variables +max_int = (2^bit_depth) - 1; + + %% Generate Useful Struct of Naming Conventions rec_type_variables = {{'i'}, {'i', 'j'}, {'i', 'j', 'k'}, ... {'i', 'j', 'k', 'u'}, {'i', 'j', 'k', 'u', 'w'}}; @@ -161,19 +99,19 @@ %% Pre-Processing fprintf('\nPre-Processing Data\n'); [ img_sets ] = axial_framework_pre_processing_v2( img_sets, max_int, ... - rec_mode, file_path, img_save_type, save_intermediaries_flag, ... - flat_field_flag, flat_field_path ); + bit_depth, rec_mode, file_path, img_save_type, ... + save_intermediaries_flag, flat_field_flag, flat_field_path ); %% Reconstruction fprintf('\nReconstructing Images\n'); [ img_sets ] = sim_img_reconstructer_v3( img_sets, file_path, ... - img_save_type ); + img_save_type, bit_depth ); % No Tiling or Rejection Profiles if the Image Sets are Just Random % Locations in the Sample -if ~strcmp(rec_mode, 'Misc. Image Batch') +if ~strcmp(rec_mode, 'Individual Images') %% Generate Real lp/mm fprintf('\nCalculating Line Pair/mm\n'); [ img_sets ] = pixel_widths_2_lpmm_v2( img_sets, f_number, obj_mag, ... @@ -193,7 +131,7 @@ %% Save Tiled Images as Stacks fprintf('\nSaving Tiled Image Stacks\n'); -axial_img_z_stack_saver(img_sets, file_path, img_save_type); +axial_img_z_stack_saver(img_sets, file_path, img_save_type, bit_depth); % If the Image Sets are Not Rejection Profile Based, Finish After diff --git a/Processing Code/Functions/axial_framework_pre_processing_v2.m b/Processing Code/Functions/axial_framework_pre_processing_v2.m index 848e120..ab0751a 100644 --- a/Processing Code/Functions/axial_framework_pre_processing_v2.m +++ b/Processing Code/Functions/axial_framework_pre_processing_v2.m @@ -1,6 +1,6 @@ function [ img_sets ] = axial_framework_pre_processing_v2( img_sets, ... - max_int, rec_mode, fpath, img_save_type, save_intermediaries_flag, ... - flat_field_flag, flat_field_path) + max_int, bit_depth, rec_mode, fpath, img_save_type, ... + save_intermediaries_flag, flat_field_flag, flat_field_path) %% Axial Framework Pre-Processing % By: Niklas Gahm % 2018/07/23 @@ -63,11 +63,17 @@ for i = 1:numel(img_sets) spath = [fpath '\' img_sets(i).name '\Pre-processed Images']; mkdir(spath); + wait_element = waitbar((1/numel(img_sets(i).images)), ... + sprintf('Saving Pre-Processed Sub-Images From %s', ... + img_sets(i).name)); for j = 1:numel(img_sets(i).images) - bfsave(uint8(img_sets(i).images(j).image_processed), ... + waitbar((j/numel(img_sets(i).images)), wait_element); + bfsave( img_bit_depth_converter( ... + img_sets(i).images(j).image_processed, bit_depth ), ... [spath '\' img_sets(i).images(j).name '_pre-processed' ... img_save_type]); end + close(wait_element); end end diff --git a/Processing Code/Functions/axial_img_tiling_v3.m b/Processing Code/Functions/axial_img_tiling_v3.m index ca3c473..a8ff558 100644 --- a/Processing Code/Functions/axial_img_tiling_v3.m +++ b/Processing Code/Functions/axial_img_tiling_v3.m @@ -27,7 +27,13 @@ n_rows = numel(img_sets(i).images_reconstructed) / num_x; img_sets(i).images_tiled.x_combined = cell(1,n_rows); + wait_element = waitbar((0/n_rows), sprintf('Tiling X-Rows of %s', ... + img_sets(i).name)); + for j = 1:n_rows + + waitbar(((j-1)/n_rows), wait_element); + % Initialize the X-row being built start_img = 1 + (num_x * (j-1)); mosaic = img_sets(i).images_reconstructed(start_img).image; @@ -120,6 +126,7 @@ % Save Completed X-Row img_sets(i).images_tiled.x_combined{j} = mosaic; end + close(wait_element); end @@ -128,7 +135,13 @@ n_col = numel(img_sets(i).images_tiled.x_combined) / num_y; img_sets(i).images_tiled.xy_combined = cell(1,n_col); + wait_element = waitbar((0/n_col), sprintf( ... + 'Tiling Y Column of Rows of %s', img_sets(i).name)); + for j = 1:n_col + + waitbar(((j-1)/n_col), wait_element); + % Initialize the Y-column being built start_img = 1 + (num_y * (j-1)); mosaic = img_sets(i).images_tiled.x_combined{start_img}; @@ -221,6 +234,7 @@ % Save Completed XY-Grid img_sets(i).images_tiled.xy_combined{j} = mosaic; end + close(wait_element); end @@ -229,7 +243,13 @@ % Initialize the Z-stack being built mosaic = img_sets(i).images_tiled.xy_combined{1}; + wait_element = waitbar((0/(num_z-1)), sprintf(... + 'Registering Z-Slices of %s', img_sets(i).name)); + for j = 1:(num_z-1) + + waitbar(((j-1)/(num_z-1)), wait_element); + % Tile to be added growth_tile = img_sets(i).images_tiled.xy_combined{1 + j}; @@ -298,6 +318,7 @@ % Replace old mosaic mosaic = temp_mosaic; end + close(wait_element); % Save Completed XYZ-Cube img_sets(i).images_tiled.original = mosaic; diff --git a/Processing Code/Functions/axial_img_z_stack_saver.m b/Processing Code/Functions/axial_img_z_stack_saver.m index 6df005c..8eaf828 100644 --- a/Processing Code/Functions/axial_img_z_stack_saver.m +++ b/Processing Code/Functions/axial_img_z_stack_saver.m @@ -1,4 +1,5 @@ -function [ ] = axial_img_z_stack_saver( img_sets, fpath, img_save_type ) +function [ ] = axial_img_z_stack_saver( img_sets, fpath, img_save_type, ... + bit_depth) %% Axial Image Z-Stack Saver % By: Niklas Gahm % 2018/08/03 @@ -72,15 +73,20 @@ for i = 1:numel(img_sets) spath = [fpath '\' img_sets(i).name '\Reconstructed Stack']; mkdir(spath); - bfsave(uint8(img_sets(i).images_tiled.original), ... - [spath '\' img_sets(i).name '_original' ... + wait_element = waitbar((1/3), sprintf('Saving Image Cube From %s', ... + img_sets(i).name)); + bfsave(img_bit_depth_converter( img_sets(i).images_tiled.original, ... + bit_depth ), [spath '\' img_sets(i).name '_original' ... img_save_type]); - bfsave(uint8(img_sets(i).images_tiled.medium), ... - [spath '\' img_sets(i).name '_medium' ... + waitbar((2/3), wait_element); + bfsave(img_bit_depth_converter( img_sets(i).images_tiled.medium, ... + bit_depth ), [spath '\' img_sets(i).name '_medium' ... img_save_type]); - bfsave(uint8(img_sets(i).images_tiled.small), ... - [spath '\' img_sets(i).name '_small' ... + waitbar((3/3), wait_element); + bfsave(img_bit_depth_converter( img_sets(i).images_tiled.small, ... + bit_depth ), [spath '\' img_sets(i).name '_small' ... img_save_type]); + close(wait_element); end diff --git a/Processing Code/Functions/img_bit_depth_converter.m b/Processing Code/Functions/img_bit_depth_converter.m new file mode 100644 index 0000000..236d704 --- /dev/null +++ b/Processing Code/Functions/img_bit_depth_converter.m @@ -0,0 +1,27 @@ +function [ save_img ] = img_bit_depth_converter( img, bit_depth ) +%% Image Bit Depth Converter +% By: Niklas Gahm +% 2018/11/30 +% +% This is a function which converts an input image from double to either +% 8, 16, 32, or 64 bit unsigned integer +% +% 2018/11/30 - Started +% 2018/11/30 - Finished + + + +switch bit_depth + case 8 + save_img = uint8(img); + case 16 + save_img = uint16(img); + case 32 + save_img = uint32(img); + case 64 + save_img = uint64(img); + otherwise + +end +end + diff --git a/Processing Code/Functions/sim_img_reconstructer_v3.m b/Processing Code/Functions/sim_img_reconstructer_v3.m index 4ae04a1..505913f 100644 --- a/Processing Code/Functions/sim_img_reconstructer_v3.m +++ b/Processing Code/Functions/sim_img_reconstructer_v3.m @@ -1,5 +1,5 @@ function [ img_sets ] = sim_img_reconstructer_v3( img_sets, file_path, ... - img_save_type ) + img_save_type, bit_depth ) % SIM Image Reconstruction % By: Niklas Gahm % 2017/06/29 @@ -185,11 +185,17 @@ for i = 1:numel(img_sets) spath = [file_path '\' img_sets(i).name '\Reconstructed Images']; mkdir(spath); + wait_element = waitbar((1/numel(img_sets(i).images_reconstructed)), ... + sprintf('Saving Reconstructed Images From %s', ... + img_sets(i).name)); for j = 1:numel(img_sets(i).images_reconstructed) - bfsave(uint8(img_sets(i).images_reconstructed(j).image), ... + waitbar((j/numel(img_sets(i).images_reconstructed)), wait_element); + bfsave(img_bit_depth_converter(... + img_sets(i).images_reconstructed(j).image, bit_depth), ... [spath '\' img_sets(i).images_reconstructed(j).name ... img_save_type]); end + close(wait_element); end end \ No newline at end of file