%% Image Segmentation of the Visceral Adipose Tissue in 21 dpf ubb:plin2-tdtomato zebrafish % 2020, Dianne Lumaquin, Richard M. White Lab at MSKCC % for any questions, contact Dianne Lumaquin at dil2009@med.cornell.edu %% Pipeline requires Bio-Formats % download at https://docs.openmicroscopy.org/bio-formats/6.1.0/users/matlab/index.html %% Set up clear all close all analysis_wt_flag = 1; % run analysis on WT images analysis_mut_flag = 1; % run analysis on mut images % code demonstrates how to conduct analysis on 4 groups % modify code as needed depending on number of experimental conditions crop_wt_flag = 1; % run crop on WT images load_wtcrop_flag = 0; % load crop WT positions crop_mut_flag = 1; % run crop on mut images load_mutcrop_flag = 0; % load crop mut positions crop_mut_b_flag = 1; % run crop on mut_b load_mutcrop_b_flag = 0; % load crop mut_b positions crop_mut_c_flag = 1;% run crop on mut_c load_mutcrop_c_flag = 0;% load crop mut_c positions load_analysis_flag = 0; % load analysis .mat files showIm = 1; show_plots = 1; split_channels = 1; % bioformats plugin: save data for each channel as .mat file save_server = 1; chName = {'BF', 'mCh1', 'tdT1', 'tdT2', 'GFP1', 'GFP2'}; % list channels BF = find(strcmp(chName, 'BF')); mCh1 = find(strcmp(chName, 'mCh1')); tdT1 = find(strcmp(chName, 'tdT1')); tdT2 = find(strcmp(chName, 'tdT2')); GFP1 = find(strcmp(chName, 'GFP1')); GFP2 = find(strcmp(chName, 'GFP2')); folder_wt = ('INSERT FOLDER PATH'); folder_mut = ('INSERT FOLDER PATH'); folder_mut_b = ('INSERT FOLDER PATH'); folder_mut_c = ('INSERT FOLDER PATH'); Analysisoutput = ('INSERT FOLDER PATH'); %% %% BIOFORMATS .CZI IMPORT - WT if analysis_wt_flag fprintf('\nAnalyzing WT images...\n'); filenames_wt = fullfile(folder_wt, '*.czi'); CZI_files_wt = dir(filenames_wt); CZI_file_paths_wt = fullfile(folder_wt, {CZI_files_wt.name}); if split_channels for ii = 1:length(CZI_files_wt); reader = bfGetReader(CZI_file_paths_wt{1,ii}); fprintf('Importing WT image %d/%d\n', ii, length(CZI_files_wt)); BF_wt{1,ii} = bfGetPlane(reader,1); mCh1_wt{1,ii} = bfGetPlane(reader,2); tdT1_wt{1,ii} = bfGetPlane(reader,3); tdT2_wt{1,ii} = bfGetPlane(reader,4); GFP1_wt{1,ii} = bfGetPlane(reader,5); GFP2_wt{1,ii} = bfGetPlane(reader,6); end end % save to same folder on server where data is from: if save_server path_save_server1 = strcat(fullfile(folder_wt, 'wt_channel1.mat')); save([path_save_server1], 'BF_wt') path_save_server2 = strcat(fullfile(folder_wt, 'wt_channel2.mat')); save([path_save_server2], 'mCh1_wt') path_save_server3 = strcat(fullfile(folder_wt, 'wt_channel3.mat')); save([path_save_server3], 'tdT1_wt') path_save_server4 = strcat(fullfile(folder_wt, 'wt_channel4.mat')); save([path_save_server4], 'tdT2_wt') path_save_server5 = strcat(fullfile(folder_wt, 'wt_channel5.mat')); save([path_save_server5], 'GFP1_wt') path_save_server6 = strcat(fullfile(folder_wt, 'wt_channel6.mat')); save([path_save_server6], 'GFP2_wt') end % metadata reader = bfGetReader(CZI_file_paths_wt{1,1}); omeMeta = reader.getMetadataStore(); imageSizeX = omeMeta.getPixelsSizeX(0).getValue(); imageSizeY = omeMeta.getPixelsSizeY(0).getValue(); pixelSizeX = omeMeta.getPixelsPhysicalSizeX(0).value(); pixelSizeX_num = pixelSizeX.doubleValue(); pixelSizeY = omeMeta.getPixelsPhysicalSizeY(0).value(); pixelSizeY_num = pixelSizeY.doubleValue(); pixelSize_um2 = pixelSizeX_num * pixelSizeY_num; % save metadata metadata_wt = [pixelSize_um2 pixelSizeX_num pixelSizeY_num]; path_save_server_wt = strcat(fullfile(folder_wt, 'metadata_wt.mat')); save([path_save_server_wt], 'metadata_wt'); fprintf('wt metadata .mat saved') end %% BIOFORMATS .CZI IMPORT - MUTANT if analysis_mut_flag % mutant fprintf('\nAnalyzing mutant images...\n'); filenames_mut = fullfile(folder_mut, '*.czi'); CZI_files_mut = dir(filenames_mut); CZI_file_paths_mut = fullfile(folder_mut, {CZI_files_mut.name}); if split_channels % RUN TO SAVE ALL IMAGES/CHANNEL AS 1 .MAT: for ii = 1:length(CZI_files_mut); reader = bfGetReader(CZI_file_paths_mut{1,ii}); fprintf('Importing Mut image %d/%d\n', ii, length(CZI_files_mut)); BF_mut{1,ii} = bfGetPlane(reader,1); mCh1_mut{1,ii} = bfGetPlane(reader,2); tdT1_mut{1,ii} = bfGetPlane(reader,3); tdT2_mut{1,ii} = bfGetPlane(reader,4); GFP1_mut{1,ii} = bfGetPlane(reader,5); GFP2_mut{1,ii} = bfGetPlane(reader,6); end end % save to same folder on server where data is from: if save_server path_save_server1 = strcat(fullfile(folder_mut, 'mut_channel1.mat')); save([path_save_server1], 'BF_mut') path_save_server2 = strcat(fullfile(folder_mut, 'mut_channel2.mat')); save([path_save_server2], 'mCh1_mut') path_save_server3 = strcat(fullfile(folder_mut, 'mut_channel3.mat')); save([path_save_server3], 'tdT1_mut') path_save_server4 = strcat(fullfile(folder_mut, 'mut_channel4.mat')); save([path_save_server4], 'tdT2_mut') path_save_server5 = strcat(fullfile(folder_mut, 'mut_channel5.mat')); save([path_save_server5], 'GFP1_mut') path_save_server6 = strcat(fullfile(folder_mut, 'mut_channel6.mat')); save([path_save_server6], 'GFP2_mut') end % metadata reader = bfGetReader(CZI_file_paths_mut{1,1}); omeMeta = reader.getMetadataStore(); imageSizeX = omeMeta.getPixelsSizeX(0).getValue(); imageSizeY = omeMeta.getPixelsSizeY(0).getValue(); pixelSizeX = omeMeta.getPixelsPhysicalSizeX(0).value(); pixelSizeX_num = pixelSizeX.doubleValue(); pixelSizeY = omeMeta.getPixelsPhysicalSizeY(0).value(); pixelSizeY_num = pixelSizeY.doubleValue(); pixelSize_um2 = pixelSizeX_num * pixelSizeY_num; % save metadata metadata_mut = [pixelSize_um2 pixelSizeX_num pixelSizeY_num]; path_save_server_mut = strcat(fullfile(folder_mut, 'metadata_mut.mat')); save([path_save_server_mut], 'metadata_mut'); fprintf('mut metadata .mat saved') end %% BIOFORMATS .CZI IMPORT - MUTANT_b if analysis_mut_flag % mutant fprintf('\nAnalyzing mutant_b images...\n'); filenames_mut_b = fullfile(folder_mut_b, '*.czi'); CZI_files_mut_b = dir(filenames_mut_b); CZI_file_paths_mut_b = fullfile(folder_mut_b, {CZI_files_mut_b.name}); if split_channels % RUN TO SAVE ALL IMAGES/CHANNEL AS 1 .MAT: for ii = 1:length(CZI_files_mut_b); reader = bfGetReader(CZI_file_paths_mut_b{1,ii}); fprintf('Importing mut_b image %d/%d\n', ii, length(CZI_files_mut_b)); BF_mut_b{1,ii} = bfGetPlane(reader,1); mCh1_mut_b{1,ii} = bfGetPlane(reader,2); tdT1_mut_b{1,ii} = bfGetPlane(reader,3); tdT2_mut_b{1,ii} = bfGetPlane(reader,4); GFP1_mut_b{1,ii} = bfGetPlane(reader,5); GFP2_mut_b{1,ii} = bfGetPlane(reader,6); end end % save to same folder on server where data is from: if save_server path_save_server1 = strcat(fullfile(folder_mut_b, 'mut_b_channel1.mat')); save([path_save_server1], 'BF_mut_b') path_save_server2 = strcat(fullfile(folder_mut_b, 'mut_b_channel2.mat')); save([path_save_server2], 'mCh1_mut_b') path_save_server3 = strcat(fullfile(folder_mut_b, 'mut_b_channel3.mat')); save([path_save_server3], 'tdT1_mut_b') path_save_server4 = strcat(fullfile(folder_mut_b, 'mut_b_channel4.mat')); save([path_save_server4], 'tdT2_mut_b') path_save_server5 = strcat(fullfile(folder_mut_b, 'mut_b_channel5.mat')); save([path_save_server5], 'GFP1_mut_b') path_save_server6 = strcat(fullfile(folder_mut_b, 'mut_b_channel6.mat')); save([path_save_server6], 'GFP2_mut_b') end % metadata reader = bfGetReader(CZI_file_paths_mut_b{1,1}); omeMeta = reader.getMetadataStore(); imageSizeX = omeMeta.getPixelsSizeX(0).getValue(); imageSizeY = omeMeta.getPixelsSizeY(0).getValue(); pixelSizeX = omeMeta.getPixelsPhysicalSizeX(0).value(); pixelSizeX_num = pixelSizeX.doubleValue(); pixelSizeY = omeMeta.getPixelsPhysicalSizeY(0).value(); pixelSizeY_num = pixelSizeY.doubleValue(); pixelSize_um2 = pixelSizeX_num * pixelSizeY_num; % save metadata metadata_mut_b = [pixelSize_um2 pixelSizeX_num pixelSizeY_num]; path_save_server_mut_b = strcat(fullfile(folder_mut_b, 'metadata_mut_b.mat')); save([path_save_server_mut_b], 'metadata_mut_b'); fprintf('mut_b metadata .mat saved') end %% BIOFORMATS .CZI IMPORT - MUTANT_C if analysis_mut_flag % mutant fprintf('\nAnalyzing mutant_c images...\n'); filenames_mut_c = fullfile(folder_mut_c, '*.czi'); CZI_files_mut_c = dir(filenames_mut_c); CZI_file_paths_mut_c = fullfile(folder_mut_c, {CZI_files_mut_c.name}); if split_channels for ii = 1:length(CZI_files_mut_c); reader = bfGetReader(CZI_file_paths_mut_c{1,ii}); fprintf('Importing mut_c image %d/%d\n', ii, length(CZI_files_mut_c)); BF_mut_c{1,ii} = bfGetPlane(reader,1); mCh1_mut_c{1,ii} = bfGetPlane(reader,2); tdT1_mut_c{1,ii} = bfGetPlane(reader,3); tdT2_mut_c{1,ii} = bfGetPlane(reader,4); GFP1_mut_c{1,ii} = bfGetPlane(reader,5); GFP2_mut_c{1,ii} = bfGetPlane(reader,6); end end % save to same folder on server where data is from: if save_server path_save_server1 = strcat(fullfile(folder_mut_c, 'mut_c_channel1.mat')); save([path_save_server1], 'BF_mut_c') path_save_server2 = strcat(fullfile(folder_mut_c, 'mut_c_channel2.mat')); save([path_save_server2], 'mCh1_mut_c') path_save_server3 = strcat(fullfile(folder_mut_c, 'mut_c_channel3.mat')); save([path_save_server3], 'tdT1_mut_c') path_save_server4 = strcat(fullfile(folder_mut_c, 'mut_c_channel4.mat')); save([path_save_server4], 'tdT2_mut_c') path_save_server5 = strcat(fullfile(folder_mut_c, 'mut_c_channel5.mat')); save([path_save_server5], 'GFP1_mut_c') path_save_server6 = strcat(fullfile(folder_mut_c, 'mut_c_channel6.mat')); save([path_save_server6], 'GFP2_mut_c') end % metadata reader = bfGetReader(CZI_file_paths_mut_c{1,1}); omeMeta = reader.getMetadataStore(); imageSizeX = omeMeta.getPixelsSizeX(0).getValue(); imageSizeY = omeMeta.getPixelsSizeY(0).getValue(); pixelSizeX = omeMeta.getPixelsPhysicalSizeX(0).value(); pixelSizeX_num = pixelSizeX.doubleValue(); pixelSizeY = omeMeta.getPixelsPhysicalSizeY(0).value(); pixelSizeY_num = pixelSizeY.doubleValue(); pixelSize_um2 = pixelSizeX_num * pixelSizeY_num; % save metadata metadata_mut_c = [pixelSize_um2 pixelSizeX_num pixelSizeY_num]; path_save_server_mut_c = strcat(fullfile(folder_mut_c, 'metadata_mut_c.mat')); save([path_save_server_mut_c], 'metadata_mut_c'); fprintf('mut_c metadata .mat saved') end %% BACKGROUND CORRECTION VIA GFP: Group 1 (wt) %goal is to threshold GFP and use this to background subtract from the tdTomato channel if analyze_flag GFPthresh = 400; %change to threshold to fish gut for m = 1:length(GFP2_wt) GFP2_thresh_wt = GFP2_wt{1,m}; GFP2_thresh_wt_bg{1,m} = GFP2_thresh_wt > GFPthresh; figure; imshow(GFP2_thresh_wt_bg{1,m}) end tdT2thresh = 350; %change threshold to capture adipocytes for n = 1:length(tdT2_wt) tdT2_thresh_wt = tdT2_wt{1,n}; tdT2_thresh_wt_bg{1,n} = tdT2_thresh_wt > tdT2thresh; figure; imshow(tdT2_thresh_wt_bg{1,n}) tdT2_thresh_wt_corr{1,n} = tdT2_thresh_wt_bg{1,n} - GFP2_thresh_wt_bg{1,n}; figure; imshow(tdT2_thresh_mut_corr{1,n}) tdT2_thresh_wt_filt{1,n} = bwareafilt(im2bw(tdT2_thresh_wt_corr{1,n}),[20 500000]); figure; imshow(imfuse(BF_wt{1,n},tdT2_thresh_wt_filt{1,n},'montage')) end end %% crop images: Group 1 (wt) if analyze_flag rectpos_xy_wt = NaN(36,4); cropwindow = [0,0,1200,700]; vehfile = fullfile(folder_wt,'croppositions_veh.csv'); if crop_wt_flag %crop tdTomato image for cc = 1:length(tdT2_wt) I = tdT2_thresh_wt_filt{1,cc}; figure; imshow(I) rect = drawrectangle('Position',cropwindow,'Color','r'); pause; %make sure red box is around area of interest and then press return key currkey=get(gcf,'CurrentKey'); if currkey=='return' currkey==1 else currkey==0 end rectpos = get(rect,'Position'); rectpos_xy_wt(cc,1:4) = rectpos; crop = imcrop(I,rectpos_xy_wt(cc,1:4)); figure;imshow(crop) crop_tom{1,cc} = crop; end close all writematrix(rectpos_xy_wt,vehfile); end %load_wtcrop_flag = 1; if load_wtcrop_flag for cc = 1:length(tdT2_wt) I = tdT2_thresh_wt_filt{1,cc}; rectpos_xy_wt = readmatrix(vehfile); crop = imcrop(I,rectpos_xy_wt(cc,1:4)); figure;imshow(crop) crop_tom{1,cc} = crop; end end end %% Mask, second thresholding and final dilation: Group 1 (wt) if analyze_flag for p = 1:length(tdT2_wt) crop_GFP{1,p} = imcrop(GFP2_thresh_wt_bg{1,p},rectpos_xy_wt(p,1:4)); corr_tdT2{1,p} = crop_tom{1,p} - crop_GFP{1,p}; figure; imshow(corr_tdT2{1,p}) tdT2_filt{1,p} = bwareafilt(im2bw(corr_tdT2{1,p}),[20 500000]); figure; imshow(tdT2_filt{1,p}) se = strel('disk',2); tdT2_clean{1,p} = imopen(tdT2_filt{1,p},se); figure; imshow(tdT2_clean{1,p}) se_dilate = strel('disk',8); tdT2_dilate_wt{1,p} = imdilate(tdT2_clean{1,p},se_dilate); crop_BF_wt{1,p} = imcrop(BF_wt{1,p},rectpos_xy_wt(p,1:4)); figure; imshow(imfuse(crop_BF_wt{1,p},tdT2_dilate_wt{1,p},'montage')) end tdT2thresh2 = 430; % change to higher threshold that tdT2thresh to only segment adipocytes for q = 1:length(tdT2_wt) crop_tdT2_wt{1,q} = imcrop(tdT2_wt{1,q},rectpos_xy_wt(q,1:4)); tdT2_bg_corr{1,q} = uint16(double(tdT2_dilate_wt{1,q}) .* double(crop_tdT2_wt{1,q})); %second threshold tdT2_new = tdT2_bg_corr{1,q}; tdT2_thresh_2{1,q} = tdT2_new > tdT2thresh2; figure; imshow(tdT2_thresh_2{1,q}) tdT2_clean_3{1,q} = imclearborder(tdT2_thresh_2{1,q}); figure; imshow(imfuse(tdT2_thresh_2{1,q},tdT2_clean_3{1,q},'montage')); se2 = strel('disk',15); tdT2_clean_4{1,q} = imdilate(tdT2_clean_3{1,q},se2); figure;imshow(imfuse(tdT2_clean_3{1,q},tdT2_clean_4{1,q},'montage')); tdT2_bg_corr_2{1,q} = uint16(double(tdT2_clean_4{1,q}) .* double(crop_tdT2_wt{1,q})); figure; image_wt = imshow(imfuse(tdT2_bg_corr_2{1,q},crop_BF_wt{1,q},'montage')); baseFileName = sprintf('wt_corr%d.tif',q); fullFileName = fullfile(folder_wt, baseFileName); saveas(image_wt,fullFileName,'tif') end close all end %% BACKGROUND CORRECTION VIA GFP_mutant: Group 2 (mut) if analyze_flag GFPthresh; %change threshold depending on image for a = 1:length(GFP2_mut) GFP2_thresh_mut = GFP2_mut{1,a}; GFP2_thresh_mut_bg{1,a} = GFP2_thresh_mut > GFPthresh; figure; imshow(GFP2_thresh_mut_bg{1,a}) end tdT2thresh; for b = 1:length(tdT2_mut) tdT2_thresh_mut = tdT2_mut{1,b}; tdT2_thresh_mut_bg{1,b} = tdT2_thresh_mut > tdT2thresh; figure; imshow(tdT2_thresh_mut_bg{1,b}) tdT2_thresh_mut_corr{1,b} = tdT2_thresh_mut_bg{1,b} - GFP2_thresh_mut_bg{1,b}; figure; imshow(tdT2_thresh_mut_corr{1,b}) tdT2_thresh_mut_filt{1,b} = bwareafilt(im2bw(tdT2_thresh_mut_corr{1,b}),[20 500000]); figure; imshow(imfuse(BF_mut{1,b},tdT2_thresh_mut_filt{1,b},'montage')) end end %% Crop the images: Group 2 (mut) if analyze_flag rectpos_xy_mut = NaN(36,4); atglfile = fullfile(folder_mut,'croppositions_mut.csv'); %crop tdTomato image if crop_mut_flag for dd = 1:length(tdT2_mut) I2 = tdT2_thresh_mut_filt{1,dd}; figure; imshow(I2) rect = drawrectangle('Position',cropwindow,'Color','r'); pause; %make sure red box is around area of interest and then press return key currkey=get(gcf,'CurrentKey'); if currkey=='return' currkey==1 else currkey==0 end rectpos_mut = get(rect,'Position'); rectpos_xy_mut(dd,1:4) = rectpos_mut; crop_mut = imcrop(I2,rectpos_xy_mut(dd,1:4)); figure;imshow(crop_mut) crop_tom_mut{1,dd} = crop_mut; end close all writematrix(rectpos_xy_mut,atglfile); end if load_mutcrop_flag for dd = 1:length(tdT2_mut)% modify I2 = tdT2_thresh_mut_filt{1,dd}; rectpos_xy_mut = readmatrix(atglfile); crop_mut = imcrop(I2,rectpos_xy_mut(dd,1:4)); figure;imshow(crop_mut) crop_tom_mut{1,dd} = crop_mut; end end end %% Mask, second level thresholding and final dilation: Group 2 (mut) if analyze_flag for e = 1:length(tdT2_mut) crop_GFP_mut{1,e} = imcrop(GFP2_thresh_mut_bg{1,e},rectpos_xy_mut(e,1:4)); corr_tdT2_mut{1,e} = crop_tom_mut{1,e} - crop_GFP_mut{1,e}; figure; imshow(corr_tdT2_mut{1,e}) tdT2_filt_mut{1,e} = bwareafilt(im2bw(corr_tdT2_mut{1,e}),[20 500000]); figure; imshow(tdT2_filt{1,e}) tdT2_clean_mut{1,e} = imopen(tdT2_filt_mut{1,e},se); figure; imshow(imfuse(tdT2_filt_mut{1,e},tdT2_clean_mut{1,e},'montage')) se_dilate = strel('disk',8); tdT2_dilate_mut{1,e} = imdilate(tdT2_clean_mut{1,e},se_dilate); crop_BF_mut{1,e} = imcrop(BF_mut{1,e},rectpos_xy_mut(e,1:4)); figure; imshow(imfuse(crop_BF_mut{1,e},tdT2_dilate_mut{1,e},'montage')) end tdT2thresh2; for f = 1:length(tdT2_mut) crop_tdT2_mut{1,f} = imcrop(tdT2_mut{1,f},rectpos_xy_mut(f,1:4)); tdT2_bg_corr_mut{1,f} = uint16(double(tdT2_dilate_mut{1,f}) .* double(crop_tdT2_mut{1,f})); figure;imshow(imfuse(tdT2_bg_corr_mut{1,f},crop_BF_mut{1,f},'montage')); %check if the segmentation looks okay! %second threshold tdT2_new_mut = tdT2_bg_corr_mut{1,f}; tdT2_thresh_2_mut{1,f} = tdT2_new_mut > tdT2thresh2; figure; imshow(tdT2_thresh_2_mut{1,f}) tdT2_clean_3_mut{1,f} = imclearborder(tdT2_thresh_2_mut{1,f}); figure; imshow(imfuse(tdT2_clean_2_mut{1,f},tdT2_clean_3_mut{1,f},'montage')); tdT2_clean_4_mut{1,f} = imdilate(tdT2_clean_3_mut{1,f},se2); figure;imshow(imfuse(tdT2_clean_3_mut{1,f},tdT2_clean_4_mut{1,f},'montage')); tdT2_bg_corr_2_mut{1,f} = uint16(double(tdT2_clean_4_mut{1,f}) .* double(crop_tdT2_mut{1,f})); figure;image_mut = imshow(imfuse(tdT2_bg_corr_2_mut{1,f},crop_BF_mut{1,f},'montage')); baseFileName_mut = sprintf('mut_corr%d.tif',f); fullFileName_mut = fullfile(folder_mut, baseFileName_mut); saveas(image_mut,fullFileName_mut,'tif') end close all end %% BACKGROUND CORRECTION VIA GFP_mutant_b: Group 3 (mut_b) if analyze_flag GFPthresh; %change threshold depending on image for a = 1:length(GFP2_mut_b) GFP2_thresh_mut_b = GFP2_mut_b{1,a}; GFP2_thresh_mut_b_bg{1,a} = GFP2_thresh_mut_b > GFPthresh; figure; imshow(GFP2_thresh_mut_b_bg{1,a}) end tdT2thresh; for b = 1:length(tdT2_mut_b) tdT2_thresh_mut_b = tdT2_mut_b{1,b}; tdT2_thresh_mut_b_bg{1,b} = tdT2_thresh_mut_b > tdT2thresh; figure; imshow(tdT2_thresh_mut_b_bg{1,b}) tdT2_thresh_mut_b_corr{1,b} = tdT2_thresh_mut_b_bg{1,b} - GFP2_thresh_mut_b_bg{1,b}; figure; imshow(tdT2_thresh_mut_b_corr{1,b}) tdT2_thresh_mut_b_filt{1,b} = bwareafilt(im2bw(tdT2_thresh_mut_b_corr{1,b}),[20 500000]); figure; imshow(imfuse(BF_mut_b{1,b},tdT2_thresh_mut_b_filt{1,b},'montage')) end end %% Crop the images: Group 3 (mut_b) if analyze_flag rectpos_xy_mut_b = NaN(36,4); aurafile = fullfile(folder_mut_b,'croppositions_mut_b.csv'); %crop tdTomato image if crop_mut_b_flag for dd = 1:length(tdT2_mut_b)% modify I3 = tdT2_thresh_mut_b_filt{1,dd}; figure; imshow(I3) rect = drawrectangle('Position',cropwindow,'Color','r'); pause; %make sure red box is around area of interest and then press return key currkey=get(gcf,'CurrentKey'); if currkey=='return' currkey==1 else currkey==0 end rectpos_mut_b = get(rect,'Position'); rectpos_xy_mut_b(dd,1:4) = rectpos_mut_b; crop_mut_b = imcrop(I3,rectpos_xy_mut_b(dd,1:4)); figure;imshow(crop_mut_b) crop_tom_mut_b{1,dd} = crop_mut_b; end close all writematrix(rectpos_xy_mut_b,aurafile); end if load_mutcrop_b_flag for dd = 1:length(tdT2_mut_b)% modify I3 = tdT2_thresh_mut_b_filt{1,dd}; rectpos_xy_mut_b = readmatrix(aurafile); crop_mut_b = imcrop(I3,rectpos_xy_mut_b(dd,1:4)); figure;imshow(crop_mut_b) crop_tom_mut_b{1,dd} = crop_mut_b; end end end %% Mask, second level thresholding and final dilation: Group 3 (mut_b) if analyze_flag for e = 1:length(tdT2_mut_b) crop_GFP_mut_b{1,e} = imcrop(GFP2_thresh_mut_b_bg{1,e},rectpos_xy_mut_b(e,1:4)); corr_tdT2_mut_b{1,e} = crop_tom_mut_b{1,e} - crop_GFP_mut_b{1,e}; figure; imshow(corr_tdT2_mut_b{1,e}) tdT2_filt_mut_b{1,e} = bwareafilt(im2bw(corr_tdT2_mut_b{1,e}),[20 500000]); figure; imshow(tdT2_filt{1,e}) tdT2_clean_mut_b{1,e} = imopen(tdT2_filt_mut_b{1,e},se); figure; imshow(imfuse(tdT2_filt_mut_b{1,e},tdT2_clean_mut_b{1,e},'montage')) se_dilate = strel('disk',8); tdT2_dilate_mut_b{1,e} = imdilate(tdT2_clean_mut_b{1,e},se_dilate); figure; imshow(imfuse(tdT2_clean_mut_b{1,e},tdT2_dilate_mut_b{1,e},'montage')) end for f = 1:length(tdT2_mut_b) crop_tdT2_mut_b{1,f} = imcrop(tdT2_mut_b{1,f},rectpos_xy_mut_b(f,1:4)); crop_BF_mut_b{1,f} = imcrop(BF_mut_b{1,f},rectpos_xy_mut_b(f,1:4)); tdT2_bg_corr_mut_b{1,f} = uint16(double(tdT2_dilate_mut_b{1,f}) .* double(crop_tdT2_mut_b{1,f})); figure;imshow(imfuse(tdT2_bg_corr_mut_b{1,f},crop_BF_mut_b{1,f},'montage')); %check if the segmentation looks okay! %second threshold tdT2_new_mut_b = tdT2_bg_corr_mut_b{1,f}; tdT2_thresh_2_mut_b{1,f} = tdT2_new_mut_b > tdT2thresh2; figure; imshow(tdT2_thresh_2_mut_b{1,f}) tdT2_clean_3_mut_b{1,f} = imclearborder(tdT2_thresh_2_mut_b{1,f}); figure; imshow(imfuse(tdT2_clean_2_mut_b{1,f},tdT2_clean_3_mut_b{1,f},'montage')); tdT2_clean_4_mut_b{1,f} = imdilate(tdT2_clean_3_mut_b{1,f},se2); figure;imshow(imfuse(tdT2_clean_3_mut_b{1,f},tdT2_clean_4_mut_b{1,f},'montage')); tdT2_bg_corr_2_mut_b{1,f} = uint16(double(tdT2_clean_4_mut_b{1,f}) .* double(crop_tdT2_mut_b{1,f})); figure;image_mut_b = imshow(imfuse(tdT2_bg_corr_2_mut_b{1,f},crop_BF_mut_b{1,f},'montage')); baseFileName_mut_b = sprintf('mut_b_corr%d.tif',f); fullFileName_mut_b = fullfile(folder_mut_b, baseFileName_mut_b); saveas(image_mut_b,fullFileName_mut_b,'tif') end close all end %% BACKGROUND CORRECTION VIA GFP_mutant_c: Group 4 (mut_c) if analyze_flag GFPthresh; %change threshold depending on image for a = 1:length(GFP2_mut_c) GFP2_thresh_mut_c = GFP2_mut_c{1,a}; GFP2_thresh_mut_c_bg{1,a} = GFP2_thresh_mut_c > GFPthresh; figure; imshow(GFP2_thresh_mut_c_bg{1,a}) end tdT2thresh; for b = 1:length(tdT2_mut_c) tdT2_thresh_mut_c = tdT2_mut_c{1,b}; tdT2_thresh_mut_c_bg{1,b} = tdT2_thresh_mut_c > tdT2thresh; figure; imshow(tdT2_thresh_mut_c_bg{1,b}) tdT2_thresh_mut_c_corr{1,b} = tdT2_thresh_mut_c_bg{1,b} - GFP2_thresh_mut_c_bg{1,b}; figure; imshow(tdT2_thresh_mut_c_corr{1,b}) tdT2_thresh_mut_c_filt{1,b} = bwareafilt(im2bw(tdT2_thresh_mut_c_corr{1,b}),[20 500000]); figure; imshow(imfuse(BF_mut_c{1,b},tdT2_thresh_mut_c_filt{1,b},'montage')) end end %% Crop the images: Group 4 (mut_c) if analyze_flag rectpos_xy_mut_c = NaN(36,4); jskfile = fullfile(folder_mut_c,'croppositions_mut_c.csv'); %crop tdTomato image if crop_mut_c_flag for dd = 1:length(tdT2_mut_c)% modify I3 = tdT2_thresh_mut_c_filt{1,dd}; figure; imshow(I3) rect = drawrectangle('Position',cropwindow,'Color','r'); pause; %make sure circle is around area of interest and then press return key currkey=get(gcf,'CurrentKey'); if currkey=='return' currkey==1 else currkey==0 end rectpos_mut_c = get(rect,'Position'); rectpos_xy_mut_c(dd,1:4) = rectpos_mut_c; crop_mut_c = imcrop(I3,rectpos_xy_mut_c(dd,1:4)); figure;imshow(crop_mut_c) crop_tom_mut_c{1,dd} = crop_mut_c; end close all writematrix(rectpos_xy_mut_c,jskfile); end if load_mutcrop_c_flag for dd = 1:length(tdT2_mut_c)% modify I3 = tdT2_thresh_mut_c_filt{1,dd}; rectpos_xy_mut_c = readmatrix(jskfile); crop_mut_c = imcrop(I3,rectpos_xy_mut_c(dd,1:4)); figure;imshow(crop_mut_c) crop_tom_mut_c{1,dd} = crop_mut_c; end end end %% Mask, second level thresholding and final dilation: Group 4 (mut_c) if analyze_flag for e = 1:length(tdT2_mut_c) crop_GFP_mut_c{1,e} = imcrop(GFP2_thresh_mut_c_bg{1,e},rectpos_xy_mut_c(e,1:4)); corr_tdT2_mut_c{1,e} = crop_tom_mut_c{1,e} - crop_GFP_mut_c{1,e}; figure; imshow(corr_tdT2_mut_c{1,e}) tdT2_filt_mut_c{1,e} = bwareafilt(im2bw(corr_tdT2_mut_c{1,e}),[20 500000]); figure; imshow(tdT2_filt{1,e}) tdT2_clean_mut_c{1,e} = imopen(tdT2_filt_mut_c{1,e},se); figure; imshow(imfuse(tdT2_filt_mut_c{1,e},tdT2_clean_mut_c{1,e},'montage')) se_dilate = strel('disk',8); tdT2_dilate_mut_c{1,e} = imdilate(tdT2_clean_mut_c{1,e},se_dilate); figure; imshow(imfuse(tdT2_clean_mut_c{1,e},tdT2_dilate_mut_c{1,e},'montage')) end for f = 1:length(tdT2_mut_c) crop_tdT2_mut_c{1,f} = imcrop(tdT2_mut_c{1,f},rectpos_xy_mut_c(f,1:4)); crop_BF_mut_c{1,f} = imcrop(BF_mut_c{1,f},rectpos_xy_mut_c(f,1:4)); tdT2_bg_corr_mut_c{1,f} = uint16(double(tdT2_dilate_mut_c{1,f}) .* double(crop_tdT2_mut_c{1,f})); figure;imshow(imfuse(tdT2_bg_corr_mut_c{1,f},crop_BF_mut_c{1,f},'montage')); %check if the segmentation looks okay! %second threshold tdT2_new_mut_c = tdT2_bg_corr_mut_c{1,f}; tdT2_thresh_2_mut_c{1,f} = tdT2_new_mut_c > tdT2thresh2; figure; imshow(tdT2_thresh_2_mut_c{1,f}) tdT2_clean_3_mut_c{1,f} = imclearborder(tdT2_thresh_2_mut_c{1,f}); figure; imshow(imfuse(tdT2_clean_2_mut_c{1,f},tdT2_clean_3_mut_c{1,f},'montage')); tdT2_clean_4_mut_c{1,f} = imdilate(tdT2_clean_3_mut_c{1,f},se2); figure;imshow(imfuse(tdT2_clean_3_mut_c{1,f},tdT2_clean_4_mut_c{1,f},'montage')); tdT2_bg_corr_2_mut_c{1,f} = uint16(double(tdT2_clean_4_mut_c{1,f}) .* double(crop_tdT2_mut_c{1,f})); figure;image_mut_c = imshow(imfuse(tdT2_bg_corr_2_mut_c{1,f},crop_BF_mut_c{1,f},'montage')); baseFileName_mut_c = sprintf('mut_c_corr%d.tif',f); fullFileName_mut_c = fullfile(folder_mut_c, baseFileName_mut_c); saveas(image_mut_c,fullFileName_mut_c,'tif') end close all end %% Quantification pxCount_tdT2 = NaN(length(tdT2_mut),4); for aa = 1:length(tdT2_wt) pxCount_tdT2(aa,1) = sum(tdT2_clean_4{1,aa}(:) == 1); end for bb = 1:length(tdT2_mut) pxCount_tdT2(bb,2) = sum(tdT2_clean_4_mut{1,bb}(:) == 1); end for c = 1:length(tdT2_mut_b) pxCount_tdT2(c,3) = sum(tdT2_clean_4_mut_b{1,c}(:) == 1); end for d = 1:length(tdT2_mut_c) pxCount_tdT2(d,4) = sum(tdT2_clean_4_mut_c{1,d}(:) == 1); end Filename = fullfile(Analysisoutput, 'Plin2pixelcount.csv'); writematrix(pxCount_tdT2,Filename); %convert into area area_tdT2 = NaN(length(tdT2_mut),4); for ff = 1:length(tdT2_wt) area_tdT2(ff,1) = pxCount_tdT2(ff,1) .* metadata_wt(1,1); end for gg = 1:length(tdT2_mut) area_tdT2(gg,2) = pxCount_tdT2(gg,2) .* metadata_mut(1,1); end for hh = 1:length(tdT2_mut_b) area_tdT2(hh,3) = pxCount_tdT2(hh,3) .* metadata_mut_b(1,1); end for ii = 1:length(tdT2_mut_c) area_tdT2(ii,4) = pxCount_tdT2(ii,4) .* metadata_mut_c(1,1); end Areafilename = fullfile(Analysisoutput, 'Plin2area.csv'); writematrix(area_tdT2,Areafilename); fprintf('Analysis Complete')