MATLAB中处理DICOM RT结构提取2D最小包围盒的函数咨询
MATLAB 处理DICOM RT结构生成带尺度最小2D包围盒的方案
可用内置函数清单
所有函数均原生支持读取DICOM自带的空间尺度信息(患者物理坐标系,单位mm),不需要额外做尺度校准:
dicominfo:读取RTSTRUCT文件的全量元数据,包含坐标系、像素间距、结构集标签等所有原始信息,你当前使用的UseVRHeuristic=false参数可以兼容非标准VR编码的DICOM文件,避免读取出错。dicomContours(Image Processing Toolbox提供):专门用于解析RTSTRUCT格式的轮廓数据,输出对象中存储的轮廓点坐标直接为DICOM患者坐标系下的真实物理坐标,自带原始尺度,不需要手动转换坐标。plotContour:支持直接在DICOM物理坐标系下绘制轮廓,不会出现拉伸、尺度变形问题,你当前设置的view([180 0])对应冠状位投影视角。imref2d/imref3d:空间参考对象,可存储DICOM影像的方向、原点、像素间距信息,用于后续把包围盒叠加到对应CT/MRI序列时自动匹配尺度。- 基础矩阵运算函数(
min/max/cell2mat):直接在物理坐标维度计算包围盒边界,无精度损失。
保留原始尺度的最小2D包围盒实现代码
你当前选取的是方位角180°、仰角0°的投影视角(对应X-Z平面冠状位投影,Y轴为前后方向),直接在物理坐标下计算即可完全保留尺度,参考代码如下:
% --- 你已有的基础读取代码 --- info = dicominfo("C:\Temp\....\RtTest2\rtstruct2.dcm",UseVRHeuristic=false); rtContours = dicomContours(info); % 可通过rtContours.ROIs.ROIName核对58号ROI是否为目标结构 figure(1) plotContour(rtContours,58); view([180 0]) % --- 提取轮廓点计算最小包围盒 --- % 读取目标ROI所有层的轮廓坐标,为细胞数组,每个元素对应一层的N×3物理坐标点 targetContour = rtContours.ROIs.ContourData{58}; % 合并所有层的点为M×3矩阵,三列分别对应患者坐标系下X(左右)、Y(前后)、Z(头脚)坐标,单位mm allPoints = cell2mat(targetContour); % 按当前视角做2D投影:取X、Z维度坐标 projPoints = allPoints(:,[1,3]); % 计算轴对齐最小包围盒,输出格式为[X起点, Z起点, X方向宽度, Z方向高度],单位为mm bbox_min = [min(projPoints(:,1)), min(projPoints(:,2)), ... max(projPoints(:,1))-min(projPoints(:,1)), max(projPoints(:,2))-min(projPoints(:,2))]; % 可视化验证:在当前图上叠加包围盒 hold on rectangle('Position', bbox_min, 'EdgeColor','r','LineWidth',2) hold off
如果需要非轴对齐的、贴合结构旋转角度的最小外接矩形,可以先将投影点构建为polyshape对象,结合凸包计算最小外接矩形即可,全程在物理坐标下运算不会丢失尺度。
尺度保留注意事项
- 不要将轮廓点转换为像素坐标后再计算包围盒,直接使用
dicomContours输出的物理坐标计算即可保证尺度和原始DICOM一致。 - 后续如果需要将包围盒匹配到对应的CT/MRI影像序列,读取影像时同步生成对应的
imref2d空间参考对象,即可直接叠加显示,不需要额外做尺度配准。

内容的提问来源于stack exchange,提问作者lam90
相关产品推荐
相关产品推荐

