利用靶区勾画的RT struct文件分析相关联的Dicom图像中肿瘤部分的CT(HU)值分布

利用已经进行靶区勾画的RT struct文件分析相关联的Dicom图像中肿瘤部分的CT(HU)值分布。


% =================================================================
% 根据RT struct的靶区勾画区域分析相应dicom图像中肿瘤位置的CT HU值的分布
% =================================================================

%% 读取RT struct 靶区头文件
% rt struct文件路径
RSInfo = dicominfo('E:\RTFolder\rt.dcm');
% dicom系列文件所在文件夹
dcmPath = 'E:\ DicomFolder\';

numberOfContours = size(fieldnames(RSInfo.ROIContourSequence.Item_1.ContourSequence),1); % 该靶区分布在多少层 %已确定标注中Item_1为肿瘤区域勾画
maskData = zeros(512,512,numberOfContours);
tumorFile = maskData;

%% 遍历每一个切片上的勾画区域
for k=1:numberOfContours
    rfContent = RSInfo.ROIContourSequence.Item_1.ContourSequence.(['Item_' num2str(k)]);
    
    %% 读取该靶区所在的CT切片的信息
    dcmName = rfContent.ContourImageSequence.Item_1.ReferencedSOPInstanceUID;
    DCMInfo = dicominfo(strcat(dcmPath, dcmName, '.dcm')); 
    dcmFile = dicomread(strcat(dcmPath, dcmName, '.dcm'));
    dcmHU = dcmFile.* DCMInfo.RescaleSlope + DCMInfo.RescaleIntercept; % 将C灰度值转换为HU值
    dcmOrigin = DCMInfo.ImagePositionPatient; % 网格原点在世界坐标系的位置
    dcmSpacing = DCMInfo.PixelSpacing; %采样间隔
 
    
    numberOfPoints = rfContent.NumberOfContourPoints; % 该层靶区曲线点数
    conData = zeros(numberOfPoints,3); % 存储靶区曲线各点的世界坐标
    pointData = zeros(numberOfPoints,2); % 存储靶区曲线各点的网格体素坐标
    
    %% 将靶区勾画的曲线坐标由世界坐标系转换为网格体素坐标
    for jj = 1:numberOfPoints
        ii = (jj-1)*3 ;
        conData(jj,1) = rfContent.ContourData(ii+1,1); %轮廓世界坐标系
        conData(jj,2) = rfContent.ContourData(ii+2,1);
        conData(jj,3) = rfContent.ContourData(ii+3,1);       
        pointData(jj,1) = round( (conData(jj,1) - dcmOrigin(1,1))/dcmSpacing(1,1) ); %轮廓X坐标
        pointData(jj,2) = round( (conData(jj,2) - dcmOrigin(2,1))/dcmSpacing(2,1) ); %轮廓Y坐标   
    end
     
   %% 判断每一个切面上所有的点是否在曲线内部,在maskData相应位置=1,不在=0; 
    x = zeros(1,512);
    y = x;
    for i = 1:512
        x(i,:) = i;
        y(i,:) = 1:512;   
    end
    in = inpolygon(x,y,pointData(:,1)', pointData(:,2)');
    maskData(:,:,k) = in;
    
    tumorFile(:,:,k) = dcmHU;
    tumorFile(~maskData) = 0;  % 只有肿瘤部分的原始图像
    
    %% 显示原图像和肿瘤部分
    figure;
    imshow(int8(dcmHU)); % 显示整体图像 %将int16转化为int8,显示出来易于观察
    hold on;
    plot(pointData(:,1),pointData(:,2),x(in),y(in),'.r'); % 显示肿瘤
        
end

%% 分析肿瘤部分的HU值的频数和频率
HUFqc = tabulate(tumorFile(:));
% 去掉频数低于某一阈值的统计数据
HUFqcNew = zeros(100,size(HUFqc,2),size(HUFqc,3));
rowNum = 0;
for j = 1:size(HUFqc,1)
    if HUFqc(j,2) > 100
        rowNum = rowNum + 1;
        HUFqcNew(rowNum,:) = HUFqc(j,:);
    end
    
end
% 绘制直方图
% tumorHist = tumorFile(:);
% figure;
% hist(tumorHist,10); %绘制分布直方图




参考: 

http://blog.csdn.net/sunyao_123/article/details/73655957  sunyao_123的《DICOM靶区头文件解析》

http://blog.csdn.net/u013635029/article/details/72957944?locationNum=2&fps=1  Hade_H的《常见医疗扫描图像处理步骤

如有任何不正确的地方,欢迎指正。

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
读取DICOM图像文件的过程可以分为以下几个步骤: 1.使用fopen函数打开DICOM图像文件,打开模式为"rb"(二进制模式)。 2.读取DICOM文件头,跳过不需要的信息,找到图像数据开始的位置。可以使用fread函数读取文件头信息,可以根据DICOM文件格式的规范来解析文件头。 3.读取图像数据。根据DICOM文件格式的规范,DICOM图像数据通常以压缩格式存储,需要使用特定的解压算法来解压数据。可以使用第三方库来解压图像数据,如DCMTK库、ITK库等。 4.将解压后的图像数据存储到图像指针。可以使用malloc函数来申请一块内存用于存储图像数据,然后使用memcpy函数将解压后的数据复制到内存。 下面是C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _dicom_header { // DICOM文件头信息结构体 // TODO: 根据DICOM文件格式规范定义文件头信息结构体 } DICOM_HEADER; int main() { FILE *fp; DICOM_HEADER header; unsigned char *image_data = NULL; size_t image_size = 0; // 1.打开DICOM文件 fp = fopen("test.dcm", "rb"); if (fp == NULL) { printf("Failed to open DICOM file\n"); return -1; } // 2.读取DICOM文件头 fread(&header, sizeof(DICOM_HEADER), 1, fp); // TODO: 根据DICOM文件格式规范解析文件头信息 // 3.读取图像数据 // TODO: 使用第三方库解压DICOM图像数据 // 4.将解压后的图像数据存储到图像指针 image_data = (unsigned char *)malloc(image_size); if (image_data == NULL) { printf("Failed to allocate memory for image data\n"); return -1; } fseek(fp, /*图像数据在文件的偏移量*/, SEEK_SET); fread(image_data, image_size, 1, fp); // TODO: 处理图像数据,例如进行图像处理或保存图像 // 释放内存 free(image_data); fclose(fp); return 0; } ``` 注意,在上述代码,我们假设已经解压了DICOM图像数据,并将解压后的数据存储在了image_data指针。在实际应用,需要根据具体的DICOM文件格式和解压算法来实现读取和解压图像数据的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值