图像缩略图

和或SIF图像读取器

1.0.0.0版(2.63 KB)通过 马塞尔·勒特内格尔
阅读Andor SIF多通道图像文件。

18下载

更新2007年1月18日

查看许可证

导入从安道尔SIF多通道的图像文件的图像数据,背景和参考MATLAB命名结构。除了图像数据,大部分包含在SIF文件中的元信息也是进口的。

注意:

通过识别相应文件中的已知信息,对文件格式进行了反向工程。仍有未确定的区域,但可根据要求提供目前的摘要。

引用作为

马塞尔Leutenegger(2021)。和或SIF图像读取器(//www.tatmou.com/matlabcentral/fileexchange/11224-andor-sif-image-reader),MATLAB中央文件交换。检索到.

意见及评分(52)

尼古拉斯·斯通

单谱不工作...

托尼

Kirill Kniazev

大卫Vondrasek

赛斯Lauzon

我的。sif文件不是来自andor,它们来自于使用不同的显微成像程序,我似乎无法用这个函数打开它们。这是问题所在吗?

瑞安muddiman

有人能告诉我他们是否解决了这个错误吗?

>>sifread('file.sif')
使用sifread>readString时出错(第136行)
不一致的字符串。

sifread>readSection中出错(第100行)
info.dataType = readString (f);

误差在sifread(线51)
(数据,下一个)= readSection (f);

加布里埃尔·坎帕格

兴鼎

西格尔·科恩

**我下面的评论是指Uli Kleßinger在2012年6月18日评论的“func_ext_uli_sifread2”。

帕克雷

伊丽莎白H

伊丽莎白H

布瑞恩

更新:

我已经解决了我之前的问题,但现在我有一个无限循环的问题。它在下面的while循环中发生:

while isempty(strfind(current_line_text, '波长'))% change '波长' with '像素数')
当前行文本=fgetl(f);
结尾

在sifread_ac。m文件。

任何帮助吗?

布瑞恩

我应该在哪里指定.sif文件名?同样,我得到这个错误消息:

使用sifread_ac出错(第14行)
输入参数不足。

Sebastien MAILFERT

亲爱的乌Kleß荷兰国际集团(ing),

你的代码运行良好,谢谢!
这是否意味着我们必须对包含n帧(帧编号)的SIF文件进行n次迭代的循环?
framenumber信息= func_ext_uli_sifread2(文件名)
致以最亲切的问候。
塞布

萨姆特

你好。我不能让这个脚本工作在我的任何来自安道尔的.sif文件。我收到此错误信息:

索引超出矩阵维度。

sifread>readSection错误(第103行)
info.imageArea=[o(1) o(4) o(6);o(3) o(2) o(5)];

误差在sifread(线51)
(数据,下一个)= readSection (f);

我看到这个脚本已经10年了,也许sif格式已经改变了……最近有人用这个方法成功了吗?谢谢!

Jakub Husek

你好,我们刚刚用安铎的牛顿CCD相机收集了第一张光谱。收集的光谱被保存为.sif文件,但对于我来说,我无法得到任何这些脚本来读取它们并将它们导入MatLab。你用什么样的文件名让Matlab读取它们?每次我输入文件路径时,都会出现这样的错误:" error: file: sifread. "m行:41列:34
意外的MATLAB表达。”任何帮助,将不胜感激!谢谢!

BSantos

当我尝试使用这个函数打开一个由ANDOR相机获得的.sif文件时,我得到以下错误消息:
使用sifread>readString时出错(第136行)
不一致的字符串。

sifread>readSection中出错(第100行)
info.dataType = readString (f);

误差在sifread(线51)
(数据,下一个)= readSection (f);

任何帮助吗?
谢谢!

安东尼奥Consoli

不能在这里粘贴脚本

安东尼奥Consoli

我已经改变了从像素数转换波长的脚本。sif轨迹必须用波长校准的横轴来测量。下面是这个脚本的新版本:

安东尼奥Consoli

我正在使用2012年6月18日由Uli发布的脚本,它非常有效。非常感谢你,Uli。对于Deepak:如果我理解的话,试着输入func_ext_uli_sifread2('image1。sif ', 1);

有一个问题:有办法得到波长值吗?非常感谢所有的贡献者!

迪帕克

我想知道这段代码是否可以用来读取使用Andor软件拍摄的个人sif图像文件。
我的猜测是,如果是,谁能让我知道如何使用这个函数的目的。我尝试了以下操作,同时确保将image1放在相同的目录路径中。

