Bootstrap

Python和C++急性损伤空间结构

🌵Python片段

处理 DICOM 或 TIFF 图像是 Python 的常见应用,涉及图像读取、处理和保存。以下是一些处理它们的主要库和代码示例:


处理 DICOM 图像

DICOM 图像通常用于医学成像,使用库如 pydicomnumpy

安装依赖
pip install pydicom matplotlib numpy
读取和显示 DICOM 图像
import pydicom
import matplotlib.pyplot as plt

# 读取 DICOM 文件
dicom_file_path = "path_to_dicom_file.dcm"
dicom = pydicom.dcmread(dicom_file_path)

# 获取像素数组
pixel_array = dicom.pixel_array

# 显示图像
plt.imshow(pixel_array, cmap="gray")
plt.title("DICOM Image")
plt.show()
转换为 NumPy 数组并保存为 PNG
from PIL import Image

# 转换为 8 位并保存
pixel_array_8bit = (pixel_array / pixel_array.max() * 255).astype('uint8')
image = Image.fromarray(pixel_array_8bit)
image.save("output.png")

处理 TIFF 图像

TIFF 图像可以是普通或多页文件,使用库如 Pillowtifffile

安装依赖
pip install pillow tifffile
读取和显示 TIFF 图像
from PIL import Image
import matplotlib.pyplot as plt

# 打开 TIFF 图像
tiff_file_path = "path_to_tiff_file.tiff"
tiff_image = Image.open(tiff_file_path)

# 显示图像
plt.imshow(tiff_image, cmap="gray")
plt.title("TIFF Image")
plt.show()
处理多页 TIFF 文件
import tifffile

# 读取多页 TIFF 文件
tiff_file_path = "path_to_multipage_tiff_file.tiff"
with tifffile.TiffFile(tiff_file_path) as tiff:
    for i, page in enumerate(tiff.pages):
        image = page.asarray()
        plt.imshow(image, cmap="gray")
        plt.title(f"Page {i+1}")
        plt.show()
保存 NumPy 数组为 TIFF 文件
import numpy as np
import tifffile

# 创建一个随机的 NumPy 数组
image_array = (np.random.rand(256, 256) * 255).astype('uint8')

# 保存为 TIFF
tifffile.imwrite("output.tiff", image_array)

高级处理

  1. 图像处理: 使用 opencv-pythonscikit-image 进行滤波、边缘检测等。
  2. 多模态数据融合: 如果涉及 DICOM 和 TIFF 的结合,可用 numpy 处理数据。
  3. 批量处理: 使用 osglob 遍历目录,批量处理文件。

🌵C++片段

在 C++ 中处理 DICOM 和 TIFF 图像,常用的库分别是 DCMTKlibTIFF。以下是它们的概述和使用方法:


1. DICOM 图像处理:DCMTK

DCMTK(DICOM ToolKit)是一个强大的开源库,用于处理 DICOM 图像。它支持读写 DICOM 文件、访问元数据、网络通信(如 PACS),以及处理 DICOM 数据的多种功能。

安装 DCMTK
  • 下载:DCMTK 官网
  • 安装依赖:编译 DCMTK 通常需要 CMake 和 C++ 编译器。
DCMTK 使用示例
#include "dcmtk/dcmdata/dctk.h"

int main() {
    // DICOM 文件路径
    const char* dicomFile = "example.dcm";

    // 加载 DICOM 文件
    DcmFileFormat fileFormat;
    OFCondition status = fileFormat.loadFile(dicomFile);
    if (!status.good()) {
        std::cerr << "Error: Cannot read DICOM file (" << status.text() << ")" << std::endl;
        return 1;
    }

    // 访问 DICOM 数据集
    DcmDataset* dataset = fileFormat.getDataset();

    // 获取元数据(例如患者姓名)
    OFString patientName;
    if (dataset->findAndGetOFString(DCM_PatientName, patientName).good()) {
        std::cout << "Patient Name: " << patientName << std::endl;
    } else {
        std::cerr << "Error: Cannot access Patient Name" << std::endl;
    }

    // 将像素数据导出为 RAW
    const Uint16* pixelData = nullptr;
    uint32_t pixelLength = 0;
    if (dataset->findAndGetUint16Array(DCM_PixelData, pixelData, &pixelLength).good()) {
        std::cout << "Pixel Data Length: " << pixelLength << std::endl;
    }

    return 0;
}
常见功能
  • 读取和写入 DICOM 文件
    • loadFile() / saveFile()
  • 访问元数据
    • findAndGetOFString()findAndGetUint16Array()
  • 转换为标准图像格式
    • 可借助其他图像库(如 OpenCV)处理像素数据。

2. TIFF 图像处理:libTIFF

libTIFF 是一个广泛使用的开源库,用于读取和写入 TIFF 格式的图像文件。它支持各种压缩格式和多页 TIFF 文件。

安装 libTIFF
  • 下载:libTIFF 官网

  • 通常可以通过包管理工具安装:

    sudo apt-get install libtiff-dev    # 在 Debian/Ubuntu 系统
    
libTIFF 使用示例
#include <tiffio.h>
#include <iostream>

int main() {
    // TIFF 文件路径
    const char* tiffFile = "example.tiff";

    // 打开 TIFF 文件
    TIFF* tif = TIFFOpen(tiffFile, "r");
    if (!tif) {
        std::cerr << "Error: Cannot open TIFF file" << std::endl;
        return 1;
    }

    // 获取图像尺寸
    uint32 width, height;
    TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
    TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
    std::cout << "Width: " << width << ", Height: " << height << std::endl;

    // 分配缓冲区读取图像数据
    uint32* raster = (uint32*) _TIFFmalloc(width * height * sizeof(uint32));
    if (raster == nullptr) {
        std::cerr << "Error: Memory allocation failed" << std::endl;
        TIFFClose(tif);
        return 1;
    }

    if (TIFFReadRGBAImage(tif, width, height, raster, 0)) {
        std::cout << "Image data successfully read" << std::endl;
    }

    // 释放资源
    _TIFFfree(raster);
    TIFFClose(tif);

    return 0;
}
常见功能
  • 读取 TIFF 元数据
    • 使用 TIFFGetField() 提取属性,例如宽度(TIFFTAG_IMAGEWIDTH)和高度(TIFFTAG_IMAGELENGTH)。
  • 处理多页 TIFF 文件
    • 使用 TIFFSetDirectory() 切换页面。
  • 写入 TIFF 图像
    • 使用 TIFFWriteScanline() 或其他方法将数据写入。

结合 OpenCV

若需要在 DICOM 或 TIFF 数据基础上进一步处理图像,OpenCV 是一个极好的选择:

#include <opencv2/opencv.hpp>

// 使用 OpenCV 加载 DICOM/TIFF 数据
cv::Mat image = cv::imdecode(buffer, cv::IMREAD_UNCHANGED);
cv::imshow("Image", image);
cv::waitKey(0);

通过 OpenCV,可方便地对图像执行滤波、增强、边缘检测等操作。


总结

  • DICOM 图像:推荐使用 DCMTK 提取元数据和像素数据。
  • TIFF 图像:推荐使用 libTIFF 读取和写入。
  • 如果需要可视化和高级处理,可以将 DCMTK 和 libTIFF 的结果与 OpenCV 结合。

👉更新:亚图跨际

;