导入从安道尔SIF多通道的图像文件的图像数据,背景和参考MATLAB命名结构。除了图像数据,大部分包含在SIF文件中的元信息也是进口的。
注意:
通过识别相应文件中的已知信息,对文件格式进行了反向工程。仍有未确定的区域,但可根据要求提供目前的摘要。
马塞尔Leutenegger(2021)。和或SIF图像读取器(//www.tatmou.com/matlabcentral/fileexchange/11224-andor-sif-image-reader),MATLAB中央文件交换。检索到.
单谱不工作...
我的。sif文件不是来自andor,它们来自于使用不同的显微成像程序,我似乎无法用这个函数打开它们。这是问题所在吗?
有人能告诉我他们是否解决了这个错误吗?
>>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”。
更新:
我已经解决了我之前的问题,但现在我有一个无限循环的问题。它在下面的while循环中发生:
while isempty(strfind(current_line_text, '波长'))% change '波长' with '像素数')
当前行文本=fgetl(f);
结尾
在sifread_ac。m文件。
任何帮助吗?
我应该在哪里指定.sif文件名?同样,我得到这个错误消息:
使用sifread_ac出错(第14行)
输入参数不足。
亲爱的乌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格式已经改变了……最近有人用这个方法成功了吗?谢谢!
你好,我们刚刚用安铎的牛顿CCD相机收集了第一张光谱。收集的光谱被保存为.sif文件,但对于我来说,我无法得到任何这些脚本来读取它们并将它们导入MatLab。你用什么样的文件名让Matlab读取它们?每次我输入文件路径时,都会出现这样的错误:" error: file: sifread. "m行:41列:34
意外的MATLAB表达。”任何帮助,将不胜感激!谢谢!
当我尝试使用这个函数打开一个由ANDOR相机获得的.sif文件时,我得到以下错误消息:
使用sifread>readString时出错(第136行)
不一致的字符串。
sifread>readSection中出错(第100行)
info.dataType = readString (f);
误差在sifread(线51)
(数据,下一个)= readSection (f);
任何帮助吗?
谢谢!
不能在这里粘贴脚本
我已经改变了从像素数转换波长的脚本。sif轨迹必须用波长校准的横轴来测量。下面是这个脚本的新版本:
我正在使用2012年6月18日由Uli发布的脚本,它非常有效。非常感谢你,Uli。对于Deepak:如果我理解的话,试着输入func_ext_uli_sifread2('image1。sif ', 1);
有一个问题:有办法得到波长值吗?非常感谢所有的贡献者!
我想知道这段代码是否可以用来读取使用Andor软件拍摄的个人sif图像文件。
我的猜测是,如果是,谁能让我知道如何使用这个函数的目的。我尝试了以下操作,同时确保将image1放在相同的目录路径中。
>> sifread( 'image1.sif')
使用sifread误差(线44)
无法打开文件。
欢呼,
如何阅读“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
我还修改了脚本,以允许各种绘图选项。
我只是想提醒大家不要在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);
结尾
帕克问题的解决方案:
添加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似乎有这个信息。但不确定如何绘制每一帧的强度剖面……
非常好,感谢Marcel和Chad & Co!关于探测器。Type:因为它似乎适用于任何Andor sif文件,所以可以删除if条件(第96和98行)。
非常好的节目!另外,根据布拉德利·史密斯和查德·利伯的评论,我不得不更改第96行。不幸的是,尽管我有一些非常大的文件,其中的数据矩阵似乎无法使用fread进行处理,导致随后的dim失配崩溃。
查德·利伯的评论帮了我的忙。
伟大的工作。节省了我大量的时间手动转换文件为AVI在SOLIS。
根据Bradley Smith的评论,我还需要更改detectorType字符串匹配以使其正常工作。这很容易做到,首先检查第89行上的info.detectorType读取,然后更改第96行以适当匹配。很容易改变,非常感谢。
杰出的我拼命想把多个sif文件中的图像数据快速输入MATLAB。
谢谢。
我们发现在我们的Andor iXon EMCCD中,我们需要将第96行更改为:
if格式('Luc',信息检测类型)
来
如果strcmp('Luc',info.detectorType)| |。。。strcmp('DV897_BV',信息检测类型)
否则很好。谢谢你,马塞尔。
我只是需要这个。由于烫发:)