📄 dicom4tofmr.m
字号:
function [fmr] = dicom4tofmr(dcm4file, fmrfile, skipvols)
% dicom4tofmr - cheap try to convert a DICOM4 file into FMR/STC
%
% FORMAT: [fmr] = dicom4tofmr(dcm4file, fmrfile [, skipvols])
%
% Input fields:
%
% dcm4file filename of DICOM4 image
% fmrfile filename of FMR/STC to write (with .FMR extension)
% skipvols number of volumes to skip (default: 0)
%
% Output fields:
%
% fmr FMR object with STCs loaded
% Version: v0.7a
% Build: 7082721
% Date: Aug-27 2007, 9:16 PM CEST
% Author: Jochen Weber, Brain Innovation, B.V., Maastricht, NL
% URL/Info: http://wiki.brainvoyager.com/BVQXtools
% argument check
if nargin < 2 || ...
~ischar(dcm4file) || ...
isempty(dcm4file) || ...
exist(dcm4file(:)', 'file') ~= 2 || ...
~ischar(fmrfile) || ...
isempty(fmrfile)
error( ...
'BVQXtools:BadArgument', ...
'Bad or missing argument for dicom4tofmr.' ...
);
end
dcm4file = dcm4file(:)';
fmrfile = fmrfile(:)';
if nargin < 3 || ...
~isa(skipvols, 'double') || ...
numel(skipvols) ~= 1 || ...
isnan(skipvols) || ...
skipvols < 0 || ...
skipvols > 999
skipvols = 0;
else
skipvols = round(real(skipvols));
end
% try to read dicom file
dcm = [];
try
dcm = BVQXfile(dcm4file);
if ~isBVQXfile(dcm, 'dcm') || ...
numel(dcm.Data) < 16 || ...
~all(dcm.Data(end).Key == [32736, 16])
error('BAD_DICOM');
end
NrOfPixels = numel(dcm.Data(end).Value);
NrOfRows = double(dcm.Value('Rows'));
NrOfCols = double(dcm.Value('Columns'));
PixelSpacing = splittocell(dcm.Value('PixelSpacing'), '\');
PixSpcX = str2double(PixelSpacing{1});
PixSpcY = str2double(PixelSpacing{2});
SlcThick = str2double(dcm.Value('SliceThickness'));
GapThick = str2double(dcm.Value('SpacingBetweenSlices')) - SlcThick;
try
NrOfSlices = double(dcm.Value('NrOfSlices'));
catch
try
NrOfSlices = double(dcm.Value(8193, 4120));
catch
error('BAD_DICOM');
end
end
NrOfVolumes = NrOfPixels / (NrOfRows * NrOfCols * NrOfSlices);
if NrOfVolumes ~= fix(NrOfVolumes)
error('BAD_DICOM');
end
if skipvols > NrOfVolumes
skipvols = 0;
end
dcm.Data(end).Value = reshape(dcm.Data(end).Value, ...
[NrOfRows, NrOfCols, NrOfVolumes, NrOfSlices]);
catch
clearbvqxobjects({dcm});
error( ...
'BVQXtools:BadArgument', ...
'The given file couldn''t be detected as a DICOM4 file.' ...
);
end
% check fmr filename
if numel(fmrfile) < 4 || ...
~strcmpi(fmrfile(end-3:end), '.fmr')
fmrfile = [fmrfile '.fmr'];
end
[fmrp{1:3}] = fileparts(fmrfile);
sliceprefix = [fmrp{2} '-'];
% create FMR
fmr = bless(BVQXfile('new:fmr'), 1);
% fill structure
fmr.NrOfVolumes = NrOfVolumes - skipvols;
fmr.NrOfSlices = NrOfSlices;
fmr.NrOfSkippedVolumes = skipvols;
fmr.Prefix = sliceprefix;
fmr.InterSliceTime = fmr.TR / NrOfSlices;
fmr.ResolutionX = NrOfRows;
fmr.ResolutionY = NrOfCols;
fmr.LayoutNRows = ceil(NrOfSlices / fmr.LayoutNColumns);
fmr.InplaneResolutionX = PixSpcX;
fmr.InplaneResolutionY = PixSpcY;
fmr.SliceThickness = SlcThick;
fmr.SliceGap = GapThick;
fmr.Slice1CenterZ = -(NrOfSlices - 1) * (SlcThick + GapThick) / 2;
fmr.SliceNCenterZ = -fmr.Slice1CenterZ;
fmr.NRows = NrOfRows;
fmr.NCols = NrOfCols;
fmr.FoVRows = NrOfRows * PixSpcX;
fmr.FoVCols = NrOfCols * PixSpcY;
fmr.GapThickness = GapThick;
fmr.FirstDataSourceFile = dcm4file;
% try saving
try
fmr.SaveAs(fmrfile);
catch
clearbvqxobjects({fmr, dcm});
error( ...
'BVQXtools:BVQXfileError', ...
'Error saving FMR file to disk.' ...
);
end
% creating slice files
stc = BVQXfile('new:stc');
stc.NrOfRows = NrOfRows;
stc.NrOfCols = NrOfCols;
stc.NrOfVolumes = NrOfVolumes - skipvols;
for sc = 1:NrOfSlices
stc.STCData = uint16(dcm.Data(end).Value(:, :, (1+skipvols):end, sc));
try
stc.SaveAs(sprintf('%s%d.stc', sliceprefix, sc));
catch
clearbvqxobjects({stc, fmr, dcm});
error( ...
'BVQXtools:BVQXfileError', ...
'Error saving slice %d.', ...
sc ...
);
end
end
% clear STC object
stc.ClearObject;
% create a firstvol fmr
firstvol = fmr.CopyObject;
% reload slices
try
fmr = fmr.LoadSTCs;
catch
clearbvqxobjects({firstvol, fmr, dcm});
error( ...
'BVQXtools:BVQXfileError', ...
'Error test re-loading slice data.' ...
);
end
% edit firstvol
firstvol.NrOfVolumes = 1;
firstvol.NrOfSkippedVolumes = 0;
firstvol.Prefix = [sliceprefix(1:end-1) '_firstvol-'];
try
firstvol.SaveAs([fmrfile(1:end-4) '_firstvol.fmr']);
catch
clearbvqxobjects({firstvol, fmr, dcm});
warning( ...
'BVQXtools:BVQXfileError', ...
'Error saving _firstvol.fmr' ...
);
return;
end
% create firstvol slice files
stc = BVQXfile('new:stc');
stc.NrOfRows = NrOfRows;
stc.NrOfCols = NrOfCols;
stc.NrOfVolumes = 1;
for sc = 1:NrOfSlices
stc.STCData = uint16(dcm.Data(end).Value(:, :, 1, sc));
try
stc.SaveAs(sprintf('%s%s%d.stc', sliceprefix(1:end-1), '_firstvol-', sc));
catch
clearbvqxobjects({stc, firstvol, fmr, dcm});
error( ...
'BVQXtools:BVQXfileError', ...
'Error saving _firstvol slice %d.', ...
sc ...
);
end
end
% clear unrequired object
clearbvqxobjects({stc, firstvol, dcm});
% also clear FMR if no output
if nargout < 1
fmr.ClearObject;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -