📄 ctf_write_mri.m
字号:
fwrite(fid,identifierString(1:32),'char');
fwrite(fid,Version_2_Header.imageSize ,'short'); % always = 256
fwrite(fid,Version_2_Header.dataSize ,'short'); % 1 or 2 (bytes), 8 or 16 bits
fwrite(fid,Version_2_Header.clippingRange ,'short'); % max. integer value of data
fwrite(fid,Version_2_Header.imageOrientation ,'short'); % eg., 0 = left on left, 1 = left on right
% voxel dimensions in mm
fwrite(fid,Version_2_Header.mmPerPixel_sagittal ,'float');
fwrite(fid,Version_2_Header.mmPerPixel_coronal ,'float');
fwrite(fid,Version_2_Header.mmPerPixel_axial ,'float');
headModel_write(fid,Version_2_Header.HeadModel_Info); % defined below...
imageInfo_write(fid,Version_2_Header.Image_Info); % defined below...
% voxel location of head origin
fwrite(fid,Version_2_Header.headOrigin_sagittal ,'float');
fwrite(fid,Version_2_Header.headOrigin_coronal ,'float');
fwrite(fid,Version_2_Header.headOrigin_axial ,'float');
% euler angles to align MR to head coordinate system (angles in degrees!)
% 1. rotate in coronal plane by this angle
% 2. rotate in sagittal plane by this angle
% 3. rotate in axial plane by this angle
fwrite(fid,Version_2_Header.rotate_coronal ,'float');
fwrite(fid,Version_2_Header.rotate_sagittal ,'float');
fwrite(fid,Version_2_Header.rotate_axial ,'float');
fwrite(fid,Version_2_Header.orthogonalFlag ,'short'); % if set then image is orthogonal
fwrite(fid,Version_2_Header.interpolatedFlag ,'short'); % if set than image was interpolated
% original spacing between slices before interpolation to CTF format
fwrite(fid,Version_2_Header.originalSliceThickness ,'float');
% transformation matrix head->MRI [column][row]
fwrite(fid,Version_2_Header.transformMatrix' ,'float')';
% padding to 1028 bytes
% according to CTF manual, this should
%be 202, but it works out to the 1028 bytes with 204.
spaces = char(repmat(double(' '),1,204));
fwrite(fid,spaces,'uchar');
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function headModel_write(fid,HeadModel_Info),
% this function is called from Version_2_Header_read
% fid. point coordinate (in voxels)
fwrite(fid,HeadModel_Info.Nasion_Sag ,'short'); % nasion - sagittal
fwrite(fid,HeadModel_Info.Nasion_Cor ,'short'); % nasion - coronal
fwrite(fid,HeadModel_Info.Nasion_Axi ,'short'); % nasion - axial
fwrite(fid,HeadModel_Info.LeftEar_Sag ,'short'); % left ear - sagittal
fwrite(fid,HeadModel_Info.LeftEar_Cor ,'short'); % left ear - coronal
fwrite(fid,HeadModel_Info.LeftEar_Axi ,'short'); % left ear - axial
fwrite(fid,HeadModel_Info.RightEar_Sag ,'short'); % right ear - sagittal
fwrite(fid,HeadModel_Info.RightEar_Cor ,'short'); % right ear - coronal
fwrite(fid,HeadModel_Info.RightEar_Axi ,'short'); % right ear - axial
fwrite(fid,' ','char'); % padding to 4 byte boundary - from Robert Oostenveld
% default sphere origin
fwrite(fid,HeadModel_Info.defaultSphereX ,'float'); % sphere origin x coordinate ( in mm )
fwrite(fid,HeadModel_Info.defaultSphereY ,'float'); % sphere origin y coordinate ( in mm )
fwrite(fid,HeadModel_Info.defaultSphereZ ,'float'); % sphere origin z coordinate ( in mm )
fwrite(fid,HeadModel_Info.defaultSphereRadius ,'float'); % default sphere radius ( in mm )
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function imageInfo_write(fid,Image_Info),
% this function is called from Version_2_Header_read
fwrite(fid,Image_Info.modality,'short'); % 0 = MRI, 1 = CT, 2 = PET, 3 = SPECT, 4 = OTHER
% check the length of char variables
% Image_Info.manufacturerName = char( fread(fid,[1,64],'char') );
% Image_Info.instituteName = char( fread(fid,[1,64],'char') );
% Image_Info.patientID = char( fread(fid,[1,32],'char') );
% Image_Info.dateAndTime = char( fread(fid,[1,32],'char') );
% Image_Info.scanType = char( fread(fid,[1,32],'char') );
% Image_Info.contrastAgent = char( fread(fid,[1,32],'char') );
% Image_Info.imagedNucleus = char( fread(fid,[1,32],'char') );
manufacturerName = sprintf('%-64s', Image_Info.manufacturerName);
if length(manufacturerName) < 64,
paddingN = 64 - length(manufacturerName);
padding = char(repmat(double(' '),1,paddingN));
manufacturerName = [manufacturerName,padding];
end
instituteName = sprintf('%-64s', Image_Info.instituteName);
if length(instituteName) < 64,
paddingN = 64 - length(instituteName);
padding = char(repmat(double(' '),1,paddingN));
instituteName = [instituteName,padding];
end
patientID = sprintf('%-32s', Image_Info.patientID);
if length(patientID) < 32,
paddingN = 32 - length(patientID);
padding = char(repmat(double(' '),1,paddingN));
patientID = [patientID,padding];
end
dateAndTime = sprintf('%-32s', Image_Info.dateAndTime);
if length(dateAndTime) < 32,
paddingN = 32 - length(dateAndTime);
padding = char(repmat(double(' '),1,paddingN));
dateAndTime = [dateAndTime,padding];
end
scanType = sprintf('%-32s', Image_Info.scanType);
if length(scanType) < 32,
paddingN = 32 - length(scanType);
padding = char(repmat(double(' '),1,paddingN));
scanType = [scanType,padding];
end
contrastAgent = sprintf('%-32s', Image_Info.contrastAgent);
if length(contrastAgent) < 32,
paddingN = 32 - length(contrastAgent);
padding = char(repmat(double(' '),1,paddingN));
contrastAgent = [contrastAgent,padding];
end
imagedNucleus = sprintf('%-32s', Image_Info.imagedNucleus);
if length(imagedNucleus) < 32,
paddingN = 32 - length(imagedNucleus);
padding = char(repmat(double(' '),1,paddingN));
imagedNucleus = [imagedNucleus,padding];
end
% output these char variables
fwrite(fid,manufacturerName(1:64),'char');
fwrite(fid,instituteName(1:64),'char');
fwrite(fid,patientID(1:32),'char');
fwrite(fid,dateAndTime(1:32),'char');
fwrite(fid,scanType(1:32),'char');
fwrite(fid,contrastAgent(1:32),'char');
fwrite(fid,imagedNucleus(1:32),'char');
fwrite(fid,' ','char'); % padding to 4 byte boundary - from Robert Oostenveld
fwrite(fid,Image_Info.Frequency ,'float');
fwrite(fid,Image_Info.FieldStrength ,'float');
fwrite(fid,Image_Info.EchoTime ,'float');
fwrite(fid,Image_Info.RepetitionTime ,'float');
fwrite(fid,Image_Info.InversionTime ,'float');
fwrite(fid,Image_Info.FlipAngle ,'float');
fwrite(fid,Image_Info.NoExcitations ,'short');
fwrite(fid,Image_Info.NoAcquisitions ,'short');
commentString = sprintf('%-256s', Image_Info.commentString);
if length(commentString) < 256,
paddingN = 256 - length(commentString);
padding = char(repmat(double(' '),1,paddingN));
commentString = [commentString,padding];
end
forFutureUse = sprintf('%-64s', Image_Info.forFutureUse);
if length(forFutureUse) < 64,
paddingN = 64 - length(forFutureUse);
padding = char(repmat(double(' '),1,paddingN));
forFutureUse = [forFutureUse,padding];
end
fwrite(fid,commentString(1:256),'char');
fwrite(fid,forFutureUse(1:64),'char');
return
% The CTF MRI File format used by MRIViewer consists of a binary file with a
% 1,028 byte header. The MRI data can be in 8-bit (unsigned character) or 16-bit
% (unsigned short integer) format and consists of 256 x 256 pixel slices, stored as
% 256 contiguous sagittal slices from left to right (or right to left if head orientation
% is 搇eft-on-right
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -