diff --git a/src/figs/align_exernal_nanosims.fig b/src/figs/align_exernal_nanosims.fig index 875b9ee..15f7a55 100644 Binary files a/src/figs/align_exernal_nanosims.fig and b/src/figs/align_exernal_nanosims.fig differ diff --git a/src/fnc/align2images.m b/src/fnc/align2images.m index 18f5b65..697c8e3 100644 --- a/src/fnc/align2images.m +++ b/src/fnc/align2images.m @@ -1,5 +1,6 @@ %function [im1_out,im2_xyscale,rgb,f101]=align2images(v1,v2,im1,im2,im1_xyscale,im2_xyscale,log_flag1,log_flag2) -function [im1_out,im2_xyscale,f101]=align2images(v1,v2,im1,im2,im1_xyscale,im2_xyscale,log_flag1,log_flag2,symb_col) +function [im1_out,im2_xyscale,f101]=align2images(v1,v2,im1,im2,im1_vscale,im2_vscale,... + im1_xyscale,im2_xyscale,log_flag1,log_flag2,symb_col) N = size(v1,2); @@ -60,7 +61,8 @@ % main_GUI:Preferences->Additional Output Options %sc1 = find_image_scale(im1(im1>0),0,additional_settings.autoscale_quantiles, log_flag1,0); % autoscale image based on min/max values -sc1 = find_image_scale(im1(im1>0),1,additional_settings.autoscale_quantiles, log_flag1,0); +% sc1 = find_image_scale(im1(im1>0),1,additional_settings.autoscale_quantiles, log_flag1,0); +sc1 = im1_vscale; % warp the image, using the maximum as the FillValues (usually maximum is % white in the BW images, which is a reasonable choice) @@ -151,7 +153,8 @@ % transform output images before passing them for display % first the nanosims image -sc2 = find_image_scale(im2,0,additional_settings.autoscale_quantiles, log_flag2,0); +%sc2 = find_image_scale(im2,0,additional_settings.autoscale_quantiles, log_flag2,0); +sc2 = im2_vscale; if log_flag2 im2 = log10(im2); sc2 = log10(sc2); diff --git a/src/fnc/align2images_2points.m b/src/fnc/align2images_2points.m index 57703d7..95b58dc 100644 --- a/src/fnc/align2images_2points.m +++ b/src/fnc/align2images_2points.m @@ -1,10 +1,11 @@ -function [ext5,im1_xyscale,rgb,f100]=align2images_2points(v1,v2,im1,im2,im1_xyscale,im2_xyscale,log_flag1,log_flag2,tflag) +function [ext5,im1_xyscale,rgb,f100]=align2images_2points(v1,v2,im1,im2,im1_vscale,im2_vscale,... + im1_xyscale,im2_xyscale,log_flag1,log_flag2,tflag) % align im1 to im2 based on two points global additional_settings; -if nargin>8 +if nargin>10 fill_v = 1*(tflag>0); else fill_v = quantile(im1(:),additional_settings.autoscale_quantiles(1)); @@ -196,7 +197,8 @@ rgb = zeros(size(im2,1),size(im2,2),3); im1 = ext5; -sc1 = find_image_scale(im1(im1>0),0,additional_settings.autoscale_quantiles, log_flag1,0); +%sc1 = find_image_scale(im1(im1>0),0,additional_settings.autoscale_quantiles, log_flag1,0); +sc1 = im1_vscale; if log_flag1 im1 = log10(im1); sc1 = log10(sc1); @@ -208,7 +210,8 @@ meanv1 = (meanv1-sc1(1))/diff(sc1); im2 = nanosimsimage; -sc2 = find_image_scale(im2,0,additional_settings.autoscale_quantiles, log_flag2,0); +%sc2 = find_image_scale(im2,0,additional_settings.autoscale_quantiles, log_flag2,0); +sc2 = im2_vscale; if log_flag2 im2 = log10(im2); sc2 = log10(sc2); diff --git a/src/fnc/align_exernal_nanosims.m b/src/fnc/align_exernal_nanosims.m index 284842e..ce4a19c 100644 --- a/src/fnc/align_exernal_nanosims.m +++ b/src/fnc/align_exernal_nanosims.m @@ -498,6 +498,11 @@ function show_alignment_Callback(hObject, eventdata, handles) log_flag1 = get(handles.checkbox1,'value'); log_flag2 = get(handles.checkbox2,'value'); +ext_vscale = str2num([get(handles.min_ext,'String'), ... + ' ', get(handles.max_ext,'String')]); +ns_vscale = str2num([get(handles.min_ns,'String'), ... + ' ', get(handles.max_ns,'String')]); + if hObject == handles.show_alignment4 % set flags set(handles.show_alignment4,'Checked','on'); @@ -506,9 +511,10 @@ function show_alignment_Callback(hObject, eventdata, handles) align_type = 4; % align based on multiple (>4) points v1 = round(handles.extplist'); - v2 = round(handles.nanosimsplist'); + v2 = round(handles.nanosimsplist'); [ext_aligned, ext_aligned_xyscale, f_aligned] = ... align2images(v1,v2,handles.extimage,handles.nanosimsimage,... + ext_vscale, ns_vscale,... handles.extimage_xyscale,handles.nanosimsimage_xyscale,... log_flag1,log_flag2,handles.points_color_symbol); @@ -543,7 +549,9 @@ function show_alignment_Callback(hObject, eventdata, handles) s2 = size(im2,2); end [ext_aligned, ext_aligned_xyscale, rgb_aligned, f_aligned] = ... - align_interactively(im1,im2,s1,s2,log_flag1,log_flag2); + align_interactively(im1,im2,... + ext_vscale, ns_vscale,... + s1,s2,log_flag1,log_flag2); elseif hObject == handles.show_alignment2 % set flags @@ -575,6 +583,7 @@ function show_alignment_Callback(hObject, eventdata, handles) extimage_xyscale = handles.extimage_xyscale * size(im1,2)/size(handles.extimage,2); [ext_aligned, ext_aligned_xyscale, rgb_aligned, f_aligned] = ... align2images_2points(v1,v2,im1,im2,... + ext_vscale, ns_vscale,... extimage_xyscale,handles.nanosimsimage_xyscale,... log_flag1,log_flag2); @@ -630,6 +639,10 @@ function export_aligned_external_Callback(hObject, eventdata, handles) % rescale it first to 0->255 im1 = handles.ext_aligned; sc1 = find_image_scale(im1(im1>0),0,additional_settings.autoscale_quantiles,0,0); + min1 = str2num(get(handles.min_ext,'String')); + max1 = str2num(get(handles.max_ext,'String')); + if isnumeric(min1), sc1(1)=min1; end + if isnumeric(max1), sc1(2)=max1; end im1 = (im1-sc1(1))/diff(sc1); im1(im1<0)=0; im1(im1>1)=1; @@ -800,6 +813,10 @@ function load_external_image_Callback(hObject, eventdata, handles) a.mag_factor_used = 1; end mag_factor_used = a.mag_factor_used; + if isfield(a,'vscale') + set(handles.min_ext,'String',num2str(a.vscale(1))); + set(handles.max_ext,'String',num2str(a.vscale(2))); + end else im=double(imread(handles.extimagefile)); xyscale = size(im,2); @@ -821,6 +838,10 @@ function load_external_image_Callback(hObject, eventdata, handles) %global additional_settings; %sc=quantile(double(im(:)),additional_settings.autoscale_quantiles); sc = find_image_scale(double(im)); + min1 = str2num(get(handles.min_ext,'String')); + max1 = str2num(get(handles.max_ext,'String')); + if isnumeric(min1), sc(1)=min1; end + if isnumeric(max1), sc(2)=max1; end imagesc(im,sc); global additional_settings; colormap(get_colormap(additional_settings.colormap)); @@ -872,6 +893,8 @@ function load_nanosims_image_Callback(hObject, eventdata, handles) image(im); else sc=vscale; + set(handles.min_ns,'String',num2str(vscale(1))); + set(handles.max_ns,'String',num2str(vscale(2))); imagesc(im,sc); colormap(get_colormap(additional_settings.colormap)); end @@ -1186,6 +1209,10 @@ function update_points_Callback(hObject, eventdata, handles) if ~isempty(im) axes(ax); hold off sc = find_image_scale(im,0,additional_settings.autoscale_quantiles, log_flag,0); + min1 = str2num(get(handles.min_ext,'String')); + max1 = str2num(get(handles.max_ext,'String')); + if isnumeric(min1), sc(1)=min1; end + if isnumeric(max1), sc(2)=max1; end if size(im,3)>1 if log_flag im = log10(im); @@ -1199,6 +1226,10 @@ function update_points_Callback(hObject, eventdata, handles) if log_flag im = log10(im); sc = log10(sc); + if isinf(sc(1)), sc(1)=sc(2)-3; end + end + if contains(get(hObject,'Tag'),'min_') || contains(get(hObject,'Tag'),'max_') + fprintf(1,'Ext image scale set to [%.2e, %.2e]\n', sc); end imagesc(im, sc); colormap(get_colormap(additional_settings.colormap)); @@ -1231,6 +1262,10 @@ function update_points_Callback(hObject, eventdata, handles) if ~isempty(im) axes(ax); hold off; sc = find_image_scale(im,0,additional_settings.autoscale_quantiles, log_flag,0); + min1 = str2num(get(handles.min_ns,'String')); + max1 = str2num(get(handles.max_ns,'String')); + if isnumeric(min1), sc(1)=min1; end + if isnumeric(max1), sc(2)=max1; end if size(im,3)>1 if log_flag im = log10(im); @@ -1244,6 +1279,10 @@ function update_points_Callback(hObject, eventdata, handles) if log_flag im = log10(im); sc = log10(sc); + if isinf(sc(1)), sc(1)=sc(2)-3; end + end + if contains(get(hObject,'Tag'),'min_') || contains(get(hObject,'Tag'),'max_') + fprintf(1,'Nanosims image scale set to [%.2e, %.2e]\n', sc); end imagesc(im, sc); colormap(get_colormap(additional_settings.colormap)); diff --git a/src/fnc/align_interactively.m b/src/fnc/align_interactively.m index 0c1e8c8..6b59fcc 100644 --- a/src/fnc/align_interactively.m +++ b/src/fnc/align_interactively.m @@ -1,4 +1,5 @@ -function [im_out,im1_xyscale,rgb,f102] = align_interactively(im1,im2,im1_xyscale,im2_xyscale,log_flag1,log_flag2,tflag) +function [im_out,im1_xyscale,rgb,f102] = align_interactively(im1,im2,im1_vscale,im2_vscale,... + im1_xyscale,im2_xyscale,log_flag1,log_flag2,tflag) % default output im_out = []; @@ -16,10 +17,11 @@ global additional_settings; -if nargin>6 +if nargin>8 fill_v = 1*(tflag>0); else - fill_v = quantile(im1(:),additional_settings.autoscale_quantiles(1)); + %fill_v = quantile(im1(:),additional_settings.autoscale_quantiles(1)); + fill_v = im1_vscale(1); end % rescale image im1 so that it matches true dimensions of im2 @@ -74,7 +76,8 @@ fprintf(1,'ERROR: Sizes of the external and nanosims images are not in proportion.\n'); fprintf(1,'Please zoom in the external image to correct this.\n'); else - sc1 = find_image_scale(im1s(im1s>0),0,additional_settings.autoscale_quantiles, log_flag1,0); + %sc1 = find_image_scale(im1s(im1s>0),0,additional_settings.autoscale_quantiles, log_flag1,0); + sc1 = im1_vscale; if log_flag1 im1s = log10(im1s); sc1 = log10(sc1); @@ -83,7 +86,8 @@ im1s(im1s<0)=0; im1s(im1s>1)=1; - sc2 = find_image_scale(im2s,0,additional_settings.autoscale_quantiles, log_flag2,0); + %sc2 = find_image_scale(im2s,0,additional_settings.autoscale_quantiles, log_flag2,0); + sc2 = im2_vscale; if log_flag2 im2s = log10(im2s); sc2 = log10(sc2); diff --git a/src/fnc/display_RGB_image.m b/src/fnc/display_RGB_image.m index 338067f..4f29bc6 100644 --- a/src/fnc/display_RGB_image.m +++ b/src/fnc/display_RGB_image.m @@ -8,7 +8,7 @@ global additional_settings; -if ~isempty(rgb7) | ~isempty(rgb8) +if ~isempty(rgb7) || ~isempty(rgb8) for ii=1:2 if ii==1 @@ -17,7 +17,7 @@ else rgb=rgb8; plotopt=opt1(8); - end; + end if plotopt @@ -101,34 +101,34 @@ % export RGB image (as eps and tif) if(opt1(11)) - if(~isempty(xl) & ~isempty(yl) & ~isempty(zl)) + if(~isempty(xl) && ~isempty(yl) && ~isempty(zl)) xyfile0=[xl,'-vs-',yl,'-vs-',zl]; else if(isempty(xl)) xyfile0=[yl,'-vs-',zl]; - end; + end if(isempty(yl)) xyfile0=[xl,'-vs-',zl]; - end; + end if(isempty(zl)) xyfile0=[xl,'-vs-',yl]; - end; - end; + end + end if(ii==1) ext='-rgb'; ext_cmyk = '-cmyk'; else ext='-rgba'; ext_cmyk = '-cmyka'; - end; + end xyfile=convert_string_for_texoutput([xyfile0,ext]); xyfile=[xyfile,'.eps']; xyfile=[p.fdir,'eps',delimiter,xyfile]; epsdir = fileparts(xyfile); - if(~isdir(epsdir)) + if(~isfolder(epsdir)) mkdir(epsdir); fprintf(1,'Directory %s did not exist, so it was created.\n',epsdir); - end; + end print_figure(mf,xyfile,additional_settings.print_factors(1)); outfname = mepstopdf(xyfile,'epstopdf'); outfname = regexprep(outfname,'\','/'); @@ -136,16 +136,16 @@ rgb7_fname = outfname; else rgb8_fname = outfname; - end; + end xyfile=convert_string_for_texoutput([xyfile0,ext]); xyfile=[xyfile, '.tif']; xyfile_cmyk=convert_string_for_texoutput([xyfile0,ext_cmyk]); xyfile_cmyk=[xyfile_cmyk, '.tif']; tifdir=[p.fdir, 'tif']; - if(~isdir(tifdir)) + if(~isfolder(tifdir)) mkdir(tifdir); fprintf(1,'Directory %s did not exist, so it was created.\n',tifdir); - end; + end xyfile=[p.fdir,'tif',delimiter,xyfile]; xyfile_cmyk=[p.fdir,'tif',delimiter,xyfile_cmyk]; Nbits = 8; @@ -158,7 +158,8 @@ % also save the image as CMYK outprof = iccread('USSheetfedCoated.icc'); inprof = iccread('sRGB.icm'); - C = makecform('icc',inprof,outprof); + C = makecform('icc',inprof,outprof); + rgb(isnan(rgb(:)))=0; % set NaN to 0 cmyk = applycform(rgb, C); imwrite(cmyk, xyfile_cmyk); %a = 0; diff --git a/src/lookatnanosims.m b/src/lookatnanosims.m index b15840d..6d91812 100644 --- a/src/lookatnanosims.m +++ b/src/lookatnanosims.m @@ -202,6 +202,7 @@ % counts, and the corresponding ion count ratios, % will be calculated by accumulating only the % specified planes. +LANS_version = '2024-01-18'; % Bugs in align_external_image due to autoscale fixed. % name of the external image file (empty by default) EXTERNAL_IMAGEFILE = ''; @@ -219,7 +220,7 @@ fprintf(1,'Written by Lubos Polerecky \n') fprintf(1,'(2008-2012) Max-Planck Institute for Marine Microbiology, Bremen\n') fprintf(1,'Updates by Lubos Polerecky \n') - fprintf(1,'(2013-2023) Utrecht University\n') + fprintf(1,'(2013-2024) Utrecht University\n') fprintf(1,'More info: http://nanosims.geo.uu.nl/LANS\n') fprintf(1,'================================================================\n') fprintf(1,'Enjoy your work!\n')