source: trunk/src/series/ima_levels.m @ 504

Last change on this file since 504 was 478, checked in by sommeria, 12 years ago

series fcts updated to fit with new waitbar fct and background run mode, and various bug repairs

File size: 9.2 KB
Line 
1%'ima_levels': rescale the image intensity to reduce strong luminosity peaks (their blinking effects often perturbs PIV))
2% this function can be used as a template for applying a transform (here 'levels.m') to each image of a series
3%------------------------------------------------------------------------
4% function GUI_input=ima_levels(Param)
5%
6%%%%%%%%%%% GENERAL TO ALL SERIES ACTION FCTS %%%%%%%%%%%%%%%%%%%%%%%%%%%
7%
8% This function is used in four modes by the GUI series:
9%           1) config GUI: with no input argument, the function determine the suitable GUI configuration
10%           2) interactive input: the function is used to interactively introduce input parameters, and then stops
11%           3) RUN: the function itself runs, when an appropriate input  structure Param has been introduced.
12%           4) BATCH: the function itself proceeds in BATCH mode, using an xml file 'Param' as input.
13%
14%OUTPUT
15% GUI_input=list of options in the GUI series.fig needed for the function
16%
17%INPUT:
18% In run mode, the input parameters are given as a Matlab structure Param copied from the GUI series.
19% In batch mode, Param is the name of the corresponding xml file containing the same information
20% In the absence of input (as activated when the current Action is selected
21% in series), the function ouput GUI_input set the activation of the needed GUI elements
22%
23% Param contains the elements:(use the menu bar command 'export/GUI config' in series to see the current structure Param)
24%    .InputTable: cell of input file names, (several lines for multiple input)
25%                      each line decomposed as {RootPath,SubDir,Rootfile,NomType,Extension}
26%    .OutputSubDir: name of the subdirectory for data outputs
27%    .OutputDir: directory for data outputs, including path
28%    .Action: .ActionName: name of the current activated function
29%             .ActionPath:   path of the current activated function
30%    .IndexRange: set the file or frame indices on which the action must be performed
31%    .FieldTransform: .TransformName: name of the selected transform function
32%                     .TransformPath:   path  of the selected transform function
33%                     .TransformHandle: corresponding function handle
34%    .InputFields: sub structure describing the input fields withfields
35%              .FieldName: name of the field
36%              .VelType: velocity type
37%              .FieldName_1: name of the second field in case of two input series
38%              .VelType_1: velocity type of the second field in case of two input series
39%    .ProjObject: %sub structure describing a projection object (read from ancillary GUI set_object)
40%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41 
42function GUI_input=ima_levels (Param)
43
44%% set the input elements needed on the GUI series when the action is selected in the menu ActionName
45if ~exist('Param','var') % case with no input parameter
46    GUI_input={'NbViewMax';1;...% max nbre of input file series (default='' , no limitation)
47        'AllowInputSort';'off';...% allow alphabetic sorting of the list of input files (options 'off'/'on', 'off' by default)
48        'NbSlice';'off'; ...%nbre of slices ('off' by default)
49        'VelType';'off';...% menu for selecting the velocity type (options 'off'/'one'/'two',  'off' by default)
50        'FieldName';'off';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
51        'FieldTransform'; 'off';...%can use a transform function
52        'ProjObject';'off';...%can use projection object(option 'off'/'on',
53        'Mask';'off';...%can use mask option   (option 'off'/'on', 'off' by default)
54        'OutputDirExt';'.lev';...%set the output dir extension
55               ''};
56        return
57end
58
59%%%%%%%%%%%% STANDARD PART (DO NOT EDIT) %%%%%%%%%%%%
60%% select different modes,  RUN, parameter input, BATCH
61% BATCH  case: read the xml file for batch case
62if ischar(Param)
63    if strcmp(Param,'input?')
64        checkrun=1;% will inly search input parameters (preparation of BATCH mode)
65    else
66        Param=xml2struct(Param);
67        checkrun=0;
68    end
69% RUN case: parameters introduced as the input structure Param
70else
71    hseries=guidata(Param.hseries);%handles of the GUI series
72    checkrun=2; % indicate the RUN option is used
73end
74
75%% root input file(s) and type
76RootPath=Param.InputTable(:,1);
77RootFile=Param.InputTable(:,3);
78SubDir=Param.InputTable(:,2);
79NomType=Param.InputTable(:,4);
80FileExt=Param.InputTable(:,5);
81
82% get the set of input file names (cell array filecell), and the lists of
83% input file or frame indices i1_series,i2_series,j1_series,j2_series
84[filecell,i1_series,i2_series,j1_series,j2_series]=get_file_series(Param);
85% filecell{iview,fileindex}: cell array representing the list of file names
86%        iview: line in the table corresponding to a given file series
87%        fileindex: file index within  the file series,
88% i1_series(iview,ref_j,ref_i)... are the corresponding arrays of indices i1,i2,j1,j2, depending on the input line iview and the two reference indices ref_i,ref_j
89% i1_series(iview,fileindex) expresses the same indices as a 1D array in file indices
90% set of frame indices used for movie or multimage input
91% numbers of slices and file indices
92
93NbSlice=1;%default
94if isfield(Param.IndexRange,'NbSlice')
95    NbSlice=Param.IndexRange.NbSlice;
96end
97nbview=numel(i1_series);%number of input file series (lines in InputTable)
98nbfield_j=size(i1_series{1},1); %nb of fields for the j index (bursts or volume slices)
99nbfield_i=size(i1_series{1},2); %nb of fields for the i index
100nbfield=nbfield_j*nbfield_i; %total number of fields
101nbfield_i=floor(nbfield/NbSlice);%total number of  indexes in a slice (adjusted to an integer number of slices)
102nbfield=nbfield_i*NbSlice; %total number of fields after adjustement
103
104%determine the file type on each line from the first input file
105ImageTypeOptions={'image','multimage','mmreader','video'};%allowed input file types(images)
106
107[FileType{1},FileInfo{1},MovieObject{1}]=get_file_type(filecell{1,1});
108CheckImage{1}=~isempty(find(strcmp(FileType,ImageTypeOptions)));% =1 for images
109if ~isempty(j1_series{1})
110    frame_index{1}=j1_series{1};
111else
112    frame_index{1}=i1_series{1};
113end
114
115%% calibration data and timing: read the ImaDoc files
116%not relevant for this function
117
118%% check coincidence in time for several input file series
119%not relevant for this function
120
121%% coordinate transform or other user defined transform
122%not relevant for this function
123
124%%%%%%%%%%%% END STANDARD PART  %%%%%%%%%%%%
125 % EDIT FROM HERE
126
127 %% check the validity of  input file types
128if CheckImage{1}
129    FileExtOut='.png'; % write result as .png images for image inputs
130    if strcmp(lower(NomType{1}(end)),'a')
131        NomTypeOut=NomType{1};
132    else
133        NomTypeOut='_1_1';
134    end
135else
136    msgbox_uvmat('ERROR',['invalid file type input: ' FileType{1} ' not an image'])
137    return
138end
139
140%% Set field names and velocity types
141%not relevant for this function
142
143%% Initiate output fields
144%not relevant for this function
145
146%% set processing parameters
147% not needed for this function
148
149%% update the xml file
150% not needed for this function
151
152%% main loop on images
153j1=[];%default
154for ifile=1:nbfield
155    if checkrun
156        update_waitbar(hseries.Waitbar,ifile/nbfield)
157        stopstate=get(hseries.RUN,'BusyAction');
158    else
159        stopstate='queue';
160    end
161    if isequal(stopstate,'queue') % enable STOP command
162        if ~isempty(j1_series)
163            j1=j1_series{1}(ifile);
164        end
165        filename=fullfile_uvmat(RootPath{1},SubDir{1},RootFile{1},FileExt{1},NomType{1},i1_series{1}(ifile),[],j1);
166        A=read_image(filename,FileType{1},MovieObject{1},frame_index{1}(ifile));
167        if ndims(A)==3;%color images
168            A=sum(double(Aread),3);% take the sum of color components
169        end
170        % operation on images
171        A=levels(A);
172        filename_new=fullfile_uvmat(RootPath{1},Param.OutputSubDir,RootFile{1},FileExtOut,NomTypeOut,i1_series{1}(ifile),[],j1);
173        imwrite(A,filename_new)
174        display([filename_new ' written'])
175    end
176end
177%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
178
179
180function C=levels(A)
181%whos A;
182B=double(A(:,:,1));
183windowsize=round(min(size(B,1),size(B,2))/20);
184windowsize=floor(windowsize/2)*2+1;
185ix=[1/2-windowsize/2:-1/2+windowsize/2];%
186%del=np/3;
187%fct=exp(-(ix/del).^2);
188fct2=cos(ix/(windowsize-1)/2*pi/2);
189%Mfiltre=(ones(5,5)/5^2);
190%Mfiltre=fct2';
191Mfiltre=fct2'*fct2;
192Mfiltre=Mfiltre/(sum(sum(Mfiltre)));
193
194C=filter2(Mfiltre,B);
195C(:,1:windowsize)=C(:,windowsize)*ones(1,windowsize);
196C(:,end-windowsize+1:end)=C(:,end-windowsize+1)*ones(1,windowsize);
197C(1:windowsize,:)=ones(windowsize,1)*C(windowsize,:);
198C(end-windowsize+1:end,:)=ones(windowsize,1)*C(end-windowsize,:);
199C=tanh(B./(2*C));
200[n,c]=hist(reshape(C,1,[]),100);
201% figure;plot(c,n);
202
203[m,i]=max(n);
204c_max=c(i);
205[dummy,index]=sort(abs(c-c(i)));
206n=n(index);
207c=c(index);
208i_select = find(cumsum(n)<0.95*sum(n));
209if isempty(i_select)
210    i_select = 1:length(c);
211end
212c_select=c(i_select);
213n_select=n(i_select);
214cmin=min(c_select);
215cmax=max(c_select);
216C=(C-cmin)/(cmax-cmin)*256;
217C=uint8(C);
Note: See TracBrowser for help on using the repository browser.