dose Pixel data插值,将原dose pixel插值为image的大小。

本文介绍了一个使用C++编程实现的函数,通过DCMTK库读取DICOMRTDose文件中的剂量数据,然后对DoseGrid进行重采样,将原始的2.5mm分辨率转换为1.074219mm的新分辨率。
#include <iostream>
#include <vector>
#include <cmath> // 添加头文件以使用 round 函数
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dcfilefo.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmrt/drtdose.h"

const double originalDoseGridSize = 2.5; // in mm
const double targetDoseGridSizeX = 1.074219; // in mm
const double targetDoseGridSizeY = 1.074219; // in mm
const double targetDoseGridSizeZ = 2.5; // in mm

typedef std::vector<std::vector<std::vector<Uint16>>> ThreeDimensionalArray;

bool resampleDoseGrid(const ThreeDimensionalArray& originalDoseData, ThreeDimensionalArray& resampledDoseData) {
    double scaleX = originalDoseGridSize / targetDoseGridSizeX;
    double scaleY = originalDoseGridSize / targetDoseGridSizeY;
    double scaleZ = originalDoseGridSize / targetDoseGridSizeZ;

    int resampledRows = static_cast<int>(std::ceil(originalDoseData[0].size() * scaleX)); // 向上取整
    int resampledColumns = static_cast<int>(std::ceil(originalDoseData[0][0].size() * scaleY)); // 向上取整
    int resampledFrames = originalDoseData.size();

    resampledDoseData.resize(resampledFrames, std::vector<std::vector<Uint16>>(resampledRows, std::vector<Uint16>(resampledColumns)));

    for (int f = 0; f < resampledFrames; ++f) {
        for (int r = 0; r < resampledRows; ++r) {
            for (int c = 0; c < resampledColumns; ++c) {
                int originalR = static_cast<int>(r / scaleX);
                int originalC = static_cast<int>(c / scaleY);
                if (originalR < originalDoseData[f].size() && originalC < originalDoseData[f][originalR].size()) {
                    resampledDoseData[f][r][c] = originalDoseData[f][originalR][originalC];
                }
                else {
                    // Handle out-of-bounds access
                    // For example, you can assign a default value or skip this voxel
                    resampledDoseData[f][r][c] = 0; // Assigning 0 as default value
                }
            }
        }
    }

    // 判断是否插值成功
    return (resampledDoseData.size() == resampledFrames && resampledDoseData[0].size() == resampledRows && resampledDoseData[0][0].size() == resampledColumns);
}

int main() {
    const char* doseFilePath = "D:\\dicom_All\\Original\\RD.1.2.246.352.71.7.2088656855.452404.20110921073629.dcm";

    DcmFileFormat doseFileFormat;
    if (doseFileFormat.loadFile(doseFilePath).bad()) {
        std::cerr << "Error loading RT Dose file: " << doseFilePath << std::endl;
        return 1;
    }

    DRTDoseIOD rtDose;
    if (rtDose.read(*doseFileFormat.getDataset()).bad()) {
        std::cerr << "Error reading RT Dose dataset." << std::endl;
        return 1;
    }

    Uint16 rows, columns;
    Sint32 frames;
    if (rtDose.getRows(rows).bad() || rtDose.getColumns(columns).bad() || rtDose.getNumberOfFrames(frames).bad()) {
        std::cerr << "Error getting dose grid size." << std::endl;
        return 1;
    }

    std::cout << "Original Dose Grid Size:" << std::endl;
    std::cout << "Frames: " << frames << ", Rows: " << rows << ", Columns: " << columns << std::endl;

    ThreeDimensionalArray originalDoseData(frames, std::vector<std::vector<Uint16>>(rows, std::vector<Uint16>(columns)));

    DcmElement* pixelDataElement = nullptr;
    if (doseFileFormat.getDataset()->findAndGetElement(DCM_PixelData, pixelDataElement).bad()) {
        std::cerr << "Error getting pixel data element." << std::endl;
        return 1;
    }

    Uint16* pixelData = nullptr;
    if (pixelDataElement->getUint16Array(pixelData).bad()) {
        std::cerr << "Error getting pixel data." << std::endl;
        return 1;
    }

    size_t index = 0;
    for (int f = 0; f < frames; ++f) {
        for (int r = 0; r < rows; ++r) {
            for (int c = 0; c < columns; ++c) {
                originalDoseData[f][r][c] = pixelData[index++];
            }
        }
    }

    ThreeDimensionalArray resampledDoseData;
    bool success = resampleDoseGrid(originalDoseData, resampledDoseData);
    if (success) {
        std::cout << "Dose grid resampling successful." << std::endl;

        int resampledFrames = resampledDoseData.size();
        int resampledRows = resampledDoseData[0].size();
        int resampledColumns = resampledDoseData[0][0].size();

        std::cout << "Resampled Dose Grid Size:" << std::endl;
        std::cout << "Frames: " << resampledFrames << ", Rows: " << resampledRows << ", Columns: " << resampledColumns << std::endl;

        // 打印插值后的像素数据
        std::cout << "Resampled Pixel Data:" << std::endl;
        for (int f = 0; f < resampledFrames; ++f) {
            for (int r = 0; r < resampledRows; ++r) {
                for (int c = 0; c < resampledColumns; ++c) {
                    //std::cout << resampledDoseData[f][r][c] << " ";
                }
                //std::cout << std::endl; // 打印完一行数据后换行
            }
            //std::cout << std::endl; // 打印完一帧数据后换行
        }
    }
    else {
        std::cerr << "Error resampling dose grid." << std::endl;
        return 1;
    }

    return 0;
}

### 4D 技术对成像中像素间距的影响 在现代成像技术领域,4D 成像不仅涉及三维空间数据采集,还增加了时间维度作为第四维[^1]。这种多维度的数据捕捉方式显著影响了图像中的像素间距(Pixel Spacing)。具体而言: #### 像素间距定义及其重要性 像素间距是指相邻两个像素中心之间的距离,在二维图像中通常表示为水平和垂直方向上的物理尺寸单位(如毫米或微米)。对于传统静态成像设备来说,这一参数主要取决于传感器分辨率以及光学系统的放大倍率[^2]。 然而,在引入动态因素后的四维场景下,由于额外的时间轴参与计算,使得本固定的平面内位置关系可能随帧间变化而发生偏移或者形变。因此,评估基于视频序列的整体质量时需综合考虑时空两方面特性共同作用下的有效采样密度。 #### 时间维度带来的挑战 当我们将时间纳入考量范围之后,连续画面之间物体运动速度会影响最终呈现出来的视觉效果清晰度。如果目标移动过快以至于超出摄像机所能记录的最大频率,则会出现所谓的“混叠现象”,即实际测量得到的距离小于真实情况,从而造成错误估计像素间的相对布局状态[^3]。 另外得注意的是,某些高级别的4D重建算法可能会通过插值方法来填补因快速动作丢失的信息空白区域;尽管如此操作可以改善观感体验,但从严格意义上讲它改变了始捕获资料里固有的几何属性——也就是调整了名义上所宣称保持不变的标准间隔数。 #### 应用实例分析 以医学影像为例说明这一点:超声波扫描过程中利用M型模式展示心脏壁厚度随着时间推移的变化趋势图谱。在这里面每一个点代表特定时刻对应部位反射回来信号强度大小的位置坐标集合体。假如探头摆动幅度较大或是患者呼吸起伏不定都会引起局部结构轮廓线偏离理想直线形态,进而干扰医生判断病变边界确切所在之处的能力。此时就需要借助专门校正程序重新设定新的参考框架以便更精确反映实际情况下的微观细节特征分布状况[^4]。 ```python import numpy as np def calculate_pixel_spacing(frame_sequence, time_interval): """ 计算给定帧序列中的平均像素间距 参数: frame_sequence (list of arrays): 图像帧列表 time_interval (float): 连续帧之间的时间差 返回: float: 平均像素间距 """ displacement_vectors = [] for i in range(1, len(frame_sequence)): prev_f
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大孔隆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值