📄 vmr_reframe.m
字号:
function hfile = vmr_Reframe(hfile, bbox)
% VMR::Reframe - reframe the VMR
%
% FORMAT: vmr.Reframe(bbox)
%
% Input fields:
%
% bbox 2x3 double bounding box (end included!)
%
% No output fields.
% Version: v0.7b
% Build: 7082911
% Date: Aug-29 2007, 11:19 AM CEST
% Author: Jochen Weber, Brain Innovation, B.V., Maastricht, NL
% URL/Info: http://wiki.brainvoyager.com/BVQXtools
% argument check
if nargin < 2 || ...
numel(hfile) ~= 1 || ...
~isBVQXfile(hfile, 'vmr') || ...
~isa(bbox, 'double') || ...
length(size(bbox)) ~= 2 || ...
numel(bbox) ~= 6 || ...
any(isinf(bbox(:)) | isnan(bbox(:)))
error( ...
'BVQXfile:BadArgument', ...
'Invalid call to %s.', ...
mfilename ...
);
end
% get contents
bc = bvqxfile_getcont(hfile.L);
% check bbox size
if size(bbox, 2) == 3
bbox = bbox';
end
% get current array size
oOffsetX = bc.OffsetX;
oOffsetY = bc.OffsetY;
oOffsetZ = bc.OffsetZ;
oDimX = size(bc.VMRData, 1);
oDimY = size(bc.VMRData, 2);
oDimZ = size(bc.VMRData, 3);
% special case, autofind (min, max, fringe)
if all(bbox(:, 1) == bbox(:, 2))
vd = bc.VMRData(:, :, :);
vs = size(vd);
nxc = [vs(2) * vs(3), 1];
mnt = bbox(1);
mxt = bbox(2);
for x1 = 1:vs(1)
if any(reshape(vd(x1, :, :), nxc) >= mnt) && ...
any(reshape(vd(x1, :, :), nxc) <= mxt)
break;
end
end
for xe = vs(1):-1:x1
if any(reshape(vd(xe, :, :), nxc) >= mnt) && ...
any(reshape(vd(xe, :, :), nxc) <= mxt)
break;
end
end
sxc = x1:xe;
nyc = [numel(sxc) * vs(3), 1];
for y1 = 1:vs(2)
if any(reshape(vd(sxc, y1, :), nyc) >= mnt) && ...
any(reshape(vd(sxc, y1, :), nyc) <= mxt)
break;
end
end
for ye = vs(2):-1:y1
if any(reshape(vd(sxc, ye, :), nyc) >= mnt) && ...
any(reshape(vd(sxc, ye, :), nyc) <= mxt)
break;
end
end
syc = y1:ye;
nzc = [numel(sxc) * numel(syc), 1];
for z1 = 1:vs(3)
if any(reshape(vd(sxc, syc, z1), nzc) >= mnt) && ...
any(reshape(vd(sxc, syc, z1), nzc) <= mxt)
break;
end
end
for ze = vs(3):-1:z1
if any(reshape(vd(sxc, syc, ze), nzc) >= mnt) && ...
any(reshape(vd(sxc, syc, ze), nzc) <= mxt)
break;
end
end
x1 = max(1, x1 - bbox(3));
xe = min(vs(1), xe + bbox(3));
y1 = max(1, y1 - bbox(3));
ye = min(vs(2), ye + bbox(3));
z1 = max(1, z1 - bbox(3));
ze = min(vs(3), ze + bbox(3));
% reframe data
vd = vd(x1:xe, y1:ye, z1:ze);
if ~isempty(bc.VMRData16) && ...
ndims(bc.VMRData16) == ndims(bc.VMRData) && ...
all(size(bc.VMRData16) == size(bc.VMRData))
bc.VMRData16 = bc.VMRData16(x1:xe, y1:ye, z1:ze);
end
bc.VMRData = vd;
bc.OffsetX = oOffsetX + x1 - 1;
bc.OffsetY = oOffsetY + y1 - 1;
bc.OffsetZ = oOffsetZ + z1 - 1;
bc.DimX = size(vd, 1);
bc.DimY = size(vd, 2);
bc.DimZ = size(vd, 3);
bvqxfile_setcont(hfile.L, bc);
return;
end
% try to get new array size
nOffsetX = bbox(1);
nOffsetY = bbox(2);
nOffsetZ = bbox(3);
nDimX = bbox(4) + 1 - nOffsetX;
nDimY = bbox(5) + 1 - nOffsetY;
nDimZ = bbox(6) + 1 - nOffsetZ;
% check new dims
if any([nDimX, nDimY, nDimZ] < 0)
error( ...
'BVQXfile:BadArgument', ...
'Invalid bounding box.' ...
);
end
% create target array
zVMR = bc.VMRData(1);
zVMR = zVMR - zVMR;
try
nVMR = zVMR([]);
nVMR(nDimX, nDimY, nDimZ) = zVMR;
catch
error( ...
'BVQXfile:InternalError', ...
'Invalid dimensions for reframing.' ...
);
end
% decide on source/target indexing...
sfx = max(1, 1 + nOffsetX - oOffsetX);
tfx = max(1, 1 + oOffsetX - nOffsetX);
stx = min(oDimX, nDimX + nOffsetX - oOffsetX);
ttx = tfx + stx - sfx;
sfy = max(1, 1 + nOffsetY - oOffsetY);
tfy = max(1, 1 + oOffsetY - nOffsetY);
sty = min(oDimY, nDimY + nOffsetY - oOffsetY);
tty = tfy + sty - sfy;
sfz = max(1, 1 + nOffsetZ - oOffsetZ);
tfz = max(1, 1 + oOffsetZ - nOffsetZ);
stz = min(oDimZ, nDimZ + nOffsetZ - oOffsetZ);
ttz = tfz + stz - sfz;
% try data copy
try
nVMR(tfx:ttx, tfy:tty, tfz:ttz) = ...
bc.VMRData(sfx:stx, sfy:sty, sfz:stz);
catch
error( ...
'BVQXfile:InternalError', ...
'Error calculating copy from/to indices.' ...
);
end
% overwrite VMRData in hfile
bc.VMRData = nVMR;
% also work on V16 ?
if bc.VMR8bit && ...
~isempty(bc.VMRData16) && ...
ndims(bc.VMRData16) == ndims(bc.VMRData) && ...
all(size(bc.VMRData16) == size(bc.VMRData))
nVMR = uint16(0);
nVMR(1:nDimX, 1:nDimY, 1:nDimZ) = nVMR(1);
nVMR(tfx:ttx, tfy:tty, tfz:ttz) = ...
bc.VMRData16(sfx:stx, sfy:sty, sfz:stz);
bc.VMRData16 = nVMR;
end
% set fields
bc.DimX = size(nVMR, 1);
bc.DimY = size(nVMR, 2);
bc.DimZ = size(nVMR, 3);
bc.OffsetX = nOffsetX;
bc.OffsetY = nOffsetY;
bc.OffsetZ = nOffsetZ;
% set content
bvqxfile_setcont(hfile.L, bc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -