Skip to content

Commit

Permalink
fixing a bug in alignment of external image due to autoscaling
Browse files Browse the repository at this point in the history
new LANS version from now on
alignment gui still needs to be updated for the windows version of LANS.
  • Loading branch information
lpolerecky committed Jan 18, 2024
1 parent 7282876 commit bf92d9f
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 29 deletions.
Binary file modified src/figs/align_exernal_nanosims.fig
Binary file not shown.
9 changes: 6 additions & 3 deletions src/fnc/align2images.m
Original file line number Diff line number Diff line change
@@ -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);

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
11 changes: 7 additions & 4 deletions src/fnc/align2images_2points.m
Original file line number Diff line number Diff line change
@@ -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));
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
43 changes: 41 additions & 2 deletions src/fnc/align_exernal_nanosims.m
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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);

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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));
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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));
Expand Down Expand Up @@ -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);
Expand All @@ -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));
Expand Down
14 changes: 9 additions & 5 deletions src/fnc/align_interactively.m
Original file line number Diff line number Diff line change
@@ -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 = [];
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
29 changes: 15 additions & 14 deletions src/fnc/display_RGB_image.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
global additional_settings;


if ~isempty(rgb7) | ~isempty(rgb8)
if ~isempty(rgb7) || ~isempty(rgb8)

for ii=1:2
if ii==1
Expand All @@ -17,7 +17,7 @@
else
rgb=rgb8;
plotopt=opt1(8);
end;
end

if plotopt

Expand Down Expand Up @@ -101,51 +101,51 @@

% 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,'\','/');
if ii==1
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;
Expand All @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion src/lookatnanosims.m
Original file line number Diff line number Diff line change
Expand Up @@ -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 = '';
Expand All @@ -219,7 +220,7 @@
fprintf(1,'Written by Lubos Polerecky <lpolerec (at) mpi-bremen.de>\n')
fprintf(1,'(2008-2012) Max-Planck Institute for Marine Microbiology, Bremen\n')
fprintf(1,'Updates by Lubos Polerecky <l.polerecky (at) uu.nl>\n')
fprintf(1,'(2013-2023) Utrecht University\n')
fprintf(1,'(2013-2024) Utrecht University\n')
fprintf(1,'More info: http:https://nanosims.geo.uu.nl/LANS\n')
fprintf(1,'================================================================\n')
fprintf(1,'Enjoy your work!\n')
Expand Down

0 comments on commit bf92d9f

Please sign in to comment.