🌵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;
}
// 将像素数据导出为 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 结合。