/matlab_tools/Converted/kcthematicmap.m
Objective C | 197 lines | 194 code | 3 blank | 0 comment | 82 complexity | 1db6aed349224e604359e583ac66de2d MD5 | raw file
Possible License(s): BSD-3-Clause
- %kcthematicmap 'Create a Thematic Map for a classification result '
- % This MatLab function was automatically generated by a converter (KhorosToMatLab) from the Khoros cthematicmap.pane file
- %
- % Parameters:
- % InputFile: i 'Input Classified Image', required: 'input the classified image'
- % InputFile: icsf 'Class Specification File', required: 'input the class specification file'
- % OutputFile: o 'Output Thematic Map', required: 'output the thematic map'
- %
- % Example: o = kcthematicmap({i, icsf}, {'i','';'icsf','';'o',''})
- %
- % Khoros helpfile follows below:
- %
- % PROGRAM
- % cthematicmap - Create a Thematic Map for a classification result
- %
- % DESCRIPTION
- % This program creates a thematic map from a classification result (specified with the [-i] parameter) and a class specification file (specified with the [-csf] parameter). Results will be output in the file specified with the [-o] parameter.
- % A thematic map is basically a colored version of the classification result. All classifiers in the Classify toolbox give as result an image with integer data type where each pixel has a value from 0 to the maximum number of classes specified (the specification of the maximum number of classes is different for each classifier, please refer to the classifiers' man page for details). If the classification result is used as-is for visualization, it will be difficult for the user to identify the different classes.
- % That's where a thematic map can help: for each index in the classification result, a RGB color will be assigned making the visual classes discrimination easier. Khoros' polymorphic data services makes thematic map creation very easy, the data is kept as it is but a map segment is added.
- % Two good reasons to use the cthematicmap operator instead of creating an ad-hoc colormap for the classification result are: 1) the same Class Specification File can be used for different classification techniques, and using cthematicmap to create thematic maps will give consistent results (which can be easily compared visually) and 2) it is easier to specify colors in the Class Specification File than create the colormaps visually.
- % The CSF (Class Specification File) is an ASCII file used to get the classes names for the report. Its format is very simple:
- % * lines starting with # or / are considered as comments
- % * each line defines a class: the first token is the index for that class, the second, third and fourth defines the red, green and blue values to be used for the thematic maps and the rest of the line defines the title for the class.
- % Example: the line
- % 3 255 255 0 This is the yellow class
- % defines the color for the class index 3 (255,255,0 = Yellow) and the title for the class index 3 ("This is the yellow class")
- % \fBImportant:" the index for the class in the Class Specification Format must \fBnot\fP be zero: the class zero is reserved for pixels which were rejected by the classification process. In other words, the classes indexes should be larger or equal to 1 (one).
- % \fBGuidelines for the selection of colors for the Thematic Map:" There are two basic guidelines to select colors for the thematic maps that can help creating simple, visually pleasant colormaps: 1) use colors that are as visually different as possible: for example, if you have two classes, avoid selecting colors like green (0,255,0) and yellow (255,255,0) for the classes, because they don't give good visual discrimination. Use green and red (255,0,0) instead, and 2) use colors that can be associated somehow with the classes they represent. This rule of thumb is more difficult to apply, and depend on the nature of the image being classified. For example, for classification of remotely sensed images, different tones of green (e.g. 255,0,0 and 120,150,120) could be used for forest classes, blue (0,0,255) for water, white (255,255,255) for clouds, dark gray (120,120,120) for clouds shadows and so on.
- % There is a list of colors with RGB values in the on-line Classify Toolbox Manual, please refer to it as a guideline for selecting colors. Alternatively, the Color toolbox has a program to specify visually RGB values, it will show a image with the selected RGB values and the values itself. Other methods can also be used, of course.
- %
- %
- %
- % EXAMPLES
- % All examples for the Classify toolbox are listed on the Classify Toolbox Manual. For an example of this routine, please see the example workspace Classify:workspaces:MAXLIK.
- %
- % "SEE ALSO"
- % cclassreport,
- %
- % RESTRICTIONS
- % Expect a valid Class Specification File as input, the data type for the classification result must be integer.
- %
- % REFERENCES
- % All references for the Classify toolbox are listed on the Classify Toolbox Manual.
- %
- % COPYRIGHT
- % Copyright (C) 1997 Rafael Santos. Khoros (C) Khoral Research, Inc.
- %
- function varargout = kcthematicmap(varargin)
- if nargin ==0
- Inputs={};arglist={'',''};
- elseif nargin ==1
- Inputs=varargin{1};arglist={'',''};
- elseif nargin ==2
- Inputs=varargin{1}; arglist=varargin{2};
- else error('Usage: [out1,..] = kcthematicmap(Inputs,arglist).');
- end
- if size(arglist,2)~=2
- error('arglist must be of form {''ParameterTag1'',value1;''ParameterTag2'',value2}')
- end
- narglist={'i', '__input';'icsf', '__input';'o', '__output'};
- maxval={0,0,0};
- minval={0,0,0};
- istoggle=[0,0,0];
- was_set=istoggle * 0;
- paramtype={'InputFile','InputFile','OutputFile'};
- % identify the input arrays and assign them to the arguments as stated by the user
- if ~iscell(Inputs)
- Inputs = {Inputs};
- end
- NumReqOutputs=1; nextinput=1; nextoutput=1;
- for ii=1:size(arglist,1)
- wasmatched=0;
- for jj=1:size(narglist,1)
- if strcmp(arglist{ii,1},narglist{jj,1}) % a given argument was matched to the possible arguments
- wasmatched = 1;
- was_set(jj) = 1;
- if strcmp(narglist{jj,2}, '__input')
- if (nextinput > length(Inputs))
- error(['Input ' narglist{jj,1} ' has no corresponding input!']);
- end
- narglist{jj,2} = 'OK_in';
- nextinput = nextinput + 1;
- elseif strcmp(narglist{jj,2}, '__output')
- if (nextoutput > nargout)
- error(['Output nr. ' narglist{jj,1} ' is not present in the assignment list of outputs !']);
- end
- if (isempty(arglist{ii,2}))
- narglist{jj,2} = 'OK_out';
- else
- narglist{jj,2} = arglist{ii,2};
- end
- nextoutput = nextoutput + 1;
- if (minval{jj} == 0)
- NumReqOutputs = NumReqOutputs - 1;
- end
- elseif isstr(arglist{ii,2})
- narglist{jj,2} = arglist{ii,2};
- else
- if strcmp(paramtype{jj}, 'Integer') & (round(arglist{ii,2}) ~= arglist{ii,2})
- error(['Argument ' arglist{ii,1} ' is of integer type but non-integer number ' arglist{ii,2} ' was supplied']);
- end
- if (minval{jj} ~= 0 | maxval{jj} ~= 0)
- if (minval{jj} == 1 & maxval{jj} == 1 & arglist{ii,2} < 0)
- error(['Argument ' arglist{ii,1} ' must be bigger or equal to zero!']);
- elseif (minval{jj} == -1 & maxval{jj} == -1 & arglist{ii,2} > 0)
- error(['Argument ' arglist{ii,1} ' must be smaller or equal to zero!']);
- elseif (minval{jj} == 2 & maxval{jj} == 2 & arglist{ii,2} <= 0)
- error(['Argument ' arglist{ii,1} ' must be bigger than zero!']);
- elseif (minval{jj} == -2 & maxval{jj} == -2 & arglist{ii,2} >= 0)
- error(['Argument ' arglist{ii,1} ' must be smaller than zero!']);
- elseif (minval{jj} ~= maxval{jj} & arglist{ii,2} < minval{jj})
- error(['Argument ' arglist{ii,1} ' must be bigger than ' num2str(minval{jj})]);
- elseif (minval{jj} ~= maxval{jj} & arglist{ii,2} > maxval{jj})
- error(['Argument ' arglist{ii,1} ' must be smaller than ' num2str(maxval{jj})]);
- end
- end
- end
- if ~strcmp(narglist{jj,2},'OK_out') & ~strcmp(narglist{jj,2},'OK_in')
- narglist{jj,2} = arglist{ii,2};
- end
- end
- end
- if (wasmatched == 0 & ~strcmp(arglist{ii,1},''))
- error(['Argument ' arglist{ii,1} ' is not a valid argument for this function']);
- end
- end
- % match the remaining inputs/outputs to the unused arguments and test for missing required inputs
- for jj=1:size(narglist,1)
- if strcmp(paramtype{jj}, 'Toggle')
- if (narglist{jj,2} ==0)
- narglist{jj,1} = '';
- end;
- narglist{jj,2} = '';
- end;
- if ~strcmp(narglist{jj,2},'__input') && ~strcmp(narglist{jj,2},'__output') && istoggle(jj) && ~ was_set(jj)
- narglist{jj,1} = '';
- narglist{jj,2} = '';
- end;
- if strcmp(narglist{jj,2}, '__input')
- if (minval{jj} == 0) % meaning this input is required
- if (nextinput > size(Inputs))
- error(['Required input ' narglist{jj,1} ' has no corresponding input in the list!']);
- else
- narglist{jj,2} = 'OK_in';
- nextinput = nextinput + 1;
- end
- else % this is an optional input
- if (nextinput <= length(Inputs))
- narglist{jj,2} = 'OK_in';
- nextinput = nextinput + 1;
- else
- narglist{jj,1} = '';
- narglist{jj,2} = '';
- end;
- end;
- else
- if strcmp(narglist{jj,2}, '__output')
- if (minval{jj} == 0) % this is a required output
- if (nextoutput > nargout & nargout > 1)
- error(['Required output ' narglist{jj,1} ' is not stated in the assignment list!']);
- else
- narglist{jj,2} = 'OK_out';
- nextoutput = nextoutput + 1;
- NumReqOutputs = NumReqOutputs-1;
- end
- else % this is an optional output
- if (nargout - nextoutput >= NumReqOutputs)
- narglist{jj,2} = 'OK_out';
- nextoutput = nextoutput + 1;
- else
- narglist{jj,1} = '';
- narglist{jj,2} = '';
- end;
- end
- end
- end
- end
- if nargout
- varargout = cell(1,nargout);
- else
- varargout = cell(1,1);
- end
- global KhorosRoot
- if exist('KhorosRoot') && ~isempty(KhorosRoot)
- w=['"' KhorosRoot];
- else
- if ispc
- w='"C:\Program Files\dip\khorosBin\';
- else
- [s,w] = system('which cantata');
- w=['"' w(1:end-8)];
- end
- end
- [varargout{:}]=callKhoros([w 'cthematicmap" '],Inputs,narglist);