>> sifread( 'image1.sif')

使用sifread误差(线44)
无法打开文件。

欢呼,

Atefeh

Yinpeng

如何阅读“Andor技术多通道文件”?

这里是脚本,我目前使用从andor scmos读取动力学系列,11位和16位和iXon。我不使用andor软件的原因是,我的脚本需要100毫秒来读取1GB电影的一帧,而andor软件需要10秒(在我的电脑上)。注意,因为我修改了文件的输出结构和它的主要函数的名称"func_ext_uli_sifread2(filename, framenumber)"!!

%注意:
%
文件格式通过识别已知信息进行了反向工程
%信息在相应的文件中。仍有
%未识别区域剩余,但当前汇总是
% 要求可以办到。
%

% Marcel Leutenegger©2006年11月
%
函数信息= func_ext_uli_sifread2(文件名,framenumber)

文件的文件名=;
如果输入参数个数= = 1
currentFrameNumber=0;
elseif输入参数个数= = 2
currentFrameNumber = framenumber;
结尾
f = fopen(文件,“r”);
如果f < 0
错误(“无法打开文件。”);
结尾
if ~isequal(fgetl(f),'Andor Technology Multi-Channel File')
文件关闭(f);
error('Not an Andor SIF image file.');
结尾
skipLines (f, 1);
[信息]= readSection (f, currentFrameNumber);
文件关闭(f);
如果currentFrameNumber> 0
pic_out = info.imageData;
% pic_plot_uint8 = uint8 (pic_out / max (pic_out (:)) * 255);
pic_uint8 = UINT8(圆形(pic_out /(2 ^ info.currentBitDepth)* 255));
% asdasd
%大小(pic_uint8)
Pic_uint8_rgb = 0 ([size(pic_uint8), 3], 'uint8');
pic_uint8_rgb (:,: 1) = pic_uint8;
pic_uint8_rgb(:,:,2)= pic_uint8;
pic_uint8_rgb(:,:,3)= pic_uint8;

info.imageData_uint8_rgb = pic_uint8_rgb;
信息。imageData_orig =南;
试一试
Pic_rgb = 0 ([size(pic_uint8), 3], 'double');
pic_rgb (:,: 1) = pic_out;
pic_rgb(:,:,2)= pic_out;
pic_rgb(:,:,3)= pic_out;
info.imageData_orig = pic_rgb;

结尾
结尾

%图
%于imagesc(pic_uint8_rgb)

%读取文件部分。
%
% f文件句柄
% info节数据
% next标志(如果有其他部分可用)
%
函数[信息]= readSection (f, currentFrameNumber)

settingsline = fgetl(F);
settings_cell=regexp(settingsline,“(\S)+\S”,“match”);
File_timestamp_utc_in_sec = sscanf(settings_cell{5}, '%f');
sscanf(settings_cell{6}, '%f');
exposureTime_in_sec = sscanf(settings_cell{13}, '%f');
cycleTime = sscanf(settings_cell{14}, '%f');
accumulateCycleTime = sscanf的(settings_cell {15}, '%F');
累计周期=sscanf(设置单元{16},'%f');
stackCycleTime=sscanf(设置单元{18},'%f');
pixelReadoutTimeSec = sscanf(settings_cell{19}, '%f');
EMgain = sscanf(settings_cell{22}, '%f');
verticalShiftSpeed = sscanf的(settings_cell {42}, '%F');
preAmpGain = sscanf(settings_cell{44}, '%f');
sscanf(settings_cell{48}, '%f');
VERSION1 = sscanf的(settings_cell {55}, '%F');
版本2 = sscanf(settings_cell{56}, '%f');
版本3 = sscanf(settings_cell{57}, '%f');
版本4 = sscanf(settings_cell{58}, '%f');

timestamp_utc_in_sec = file_timestamp_utc_in_sec;% o(5): UTC: seconds since 1970;ACHTUNG摄像师UTC OHNE Sommer/Winterzeit
timestamp_total_matlab_orig = datenum([1970 1 1 0 0 timestamp_utc_in_sec]);%umrechnen在死Matlab的zeitrechnung
isDlST = isDaylightSavingTime (timestamp_total_matlab_orig);那他就得面对一场战争
additionalHourDueToDlST = 0;
如果isDlST
additionalHourDueToDlST = 1;
结尾
additionalHourDueToTimezone = 1;%信德ja格林尼治标准时间+ 1 ! !
matlab_correction = additionalHourDueToTimezone/24 + additionalHourDueToDlST/24;
Timestamp_total_matlab_corrected = timestamp_total_matlab_orig + matlab_correction;
timestamp_total_matlab_corrected_vec = datevec(timestamp_total_matlab_corrected);
timestamp_total_matlab_corrected_vec_day=[timestamp_total_matlab_corrected_vec(1:3)0];
timestamp_rel_in_sec = ETIME(timestamp_total_matlab_corrected_vec,timestamp_total_matlab_corrected_vec_day);
timestamp_rel_in_ms = timestamp_rel_in_sec * 1000;

