🌵Python片段
处理 DICOM 或 TIFF 图像是 Python 的常见应用,涉及图像读取、处理和保存。以下是一些处理它们的主要库和代码示例:
处理 DICOM 图像
DICOM 图像通常用于医学成像,使用库如 pydicom
和 numpy
。
安装依赖
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 图像可以是普通或多页文件,使用库如 Pillow
或 tifffile
。
安装依赖
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)
高级处理
- 图像处理: 使用
opencv-python
或scikit-image
进行滤波、边缘检测等。 - 多模态数据融合: 如果涉及 DICOM 和 TIFF 的结合,可用
numpy
处理数据。 - 批量处理: 使用
os
和glob
遍历目录,批量处理文件。
🌵C++片段
在 C++ 中处理 DICOM 和 TIFF 图像,常用的库分别是 DCMTK 和 libTIFF。以下是它们的概述和使用方法:
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;}// 将像素数据导出为 RAWconst 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 结合。