-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathreadTif.m
107 lines (98 loc) · 3.3 KB
/
readTif.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
function oimg = readTif(path)
%READTIF is used to read stack image data. Returned data is saved as a
%matrix.
%INPUT
% path: the path of the tartget image to be read;
%OUTPUT
% oimg: the returned data with matrix form.
%% Check directory and file existence
path_parent = pwd;
[pathstr, ~, ~] = fileparts(path);
if ~isempty(pathstr) && ~exist(pathstr, 'dir')
error 'Directory is not exist.';
end
if ~exist(path, 'file')
error 'File is not exist.';
end
%% Open file
file_opening_error_count = 0;
while ~exist('tiff', 'var')
try
tiff = Tiff(path, 'r');
catch
file_opening_error_count = file_opening_error_count + 1;
pause(0.1);
if file_opening_error_count > 5 % automatically retry to open for 5 times.
reply = input('Failed to open the file. Do you wish to retry? Y/n: ', 's');
if isempty(reply) || any(upper(reply) == 'Y')
file_opening_error_count = 0;
else
error(['Failed to open the file ''' path '''.']);
end
end
end
end
%% Load image information
tfl = 0; % Total frame length
tcl = 1; % Total cell length
while true
tfl = tfl + 1; % Increase frame count
iinfo(tfl).w = tiff.getTag('ImageWidth');
iinfo(tfl).h = tiff.getTag('ImageLength');
iinfo(tfl).spp = tiff.getTag('SamplesPerPixel');
% Grayscale: 1(real number) or 2(complex number), Color: 3(rgb),
% 4(rgba), 6(rgb, complex number), or 8(rgba, complex number)
iinfo(tfl).color = iinfo(tfl).spp > 2;
iinfo(tfl).complex = any(iinfo(tfl).spp == [2 6 8]);
if tfl > 1
% If tag information is changed, make a new cell
if iinfo(tfl-1).w ~= iinfo(tfl).w || ...
iinfo(tfl-1).h ~= iinfo(tfl).h || ...
iinfo(tfl-1).spp ~= iinfo(tfl).spp || ...
iinfo(tfl-1).color ~= iinfo(tfl).color || ...
iinfo(tfl-1).complex ~= iinfo(tfl).complex
tcl = tcl + 1; % Increase cell count
iinfo(tfl).fid = 1; % First frame of this cell
else
iinfo(tfl).fid = iinfo(tfl-1).fid + 1;
end
else
iinfo(tfl).fid = 1; % Very first frame of this file
end
iinfo(tfl).cid = tcl; % Cell number of this frame
if tiff.lastDirectory(), break; end;
tiff.nextDirectory();
end
%% Load image data
if tcl == 1 % simple image (no cell)
for tfl = 1:tfl
tiff.setDirectory(tfl);
temp = tiff.read();
if iinfo(tfl).complex
temp = temp(:,:,1:2:end-1,:) + temp(:,:,2:2:end,:)*1i;
end
if ~iinfo(tfl).color
oimg(:,:,iinfo(tfl).fid) = temp; % Grayscale image
else
oimg(:,:,:,iinfo(tfl).fid) = temp; % Color image
end
end
else % multiple image (multiple cell)
oimg = cell(tcl, 1);
for tfl = 1:tfl
tiff.setDirectory(tfl);
temp = tiff.read();
if iinfo(tfl).complex
temp = temp(:,:,1:2:end-1,:) + temp(:,:,2:2:end,:)*1i;
end
if ~iinfo(tfl).color
oimg{iinfo(tfl).cid}(:,:,iinfo(tfl).fid) = temp; % Grayscale image
else
oimg{iinfo(tfl).cid}(:,:,:,iinfo(tfl).fid) = temp; % Color image
end
end
end
%% Close file
tiff.close();
cd(path_parent);
end