https://github.com/epnev/ca_source_extraction
Tip revision: 49b7884e93348d50df7173e1619d7499468bb1f6 authored by epnev on 22 August 2019, 14:24:41 UTC
fix bug introduced with 9e524e29f17d35db3c79a87de32209c7dccda186
fix bug introduced with 9e524e29f17d35db3c79a87de32209c7dccda186
Tip revision: 49b7884
loadtiff.m
function oimg = loadtiff(path, sFrame, num2read)
% Copyright (c) 2012, YoonOh Tak
% All rights reserved.
% Modified by Eftychios Pnevmatikakis, 01/2017, 02/2018.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions are
% met:
%
% * Redistributions of source code must retain the above copyright
% notice, this list of conditions and the following disclaimer.
% * Redistributions in binary form must reproduce the above copyright
% notice, this list of conditions and the following disclaimer in
% the documentation and/or other materials provided with the distribution
% * Neither the name of the Gwangju Institute of Science and Technology (GIST), Republic of Korea nor the names
% of its contributors may be used to endorse or promote products derived
% from this software without specific prior written permission.
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
% POSSIBILITY OF SUCH DAMAGE.
if nargin < 3 || isempty(num2read)
num2read = Inf;
end
if nargin < 2 || isempty(sFrame)
sFrame = 1;
end
tStart = tic;
warn_old = warning('off', 'all'); % To ignore unknown TIFF tag.
%% Change directory
path_parent = pwd;
[pathstr, ~, ~] = fileparts(path);
if ~isempty(pathstr)
if ~exist(pathstr, 'dir')
cd(pathstr);
end
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
if tfl >= sFrame && tfl <= sFrame + num2read
iinfo(tfl).w = tiff.getTag('ImageWidth');
iinfo(tfl).h = tiff.getTag('ImageLength');
iinfo(tfl).spp = tiff.getTag('SamplesPerPixel');
iinfo(tfl).color = iinfo(tfl).spp > 2; % Grayscale: 1(real number) or 2(complex number), Color: 3(rgb), 4(rgba), 6(rgb, complex number), or 8(rgba, complex number)
iinfo(tfl).complex = any(iinfo(tfl).spp == [2 6 8]);
if tfl > sFrame
% 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
end
if tiff.lastDirectory(), break; end;
tiff.nextDirectory();
end
%% Load image data
T = tfl;
num2read = min(num2read,T-sFrame+1);
if num2read < 1
oimg = [];
else
if tcl == 1 % simple image (no cell)
for tfl = sFrame:sFrame+num2read-1
tiff.setDirectory(tfl);
temp = tiff.read();
if tfl == sFrame
oimg = zeros([size(temp),num2read],'like',temp);
end
if iinfo(tfl).complex
temp = temp(:,:,1:2:end-1,:) + temp(:,:,2:2:end,:)*1i;
end
if ~iinfo(tfl).color
oimg(:,:,tfl - sFrame + 1) = temp; % Grayscale image
else
oimg(:,:,:,tfl - sFrame + 1) = 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
end
%% Close file
tiff.close();
cd(path_parent);
warning(warn_old);
display(sprintf('The file was loaded successfully. Elapsed time : %.3f s.', toc(tStart)));
end