123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- function [ROIS] = dicomrt_rasterizeVoi(VOI, ct, ct_xmesh, ct_ymesh, ct_zmesh)
- [VOI_temp]=dicomrt_checkinput(VOI);
- VOI=dicomrt_varfilter(VOI_temp);
- xdim = length(ct_xmesh);
- ydim = length(ct_ymesh);
- zdim = length(ct_zmesh);
- voi2use = 1:size(VOI,1);
- [XMESH YMESH] = meshgrid(ct_xmesh, ct_ymesh);
- h = waitbar(0, 'Rasterizing', 'Name', 'dicomrt_rasterizeVoi');
- for kk = 1:length(voi2use)
- waitbar(kk./length(voi2use), h, ['Rasterizing: ', VOI{kk,1}]);
-
-
- rasterVOI = zeros(xdim, ydim, zdim, 'int8');
- num_curves = numel(VOI{kk,2});
- for k = 1:num_curves
-
-
-
- curve = VOI{kk,2}{k};
-
- numPoints = size(curve,1);
- if numPoints < 3
- continue;
- end
-
- voi_z = VOI{kk,2}{k}(1,3);
-
-
- dist_z = abs(ct_zmesh-voi_z);
- slice = find(dist_z == min(dist_z));
- if isempty(slice)
- warning('Can not find matching slice');
- error('Closest slice found at %f cm', min(abs(ct_zmesh-voi_z)));
- elseif numel(slice) > 1
- warning('Multiple matching slices found');
- end
-
- if exist('InPolygon', 'file') == 3
-
- BW = InPolygon(XMESH,YMESH,curve(:,1),curve(:,2));
- else
- BW = inpolygon(XMESH,YMESH,curve(:,1),curve(:,2));
- end
-
-
- rasterVOI(:,:,slice) = int8(xor(BW, rasterVOI(:,:,slice)));
- end
-
-
- Xcurves = cell(0);
- for slice = 1:size(rasterVOI, 1)
- B = bwboundaries(squeeze(rasterVOI(slice,:,:)));
- if ~isempty(B)
- for ii = 1:numel(B)
-
-
- x_vertices = ct_xmesh(slice) * ones(size(B{ii}, 1), 1);
- y_vertices = interp1(1:numel(ct_ymesh), ct_ymesh, B{ii}(:,1));
- z_vertices = interp1(1:numel(ct_zmesh), ct_zmesh, B{ii}(:,2));
- Xcurves{end+1} = cat(2, x_vertices, y_vertices, z_vertices);
- end
- end
- end
-
- Ycurves = cell(0);
- for slice = 1:size(rasterVOI, 2)
- B = bwboundaries(squeeze(rasterVOI(:,slice,:)));
- if ~isempty(B)
- for ii = 1:numel(B)
- y_vertices = ct_ymesh(slice) * ones(size(B{ii}, 1), 1);
- x_vertices = interp1(1:numel(ct_xmesh), ct_xmesh, B{ii}(:,1));
- z_vertices = interp1(1:numel(ct_zmesh), ct_zmesh, B{ii}(:,2));
- Ycurves{end+1} = cat(2, x_vertices, y_vertices, z_vertices);
- end
- end
- end
-
-
-
- ROIS{kk}.name = VOI{kk,1};
- ROIS{kk}.Xcurves = Xcurves;
- ROIS{kk}.Ycurves = Ycurves;
-
- ROIS{kk}.num_curves = num_curves;
- for k = 1:num_curves
- ROIS{kk}.curves{k} = VOI{kk,2}{k};
- end
- ROIS{kk}.ind = int32(find(rasterVOI));
- ROIS{kk}.dim = [xdim ydim zdim];
- ROIS{kk}.pixdim = [abs(ct_xmesh(2)-ct_xmesh(1)) abs(ct_ymesh(2)-ct_ymesh(1)) abs(ct_zmesh(2)-ct_zmesh(1))];
- ROIS{kk}.start = [ct_xmesh(1) ct_ymesh(1) ct_zmesh(1)];
- ROIS{kk}.start_ind = '(1,1,1)';
- end
- delete(h);
|