⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dicom4tofmr.m

📁 toolbox of BVQX, This is the access between BV and matlab. It will help you to analysis data from BV
💻 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 + -