%%Werte aus dem Sif文件
信息。日期= datestr (timestamp_total_matlab_corrected);
信息。文件类型=“andor-sif-file”;
如果temperature1_in_celsius ~ = -999
info.temperature = temperature1_in_celsius;
别的
信息。温度= sprintf('%d不稳定',温度2_in_摄氏度);
结尾
info.acgregateCycles=累积循环;
信息。accumulateCycleTime = accumulateCycleTime;
信息。加工机之细加工约=加工机之细加工约;
info.EMgain=EMgain;
信息。exposureTime = exposureTime_in_sec;
信息。pixelReadoutTimeSec = pixelReadoutTimeSec;
info.preAmpGain = preAmpGain;
信息。stackCycleTime = stackCycleTime;
info.Version=sprintf(“%d.%d.%d.%d”,版本1,版本2,版本3,版本4);
信息。verticalShiftSpeed = verticalShiftSpeed;

%% Daraus berechnete Werte
_到_pics之间的时间=info.stackCycleTime;

%%在奥斯维辛
info.framerate=1/次\u到\u图片之间;%我不知道该怎么办
info.PixelReadoutRateHz = 1 / info.pixelReadoutTimeSec;
信息。time_between_to_pics = time_between_to_pics;

%% Weitere回到名单Daten AUS DEM西芙文件
info.detectorType = readLine (f);
如果比较字符串(info.detectorType, DU897_BV)
info.currentBitDepth=14;
别的
info.currentBitDepth=11;
结尾

info.detectorSize = fscanf (f,“% d”,[1 - 2]);
info.fileName = readString (f);
info.possibleBitDepth =的fscanf(F, '%d',[1 2]);

current_line_text = '';
while isempty(strfind(current_line_text, '像素数'))
当前行文本=fgetl(f);
结尾
skipLines (f, 1)
imageArealine=fgetl(f);
frameArealine = fgetl (f);
imageAreaData = sscanf的(imageArealine, '像素数%d%d%d%d%d%d%d%d%d');
frameAreaData=sscanf(frameArealine,%d%d%d%d%d%d');
pixelPerImage = imageAreaData (9);
pixelInVideo=图像区域数据(8);
leftPixel = frameAreaData (2);
topPixel = frameAreaData (3);
rightPixel=frameAreaData(4);
bottomPixel = frameAreaData (5);
imageArea = [imageAreaData(2)imageAreaData(5)imageAreaData(7); imageAreaData(4)imageAreaData(3)imageAreaData(6)];
frameArea = [leftPixel bottomPixel;rightPixel topPixel];左,上,右,下!
vBin=帧区域数据(7);%安徒生
hBin = frameAreaData(6);%vielleicht genau andersrum
= [vBin hBin];%vielleicht genau andersrum

width = (rightPixel - leftPixel + 1)/hBin;
高度=(topPixel - bottomPixel + 1)/ VBIN;

信息。宽度=宽度;
信息。身高=身高;
信息。imageArea = imageArea;
info.frameArea = frameArea;
信息。vBin = vBin;
info.hBin=hBin;
分辨率= (1 + diff (info.frameArea))。/ frameBins;
NumFrames = 1 + diff (info.imageArea (6));
info.NumFrames = NumFrames;
info.resolution =分辨率;
info.pixelPerFrame=prod(分辨率);

timestamps_from_siffile =的fscanf(F, '%d \ n',info.NumFrames);信德%阿伯angeblich奥赫淖尔berechnet
信息。timestamps = timestamp_rel_in_ms + (1/info.framerate*(0:(info.NumFrames-1)))*1000;

如果currentFrameNumber>0&¤tFrameNumber<=info.NumFrames

info.timestamp=信息时间戳(currentFrameNumber);
num_bytes_to_skip_for_curr_frame = 4 * ((currentFrameNumber-1) * info.pixelPerFrame);

fseek (f num_bytes_to_skip_for_curr_frame“咖啡”);
fseek (f 2“咖啡”);%keine ahnung warum 2字节偏移…
if prod(resolution) ~= pixelPerImage || pixelPerImage*NumFrames ~= pixelvideo . if prod(resolution) ~= pixelPerImage || pixelPerImage*NumFrames ~= pixelvideo . if prod(resolution) ~= pixelPerImage
fclose(f)
错误('不一致的图像标题。');
结尾

info.imageData =(重塑(从文件中读(f info.pixelPerFrame单= >单),信息。宽度、信息。高度)';
结尾

%读取字符串。
%
% f文件句柄
%o弦
%
函数o = readString (f)
n = fscanf (f, ' % d ', 1);
If isempty(n) || n < 0 || isequal(fgetl(f),-1)
文件关闭(f);
错误('字符串不一致');
结尾
o =从文件中读(f [1 n] uint8 = >字符);

%读一行。
%
% f文件句柄
% o读取行
%
o = readLine()函数
o = fgetl (f);
如果相等(o,-1)
文件关闭(f);
错误('不一致的图像标题。');
结尾
o = deblank (o);

%跳过字节。
%
% f文件句柄
%N要跳过的字节数
%
函数skipBytes (f, N)
[~ n] =从文件中读(f, n,“uint8”);
如果n < n
文件关闭(f);
错误('不一致的图像标题。');
结尾

%跳线。
%
% f文件句柄
% N要跳过的行数
%
函数skipLines(F,N)
对于n=1:n
如果ISEQUAL(fgetl(f)中, - 1)
文件关闭(f);
错误('不一致的图像标题。');
结尾
结尾

苏巴

亲爱的.SIF用户
我是一个非常新的社区和Matlab的新用户。我用Andor CCD相机记录了。sif格式的数据和图像文件。现在我在打开文件的时候遇到了问题。我把sifread文件放到Matlab的工作文件夹中。现在我应该做什么来打开。if文件。谁能循序渐进地帮助我。
提前致谢
关于

托德·卡琳

我已经修改这个文件来工作,从安道尔牛顿CCD相机SIF文件。您可以下载在我的网站中的文件:

http://students.washington.edu/tkarin/research.html

我还修改了脚本,以允许各种绘图选项。

托德·卡琳

Eyal

我只是想提醒大家不要在Andor软件上浪费时间。这行不通!使用这里发布的代码要容易得多(只需从其他用户的评论中稍加调整)。

菲利普

我在这方面运气不太好。以下是我尝试过的东西:

1)在Solis目录'MatlabSIFReader'文件夹,随我的Solis版本(使用SDK版本2.92.32003.0)
2) Phil在上述安道尔网站上指出的版本(SDK版本2.90.20000.2-不知道为什么安道尔网站上的版本与最新版本不匹配)
3)真正有用的脚本放在这里
4)的改变,以通过乌利Kleßinger上述用于SCMOS,这是摄像机I具有由该脚本。
5)“Export As…”命令将。sif文件转换为。avi文件,我可以很容易地导入Matlab。当我尝试这个时,Solis软件每次都崩溃(!!)

这款Andor相机硬件不错,但软件却很糟糕。

斯文

你好,
我现在使用这个非常方便的脚本几个星期没有任何问题。但是今天,在我测量的所有Andor文件中,我得到了一个奇怪的错误:
使用sifread>readString时出错(第136行)
不一致的字符串。

sifread>readSection中出错(第100行)
info.dataType = readString (f);

误差在sifread(线51)
(数据,下一个)= readSection (f);

误差在nscs_01_sifread(第13行)
[数据,背部,给定] = sifread(文件名)

运行中出错(第57行)
evalin('caller',[s';']);

我认为这很可能是Andor软件的错误,因为我根本没有更改matlab代码。然而,Andor软件也没有改变!有人有类似的问题或知道哪个函数会影响错误吗?sif文件的大小是正确的,可以用Andor软件重新打开。
乐于任何评论。
干杯
斯文

亚历山大

亲爱的Phil,我尝试使用Matlab SIF Viewer,但它似乎只能在Windows下工作。我需要一些解决方案(理想的官方)Matlab在Linux下。你有吗?

菲尔

你好,

我是安铎科技的员工。目前,我们在我们的网站上提供(通过注册)Matlab SIF查看器。这是更新与每个版本:

