0001 function [colours,scl_data]= calc_colours(img, set_value, do_colourbar)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 if nargin==0; error('calc_colours: expecting argument'); end
0087 if isstr(img) && strcmp(img,'UNIT_TEST'); do_unit_test; return; end
0088
0089 if ischar(img)
0090
0091 if nargin==1;
0092 colours= get_field(img);
0093 else
0094 colours= set_field(img, set_value);
0095 end
0096 return;
0097
0098 elseif isfield(img,'type')
0099 img_data= get_img_data( img );
0100 pp=get_colours(img(1)) ;
0101 else
0102 img_data= img;
0103
0104 if nargin==1
0105 pp=get_colours( [] );
0106 else
0107 pp=get_colours(set_value);
0108 end
0109 end
0110
0111
0112 if nargin < 3; do_colourbar = 0; end
0113 ref_lev = 'use_global';
0114
0115
0116 if isempty(img_data)
0117 colours = 'k';
0118 return;
0119 end
0120
0121 m= size(img_data,1); n=size(img_data,2);
0122
0123
0124
0125 [scl_data, ref_lev, max_scale] = ...
0126 scale_for_display( real(img_data(:)), pp.ref_level, pp.clim );
0127
0128 backgnd= isnan(scl_data);
0129 scl_data(backgnd)= mean( scl_data(~backgnd));
0130
0131 if pp.mapped_colour
0132 colours=set_mapped_colour(pp, backgnd, scl_data);
0133 colours= reshape( colours, m,n,[]);
0134 else
0135 [red,grn,blu] = blu_red_axis( pp, scl_data, backgnd );
0136 colours= reshape( [red,grn,blu],m,n,3);
0137 end
0138
0139
0140 if do_colourbar
0141 if ~pp.mapped_colour
0142 warning('Colorbar not available without mapped_colour option');
0143 else
0144 eidors_colourbar(max_scale,ref_lev,pp.cb_shrink_move)
0145 end
0146 end
0147
0148
0149
0150 function [red,grn,blu] = blu_red_axis( pp, scale_data, backgnd )
0151 if ~isfield(pp,'cmap_type')
0152 pp.cmap_type = 'blue_red';
0153 end;
0154
0155
0156
0157 W= pp.window_range; K= 3*W/(1+2*W);
0158 scale_data= sign(scale_data) .* ( ...
0159 ( K/W* abs(scale_data) ) .* (abs(scale_data)<=W) + ...
0160 (K+K/W/3*(abs(scale_data)-W)) .* (abs(scale_data)> W) );
0161
0162 switch pp.cmap_type
0163 case {'blue_red',''}
0164 [red,grn,blu]= blue_red_colours(pp,scale_data);
0165 case 'draeger'
0166 [red,grn,blu]= draeger_colours(pp,scale_data);
0167 case 'jet'
0168 [red,grn,blu]= jet_colours(pp,scale_data);
0169 case 'jetair'
0170
0171 scd = (scale_data + 0.5)/0.6;
0172 [red,grn,blu]= jet_colours(pp,scd);
0173 otherwise
0174 error(['specified cmap_type not understood:',pp.cmap_type]);
0175 end
0176
0177 red(backgnd) = pp.backgnd(1);
0178 grn(backgnd) = pp.backgnd(2);
0179 blu(backgnd) = pp.backgnd(3);
0180
0181 function [red,grn,blu]= blue_red_colours(pp,scale_data);
0182 if 0
0183 D= sign(pp.greylev+eps);
0184 glev= abs(pp.greylev);
0185 F= 3*pp.sat_adj;
0186
0187 red= D*F*abs(scale_data+D/F) - D + (D==-1);
0188 red= red.*(red>0).*(red<1) + (red>=1);
0189 red= red*(1-glev) + glev;
0190 end
0191 ofs= (pp.greylev >= 0);
0192 glev= abs(pp.greylev);
0193
0194 D= (2*ofs - 1);
0195 ofs= ofs - 2*(ofs==0);
0196 F= 3*pp.sat_adj;
0197 DF= D*F; D_F= D/F;
0198
0199 red= DF*abs(scale_data+D_F) - ofs;
0200 red= red.*(red>0).*(red<1) + (red>=1);
0201
0202 grn= DF*abs(scale_data ) - ofs;
0203 grn= grn.*(grn>0).*(grn<1) + (grn>=1);
0204
0205 blu= DF*abs(scale_data-D_F) - ofs;
0206 blu= blu.*(blu>0).*(blu<1) + (blu>=1);
0207
0208 if pp.greylev >=0
0209 red= red*(1-glev) + glev;
0210 grn= grn*(1-glev) + glev;
0211 blu= blu*(1-glev) + glev;
0212 else
0213 red= red*(1-glev);
0214 grn= grn*(1-glev);
0215 blu= blu*(1-glev);
0216 end
0217
0218 function [red,grn,blu] = draeger_colours(pp,scale_data);
0219 grn= (-scale_data>0.2) .* (-scale_data - 0.2)/0.8;
0220 red=grn + ( scale_data>0.2) .* ( scale_data - 0.2)/0.8*2/3;
0221
0222 blu= (-scale_data>0.1) .* (-scale_data - 0.1)/0.1;
0223 blu(-scale_data>0.2) = 1;
0224 blu=blu + ( scale_data>0.2) .* ( scale_data - 0.2)/0.8*2/3;
0225
0226
0227 red(red>1) = 1;
0228 grn(grn>1) = 1;
0229 blu(blu>1) = 1;
0230
0231 function [red,grn,blu] = jet_colours(pp,scale_data);
0232 grn = 2*(3/4 - abs(scale_data));
0233 grn(grn>1) = 1; grn(grn<0) = 0;
0234
0235 red = 1.5 - 2*abs(scale_data + 0.5);
0236 red(red>1) = 1; red(red<0) = 0;
0237
0238 blu = 1.5 - 2*abs(scale_data - 0.5);
0239 blu(blu>1) = 1; blu(blu<0) = 0;
0240
0241 function pp=get_colours( img );
0242 global eidors_colours;
0243 pp= eidors_colours;
0244
0245
0246 try
0247
0248 fds= fieldnames(img(1).calc_colours);
0249 for fdn= fds(:)';
0250 fdn= fdn{1};
0251 pp.( fdn ) = img(1).calc_colours.(fdn);
0252 end
0253 end
0254
0255 function BGI= backgndidx;
0256 BGI= 1;
0257
0258 function colours=set_mapped_colour(pp, backgnd, img_data)
0259
0260
0261
0262
0263
0264 ncol= pp.mapped_colour;
0265 [red,grn,blu] = blu_red_axis( pp, ...
0266 [-1,linspace(-1,1,2*ncol - 1)]', backgndidx );
0267 colormap([red,grn,blu]);
0268
0269
0270
0271 colours = img_data'; colours = colours * (ncol-1);
0272 colours = fix ( colours ); colours = colours + ncol + 1;
0273 colours(backgnd)= backgndidx;
0274
0275 function value= get_field(param);
0276 global eidors_colours;
0277 if strcmp(param,'colourmap')
0278 ncol= eidors_colours.mapped_colour;
0279 [red,grn,blu] = blu_red_axis( eidors_colours, ...
0280 [-1,linspace(-1,1,2*ncol - 1)]', backgndidx );
0281 value= [red,grn,blu];
0282 else
0283 value = getfield(eidors_colours, param);
0284 end
0285
0286 function value= set_field(param, value);
0287 global eidors_colours;
0288 eidors_colours = setfield(eidors_colours, param, value);
0289 value= eidors_colours;
0290
0291
0292 function do_unit_test
0293 img = eidors_obj('image','test');
0294
0295 img.calc_colours.mapped_colour = 127;
0296 img.calc_colours.ref_level = 'auto';
0297 img.calc_colours.sat_adj = 0.9;
0298 img.calc_colours.window_range = 0.9;
0299 img.calc_colours.greylev = -0.01;
0300
0301 img.elem_data = [-2;0;0;0;1;3];
0302 unit_test_cmp('cc01', calc_colours(img), [44; 128; 128; 128; 170; 254]);
0303
0304 imgk(1) = img; imgk(2) = img;
0305 unit_test_cmp('cc01', calc_colours(imgk), [44; 128; 128; 128; 170; 254]*[1,1]);
0306
0307 img.calc_colours.ref_level = 1;
0308 unit_test_cmp('cc02', calc_colours(img), [ 2; 86; 86; 86; 128; 212]);
0309
0310 img.calc_colours.greylev = -.1;
0311 img.calc_colours.mapped_colour = 0;
0312 img.elem_data = [-2;1;3];
0313 cm= reshape([ 0, 0.9, 0.9; 0, 0.9, 0.0643; 0.27, 0.9, 0]',[3,1,3]);
0314 unit_test_cmp('cc03', calc_colours(img), cm,1e-3)
0315
0316 img.calc_colours.greylev = .1;
0317 cm= reshape([ 0.73, 1.0, 1.0; 0.1, 0.1, 0.1; 1.0, 0.9357, 0.1],[3,1,3]);
0318 unit_test_cmp('cc04', calc_colours(img), cm,1e-3)
0319
0320 calc_colours('greylev',0);
0321 calc_colours('sat_adj',1);
0322 calc_colours('mapped_colour',4);
0323 calc_colours('backgnd',[0.5,0.5,0.5]);
0324 cc= calc_colours('colourmap');
0325 unit_test_cmp('cc05',cc, [2,2,2;4,4,4;2,4,4;0,1,4;0,0,0;4,1,0;4,4,2;4,4,4]/4,1e-4);
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337