Commit 5d272e9b47de683acff2e89e6b53fb44b8c27107
1 parent
f28202b1
added matlab files
Showing
6 changed files
with
220 additions
and
0 deletions
Show diff stats
1 | +function result = stimBrewerColormap(R) | ||
2 | + | ||
3 | +%returns a Brewer colormap with the specified resolution R | ||
4 | + | ||
5 | +ctrlPts = zeros(11, 3); | ||
6 | + | ||
7 | +ctrlPts(1, :) = [0.192157, 0.211765, 0.584314]; | ||
8 | +ctrlPts(2, :) = [0.270588, 0.458824, 0.705882]; | ||
9 | +ctrlPts(3, :) = [0.454902, 0.678431, 0.819608]; | ||
10 | +ctrlPts(4, :) = [0.670588, 0.85098, 0.913725]; | ||
11 | +ctrlPts(5, :) = [0.878431, 0.952941, 0.972549]; | ||
12 | +ctrlPts(6, :) = [1, 1, 0.74902]; | ||
13 | +ctrlPts(7, :) = [0.996078, 0.878431, 0.564706]; | ||
14 | +ctrlPts(8, :) = [0.992157, 0.682353, 0.380392]; | ||
15 | +ctrlPts(9, :) = [0.956863, 0.427451, 0.262745]; | ||
16 | +ctrlPts(10, :) = [0.843137, 0.188235, 0.152941]; | ||
17 | +ctrlPts(11, :) = [0.647059, 0, 0.14902]; | ||
18 | + | ||
19 | +X = 1:11; | ||
20 | + | ||
21 | +r = 1:11/R:11; | ||
22 | + | ||
23 | +R = interp1(X, ctrlPts(:, 1), r); | ||
24 | +G = interp1(X, ctrlPts(:, 2), r); | ||
25 | +B = interp1(X, ctrlPts(:, 3), r); | ||
26 | + | ||
27 | +result = [R' G' B']; | ||
28 | + |
1 | +function s = enviLoadHeader(filename) | ||
2 | +%create a cell array of fields | ||
3 | +s = struct; | ||
4 | + | ||
5 | +fid = fopen(filename, 'r', 'n', 'US-ASCII'); | ||
6 | + | ||
7 | +%read the first field and make sure it is "ENVI" | ||
8 | +fname = GetFieldName(fid); | ||
9 | +if strcmp(fname, 'ENVI') == 0 | ||
10 | + disp('Not an ENVI header file'); | ||
11 | + return; | ||
12 | +end | ||
13 | + | ||
14 | +while feof(fid) == 0 | ||
15 | + fname = GetFieldName(fid); | ||
16 | + if feof(fid) == 1 | ||
17 | + return; | ||
18 | + end | ||
19 | + [value, valid] = ReadField(fid, fname); | ||
20 | + if valid == 1 | ||
21 | + s = setfield(s, fname, value); | ||
22 | + end | ||
23 | +end | ||
24 | +fclose(fid); | ||
25 | + | ||
26 | +function t = GetFieldName(fid) | ||
27 | +string_struct = textscan(fid, '%s', 1, 'Delimiter', '='); | ||
28 | +if feof(fid) == 1 | ||
29 | + t = []; | ||
30 | + return; | ||
31 | +end | ||
32 | +t = string_struct{1}{1}; | ||
33 | +t = strtrim(t); | ||
34 | +t(t==' ') = '_'; | ||
35 | + | ||
36 | +function [v, valid] = ReadField(fid, field_name) | ||
37 | +valid = 1; | ||
38 | +stringFields = {'file_type', 'interleave', 'sensor_type', 'wavelength_units'}; | ||
39 | +intFields = {'samples', 'lines', 'bands', 'header_offset', 'data_type', 'byte_order'}; | ||
40 | + | ||
41 | +%if the field is "description", read between the brackets | ||
42 | +if strcmp(field_name, 'description') == 1 | ||
43 | + textscan(fid, '%[{]', 1); | ||
44 | + string_struct = textscan(fid, '%[^}]', 1, 'Whitespace', ''); | ||
45 | + textscan(fid, '%[}]', 1); | ||
46 | + v = string_struct{1}{1}; | ||
47 | + v = strtrim(v); | ||
48 | + return; | ||
49 | +end | ||
50 | +if max(strcmp(field_name, intFields)) ~= 0 | ||
51 | + v = fscanf(fid, '%d'); | ||
52 | + return; | ||
53 | +end | ||
54 | +if max(strcmp(field_name, stringFields)) ~= 0 | ||
55 | + string_struct = textscan(fid, '%s', 1, 'Whitespace', '\n'); | ||
56 | + v = string_struct{1}{1}; | ||
57 | + v = strtrim(v); | ||
58 | + return; | ||
59 | +end | ||
60 | + | ||
61 | +%read and return the wavelength values | ||
62 | +if strcmp(field_name, 'wavelength') == 1 | ||
63 | + v = []; | ||
64 | + textscan(fid, '%[{]', 1); | ||
65 | + c = ' '; | ||
66 | + while c ~= '}' | ||
67 | + new = fscanf(fid, '%f'); | ||
68 | + v = [v new]; | ||
69 | + c = fscanf(fid, '%c', 1); | ||
70 | + end | ||
71 | + return; | ||
72 | +end | ||
73 | + | ||
74 | +%if it doesn't match anything, just read until the end of the line | ||
75 | +%string_struct = textscan(fid, '%s', 1, 'Whitespace', '\n'); | ||
76 | +string_struct = textscan(fid, '%s', 1, 'Delimiter', '\n'); | ||
77 | +v = ''; | ||
78 | +valid = 0; |
1 | +function EID = rtsEnviOpen(filename, headername, mask) | ||
2 | + | ||
3 | +%opens an ENVI file and returns an ID structure | ||
4 | +% filename = name of ENVI file | ||
5 | +% headername = name of ENVI header | ||
6 | +% FID = structure containing file information | ||
7 | +% mask = binary image specifying valid spectra | ||
8 | + | ||
9 | +%assign the mask variable | ||
10 | +if(nargin < 3) | ||
11 | + mask = 1; | ||
12 | +end | ||
13 | + | ||
14 | +%open the file and save the file ID | ||
15 | +fid = fopen(filename, 'r'); | ||
16 | + | ||
17 | +%open the ENVI header file | ||
18 | +header = enviLoadHeader(headername); | ||
19 | + | ||
20 | +%this is currently only valid for BIP files | ||
21 | +if(~strcmp(header.interleave, 'bip')) | ||
22 | + disp('Error: This function only works for BIP interleave files. Load in ENVI and convert.'); | ||
23 | +end | ||
24 | +if(header.data_type ~= 4) | ||
25 | + disp('Error: This function only works for floating-point files.'); | ||
26 | +end | ||
27 | + | ||
28 | +EID = enviID; | ||
29 | +EID.fid = fid; | ||
30 | +EID.header = header; | ||
31 | +EID.mask = mask; | ||
32 | +EID.fpos = 0; | ||
33 | + | ||
34 | +%EID = struct('fid', fid, 'header', header, 'mask', mask, 'fpos', 0); | ||
35 | + |
1 | +function S = rtsEnviRead(fid, batchSize) | ||
2 | + | ||
3 | +%This function reads a batch of spectra from the given ENVI file ID | ||
4 | +% fid = ENVI file ID created using rtsEnviOpen | ||
5 | +% batchSize = number of spectra to read | ||
6 | + | ||
7 | +%if there is no mask, just load each spectrum in order | ||
8 | +if(fid.mask == 1) | ||
9 | + | ||
10 | + %compute the new batch size in case we are near the eof | ||
11 | + nSpectra = fid.header.samples * fid.header.lines; | ||
12 | + remainingSpectra = nSpectra - fid.fpos; | ||
13 | + | ||
14 | + if(batchSize > remainingSpectra) | ||
15 | + batchSize = remainingSpectra; | ||
16 | + end | ||
17 | + | ||
18 | + S = fread(fid.fid, [fid.header.bands batchSize], '*float32'); | ||
19 | + | ||
20 | + %increment the fid counter | ||
21 | + fid.fpos = fid.fpos + batchSize; | ||
22 | + | ||
23 | +%otherwise only load valid spectra | ||
24 | +else | ||
25 | + | ||
26 | + %compute the new batch size in case we are near the eof | ||
27 | + if(fid.fpos == 0) | ||
28 | + remainingSpectra = nnz(fid.mask); | ||
29 | + else | ||
30 | + nSpectra = nnz(fid.mask); | ||
31 | + maskRead = fid.mask(1:fid.fpos+1); | ||
32 | + remainingSpectra = nSpectra - nnz(maskRead); | ||
33 | + end | ||
34 | + | ||
35 | + if(batchSize > remainingSpectra) | ||
36 | + batchSize = remainingSpectra; | ||
37 | + end | ||
38 | + | ||
39 | + %allocate space for the spectra | ||
40 | + S = zeros(fid.header.bands, batchSize); | ||
41 | + | ||
42 | + %for each spectrum in the batch | ||
43 | + for s = 1:batchSize | ||
44 | + | ||
45 | + %while the current spectrum is invalid | ||
46 | + skip = 0; | ||
47 | + while (~fid.mask(fid.fpos + 1)) | ||
48 | + %read the invalid spectrum | ||
49 | + %invalid = fread(fid.fid, [fid.header.bands 1], '*float32'); | ||
50 | + skip = skip + 1; | ||
51 | + | ||
52 | + %increment the file position | ||
53 | + fid.fpos = fid.fpos + 1; | ||
54 | + end | ||
55 | + fseek(fid.fid, skip * fid.header.bands * 4, 'cof'); | ||
56 | + | ||
57 | + test = fread(fid.fid, [fid.header.bands 1], '*float32'); | ||
58 | + if size(test) ~= size(S(:, s)) | ||
59 | + size(test) | ||
60 | + size(S(:, s)) | ||
61 | + end | ||
62 | + S(:, s) = test; | ||
63 | + fid.fpos = fid.fpos + 1; | ||
64 | + | ||
65 | + end | ||
66 | + | ||
67 | +end | ||
68 | + |