您可以下载最新版本的Matlab SIF Viewer;浏览网页的底部(www.andor.com),点击“下载”。然后点击右上角的“登录”,注册。一封电子邮件将发送到您用于注册的电子邮件,点击确认电子邮件内的链接。你可以在屏幕左侧的“软件”文件夹中找到最新版本的Matlab查看器(https://www.andor.com/download/)。

如果你有任何问题,请给我们一个电话或者通过我们的网站与我们联系。我们尽快尽量响应所有查询。

温暖的问候,
菲尔

马修·迪亚西奥

我们也在使用Andor iXon EMCCD,并试图像Bradley Smith那样修改代码,用我们的型号DU897_BV替换'DV897_BV'。我们得到了和Matt Baker一样的误差

在136处使用==> sifread>readString时出错
不一致的字符串。

Error in ==> sifread>readSection at 100
info.dataType = readString (f);

错误在==> sifread在51
(数据,下一个)= readSection (f);

但是我们只是用一个.sif图像来测试这个程序,而不是动能.sif图像(尽管我们希望在将来建立到这一点)。关于如何修复此问题,或者为什么在单个图像中出现不一致的字符串错误,有什么建议吗?

@ Matt和SCMOS用户

我用它从Andor SCMOS相机的电影sif文件读取数据。因此,我不得不将readSection改为如下:

函数[信息]= readSection (f, currentFrameNumber)
O =的fscanf(F, '%d',6);
info.date = datestr(○(5)/ 86400 + 719529);
info.temperature = o (6);
的skipBytes(F,10)
o = fscanf (f, f %, 5);
info.exposureTime = o (2);
info.cycleTime = o (3);
info.accumulateCycles = o (5);
信息累积周期=o(4);
skipBytes(f,2)
O =的fscanf(F, '%F',2);
info.stackCycleTime = O(1);
info.pixelReadoutTime = O(2);
o = fscanf (f, ' % d ', 3);
info.gainDAC = o (3);
skipLines (f, 1)
info.detectorType = readLine (f);
info.detectorSize = fscanf (f,“% d”,[1 - 2]);
info.fileName = readString (f);
info.possibleBitDepth =的fscanf(F, '%d',[1 2]);
skipLines (f, 3)
skipBytes (f, 14)
info.shutterTime =的fscanf(F, '%F'[1 2]);
skipLines(F,18)

info.imageAxis = fscanf (f, ' % s ', 3);
info.currentBitDepth=11;
O =的fscanf(F, '%d%d%d%d%d%d%d%d%65538%d%d%d%d%d d',14);
info.imageArea=[o(1) o(4) o(6);o(3) o(2) o(5)];
信息框架面积=[o(9)o(12);o(11)o(10)];
信息框架=[o(14)o(13)];
S =(1 + DIFF(info.frameArea))./ info.frameBins;
z=1+diff(信息成像面积(5:6));
信息。numberOfFrames = z;
信息。分辨率= s;
info.pixelPerFrame=产品;

skipLines (f, 1)
info.timestaps=fscanf(f,'%d\n',info.numberOfFrames);

如果currentFrameNumber<=info.numberOfFrames

info.timeStamp = info.timeStamps(currentFrameNumber);
num_bytes_to_skip_for_curr_frame = 4 * ((currentFrameNumber-1) * info.pixelPerFrame);

fseek (f num_bytes_to_skip_for_curr_frame“咖啡”);
fseek (f 2“咖啡”);%keine ahnung warum 2字节偏移…
如果prod(s)~=o(8)| | o(8)*z~=o(7)
fclose(f)
错误('不一致的图像标题。');
结尾

info.pixelPerFrame info.imageData =重塑(从文件中读(f,“单= >单”),info.resolution);
结尾

托马斯Odstrcil

帕克问题的解决方案:
添加skipBytes(f,12)在141行trusso版本和skipBytes(f,25)在121行。这不是正确的解决方案,但确实有效。

马特贝克

我已经成功地使用sifread读取单个。sif图像到matlab。我现在对加载动态的.sif图像感兴趣,也就是说,.sif文件有一个“堆叠”的许多图像集(多达5000帧)。这是可实现的吗?我不清楚安铎是如何分解堆叠的图像的。

在测试动力学SIF击穿用下面的错误(当readstring被称为上线101的功能运行sifread - info.imageAxis = readString(F):

???在136处使用==> sifread>readString时出错
不一致的字符串。

Error in ==> sifread>readSection at 100
info.dataType = readString (f);

错误在==> sifread在51
(数据,下一个)= readSection (f);

有人知道。sif动力学格式的细节吗?

谢谢,

马特。

本杰明

我和约书亚有同样的问题。
什么好主意吗?

约书亚·帕克

我正在尝试输入使用安和或iXon 897 EMCCD相机创建的文件,但不断出现以下错误:

???试图访问o(1);索引越界,因为numel(o)=0。

出错在==> sifread>readSection在103
info.imageArea=[o(1) o(4) o(6);o(3) o(2) o(5)];

错误在==> sifread在51
(数据,下一个)= readSection (f);

什么好主意吗?

我修改了M. Leutenegger的原始程序。
修改后的程序能够读取由Andor Solis程序版本生成的sif文件。4.9.30004.0 (iCCD - iStar DH734 18mm 1024-1024)。
添加了两个信息:信息。timeGate和信息。timeDelay,由可gateable iStar相机使用。

%读取和或SIF多通道图像文件。
%
%剧情简介:
%
%[data,back,ref]=sifread(文件)
%从文件中读取图像数据、背景和引用。
返回命名中的图像数据、背景和引用
%结构如下:
%
%.温度CCD温度[°C]
% .exposureTime曝光时间[s]
%.每次完整图像拍摄的循环时间[s]
% . accumulateccles累加循环次数
每累积图像%.accumulateCycleTime时间[s]
%.stackCycleTime间隔在图像序列[s]的
每像素读%.pixelReadoutTime时间[s]
%.detectorType CCD型
%.detectorSize读取CCD像素的数量[x,y]
%.fileName原始文件名
% .shutterTime打开/关闭快门的时间[s]
% .frameAxis CCD帧的轴单位
% .dataType图像数据类型
% .imageAxis图像的轴单位
% .imageArea图像限制[x1,y1,第一个图像;
% x2, y2,最后图像)
%.帧区域帧限制[x1,y1;x2,y2]
%.frameBins离散化像素[X,Y]
%.图像序列中的时间戳
% .imageData图像数据(x,y,t)

%注意:
%
文件格式通过识别已知信息进行了反向工程
%信息在相应的文件中。仍有
%未识别区域剩余,但当前汇总是
% 要求可以办到。
%

% Marcel Leutenegger©2006年11月
%
%注意:
%
对M. Leutenegger的原始程序进行了修改。
文件生成的sif文件
% Andor Solis程序版本。4.9.30004.0
%(iCCD-iStar DH734 18毫米)
%
% Sebastiano Trusso 2010年5月

功能(数据、回ref) = sifread(文件)
f = fopen(文件,“r”);
如果f < 0
错误(“无法打开文件。”);
结尾
if ~isequal(fgetl(f),'Andor Technology Multi-Channel File')
文件关闭(f);
error('Not an Andor SIF image file.');
结尾
skipLines (f, 1);
(数据,下一个)= readSection (f);
如果nargout>1,则next==1
[回来,下一个]= readSection (f);
If nargout > 2 & next == 1
ref =回来;
回= readSection (f);
别的
ref =结构([]);
结尾
别的
背面=结构([]);
ref =回来;
结尾
文件关闭(f);

%读取文件部分。
%
% f文件句柄
% info节数据
% next标志(如果有其他部分可用)
%
函数[信息,下一个] = readSection(F)
O =的fscanf(F, '%d',6);
info.temperature = o (6);
的skipBytes(F,10);
o = fscanf (f, f %, 5);
info.exposureTime = o (2);
info.cycleTime = o (3);
info.accumulateCycles = o (5);
信息累积周期=o(4);
skipBytes(f,2);
O =的fscanf(F, '%F',2);
info.stackCycleTime = O(1);
info.pixelReadoutTime = O(2);
%%新信息- [o(4) Delay] [o(5) Gate] S.T.
o = fscanf (f,‘% d’,5);%原始马丁- > o = fscanf (f, ' % d ', 3);
info.gainDAC = o (3);
info.timeDelay = o (4);
info.timeGate = O(5);

skipLines (f, 1);
info.detectorType = readLine (f);
info.detectorSize = fscanf (f,“% d”,[1 - 2]);
info.fileName = readString (f);
%%由S.T.改性
skipLines (f, 13);
%%

skipLines(f,3);

%% S.T.评论
% skipBytes (f, 14);
%的信息。shutterTime = fscanf (f, f %, [1 - 2])
% skipLines (f, 8);
%如果strmatch (Luc, info.detectorType)
%skipLines(F,2);安道尔%卢卡
%结束
%%
info.frameAxis = readString(F);
info.dataType = readString (f);
info.imageAxis = readString (f);
O =的fscanf(F, '65538%d%d%d%d%d%d%d%d%65538%d%d%d%d%d d',14);
info.imageArea=[o(1) o(4) o(6);o(3) o(2) o(5)];
信息框架面积=[o(9)o(12);o(11)o(10)];
信息框架=[o(14)o(13)];
S =(1 + DIFF(info.frameArea))./ info.frameBins;
z=1+diff(信息成像面积(5:6));
如果prod(s) ~= o(8) | o(8)*z ~= o(7);
文件关闭(f);
错误('不一致的图像标题。');
结尾
%% S.T.评论
%对于n = 1位:Z
%o=读取字符串(f);
%如果numel(o)
%流(% s \ n, o);% 注释
%结束
%结束
%%
info.timeStamp=fread(f,1,'uint16');
info.imageData =重塑(的fread(F,PROD(S)* Z, '单=>单'),[S Z]);

%% S.T.评论
% o = readString (f) % ? ?
%如果numel(o)
%流(% s \ n, o);% ? ?
%结束

下一个= fscanf (f, ' % d ', 1);

%读取字符串。
%
% f文件句柄
%o弦
%
函数o = readString (f)
n = fscanf (f, ' % d ', 1);
如果是空的(n)| n<0 |是相等的(fgetl(f),-1)
文件关闭(f);
错误('字符串不一致');
结尾
o =从文件中读(f [1 n] uint8 = >字符);

%读一行。
%
% f文件句柄
% o读取行
%
o = readLine()函数
o = fgetl (f);
如果相等(o,-1)
文件关闭(f);
错误('不一致的图像标题。');
结尾
o = deblank (o);

%跳过字节。
%
% f文件句柄
%N要跳过的字节数
%
函数skipBytes (f, N)
[S,N] =的fread(F,N, 'UINT8');
如果n < n
文件关闭(f);
错误('不一致的图像标题。');
结尾

%跳线。
%
% f文件句柄
% N要跳过的行数
%
函数skipLines(F,N)
对于n=1:n
如果ISEQUAL(fgetl(f)中, - 1)
文件关闭(f);
错误('不一致的图像标题。');
结尾
结尾

低音炮

我卢卡用户。但是,当我下载的文件,也有一些暗淡不匹配。所以,我纠正这一点我卢卡。我用十六进制编辑器和新的安道尔SOLIS检查。现在,我真的处理这个程序超过10万倍的图像。谢谢马塞尔Leutenegger。

功能(数据、回ref) = sifread(文件)
f = fopen(文件,“r”);
如果f < 0
错误(“无法打开文件。”);
结尾
if ~isequal(fgetl(f),'Andor Technology Multi-Channel File')
文件关闭(f);
error('Not an Andor SIF image file.');
结尾
skipLines (f, 1);
(数据,下一个)= readSection (f);
如果nargout>1,则next==1
[回来,下一个]= readSection (f);
If nargout > 2 & next == 1
ref =回来;
回= readSection (f);
别的
ref =结构([]);
结尾
别的
背面=结构([]);
ref =回来;
结尾
文件关闭(f);

%读取文件部分。
%
% f文件句柄
% info节数据
% next标志(如果有其他部分可用)
%
函数[信息,下一个] = readSection(F)
o = fscanf (f, f %, 6);
info.temperature = o (6);
的skipBytes(F,10);
o = fscanf (f, f %, 5);
info.exposureTime = o (2);
info.cycleTime = o (3);
info.accumulateCycles = o (5);
信息累积周期=o(4);
skipBytes(f,2);
O =的fscanf(F, '%F',2);
info.stackCycleTime = O(1);
info.pixelReadoutTime = O(2);
o=fscanf(f,'%f',3);
info.gainDAC = o (3);
skipLines (f, 1);
info.detectorType = readLine (f);
info.detectorSize=fscanf(f,'%f',[12]);
info.fileName = readString (f);
skipLines(f,3);
skipBytes (f, 14);
info.shutterTime =的fscanf(F, '%F'[1 2]);
skipLines (f, 8);
if格式('Luc',信息检测类型)
skipLines (f, 9);安道尔%卢卡
结尾
info.frameAxis = readString(F);
info.dataType = readString (f);
info.imageAxis = readString (f);
O =的fscanf(F, '65538%d%d%d%d%d%d%d%d%65538%d%d%d%d%d d',14);
info.imageArea=[o(1) o(4) o(6);o(3) o(2) o(5)];
信息框架面积=[o(9)o(12);o(11)o(10)];
信息框架=[o(14)o(13)];
S =(1 + DIFF(info.frameArea))./ info.frameBins;
z=1+diff(信息成像面积(5:6));
If prod(s) ~= o(8) | o(8)*z ~= o(7)
文件关闭(f);
错误('不一致的图像标题。');
结尾
对于n=1:z
o = readString (f);
如果元素个数(o)
fprintf中( '%S \ N',O);% 注释
结尾
结尾
info.timeStamp=fread(f,1,'uint16');
skipLines (f, 1);
info.imageData =重塑(的fread(F,PROD(S)* Z, '单=>单'),[S Z]);
下一个= fscanf (f, ' % d ', 1);

%读取字符串。
%
% f文件句柄
%o弦
%
函数o = readString (f)
n = fscanf (f, ' % d ', 1);
如果是空的(n)| n<0 |是相等的(fgetl(f),-1)
文件关闭(f);
错误('字符串不一致');
结尾
o =从文件中读(f [1 n] uint8 = >字符);

%读一行。
%
% f文件句柄
% o读取行
%
o = readLine()函数
o = fgetl (f);
如果相等(o,-1)
文件关闭(f);
错误('不一致的图像标题。');
结尾
o = deblank (o);

%跳过字节。
%
% f文件句柄
%N要跳过的字节数
%
函数skipBytes (f, N)
[S,N] =的fread(F,N, 'UINT8');
如果n < n
文件关闭(f);
错误('不一致的图像标题。');
结尾

%跳线。
%
% f文件句柄
% N要跳过的行数
%
函数skipLines(F,N)
对于n=1:n
如果ISEQUAL(fgetl(f)中, - 1)
文件关闭(f);
错误('不一致的图像标题。');
结尾
结尾

马塞尔·勒特内格尔

各位,

谢谢你的评论。似乎有相当一部分人对SIF阅读器感兴趣:-)

同时,我又收到了一些关于兼容性问题的反馈。SIF格式通常会随着新的Andor SOLIS版本而有所改变。也就是说,它将比检测器类型更健壮地检查文件版本。如果上面的评论都没用,你可以试试下面的方法:

129年之后:信息。shutterTime = fscanf (f, f %, [1 - 2]);
130: skipLines (f, 13);
131 . .133:注释掉

147:对于n=0:z %还有一个注释?

155:%skipBytes(f,2);%没有时间戳?

否则,用ASCII/Hex编辑器打开一个小的SIF文件,并与程序进行比较。

拉吉夫·巴拉

别介意拿到了,我的错,效果很好!

拉吉夫·巴拉

我有点糊涂了。我可以很好地运行脚本,但是如何访问单独帧中的数据呢?变量imageData似乎有这个信息。但不确定如何绘制每一帧的强度剖面……

拉尔夫Ernstorfer

非常好,感谢Marcel和Chad & Co!关于探测器。Type:因为它似乎适用于任何Andor sif文件,所以可以删除if条件(第96和98行)。

asg克鲁格

非常好的节目!另外,根据布拉德利·史密斯和查德·利伯的评论,我不得不更改第96行。不幸的是,尽管我有一些非常大的文件,其中的数据矩阵似乎无法使用fread进行处理,导致随后的dim失配崩溃。

安迪Pascall

查德·利伯的评论帮了我的忙。

伟大的工作。节省了我大量的时间手动转换文件为AVI在SOLIS。

乍得利伯

根据Bradley Smith的评论,我还需要更改detectorType字符串匹配以使其正常工作。这很容易做到,首先检查第89行上的info.detectorType读取,然后更改第96行以适当匹配。很容易改变,非常感谢。

布拉德利钢

杰出的我拼命想把多个sif文件中的图像数据快速输入MATLAB。

谢谢。

布拉德利史密斯

我们发现在我们的Andor iXon EMCCD中,我们需要将第96行更改为:
if格式('Luc',信息检测类型)

如果strcmp('Luc',info.detectorType)| |。。。strcmp('DV897_BV',信息检测类型)
否则很好。谢谢你,马塞尔。

罗兰Vulliamy

黄日华

我只是需要这个。由于烫发:)

MATLAB版本兼容性
创建与R12
与任何版本兼容
平台兼容性
窗户 苹果系统 Linux

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!