1. 引言
在医学领域,图像处理是一项非常重要的技术,特别是在医学成像(如MRI、CT扫描等)的数据处理上,可以帮助医生更加准确地进行诊断。本项目基于 Python 的 PyQt5 图形用户界面框架与 Matplotlib 数据可视化库,开发了一款简洁高效的 医学图像处理器。该应用能够读取 .nii.gz
格式的医学图像,并结合图像标签(标注的分割结果),以切片的形式进行可视化和处理,极大地方便了医学图像数据的查看和分析。
2. 项目架构与功能概述
项目采用模块化的设计,分为以下几个核心模块:
- 用户界面模块(UI):基于 PyQt5,用于构建图形用户界面,支持文件夹选择、图像切片可视化、处理进度显示等功能。
- 图像处理模块:负责读取医学图像文件(
NIfTI
格式),并对图像数据进行逐切片处理和存储。 - 美化模块:负责设置应用界面的风格,包括窗口背景、按钮样式、进度条等美观处理。
- 后台处理模块:使用 多线程 进行图像处理,确保UI界面在处理大批量数据时保持响应。
3. 代码分析
3.1 美化模块 StyleManager
为了让用户界面美观、现代化,我们创建了 StyleManager
类,统一管理整个应用的样式。通过此模块,能够轻松设置窗口背景的渐变色、按钮样式、进度条样式等。
class StyleManager:
@staticmethod
def set_main_window_style(window):
current_hour = datetime.datetime.now().hour
if 6 <= current_hour < 12:
gradient_start, gradient_end = "#A1C4FD", "#C2E9FB"
elif 12 <= current_hour < 18:
gradient_start, gradient_end = "#C2E9FB", "#A1C4FD"
elif 18 <= current_hour < 21:
gradient_start, gradient_end = "#FDB99B", "#FF758C"
else:
gradient_start, gradient_end = "#1e3c72", "#2a5298"
window.setStyleSheet(f"""
background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 {gradient_start}, stop:1 {gradient_end});
""")
这个函数会根据不同的时间动态调整背景颜色,白天偏蓝色调,晚上则为深色调,给用户一种舒适的视觉体验。
此外,该类还提供了方法 set_button_style
和 set_progressbar_style
来美化按钮和进度条。
3.2 图像处理模块 ImageProcessor
ImageProcessor
继承自 QtCore.QThread
,用于后台处理医学图像数据,保证在处理大量数据时不阻塞UI主线程。核心功能是逐切片读取患者的医学图像和标签数据,并将其保存为 .npz
文件。
class ImageProcessor(QtCore.QThread):
slice_processed = QtCore.pyqtSignal(np.ndarray, np.ndarray, str, int)
progress_updated = QtCore.pyqtSignal(int)
process_completed = QtCore.pyqtSignal()
def __init__(self, base_dir):
super().__init__()
self.base_dir = base_dir
def run(self):
output_dir = os.path.join(self.base_dir, 'output')
if not os.path.exists(output_dir):
os.makedirs(output_dir)
patients = [d for d in os.listdir(self.base_dir) if os.path.isdir(os.path.join(self.base_dir, d))]
total_slices = 0
for patient in patients:
# 加载并处理图像
# ...
for slice_idx in range(num_slices):
# 发射信号更新UI
self.slice_processed.emit(image_slice, label_slice, patient, slice_idx + 1)
progress = int(((slice_idx + 1) / total_slices) * 100)
self.progress_updated.emit(progress)
self.process_completed.emit()
在每个图像切片处理完毕时,slice_processed
信号会将图像和标签的切片数据发射给主线程用于显示,progress_updated
则实时更新进度条。
3.3 图像可视化模块 ImageViewer
ImageViewer
类构建了应用的主界面,并处理用户的交互操作。该类继承自 QtWidgets.QMainWindow
,包含文件夹选择、进度条、图像和标签显示等功能。核心功能如下:
5. 结论
本项目展示了如何使用 PyQt5 创建交互式图形用户界面,结合 Matplotlib 实现图像可视化处理。同时,通过 多线程 保证了大数据量处理时界面的流畅响应,用户可以实时查看处理进度和图像数据。
如果您正在处理医学图像数据,或者需要开发类似的图像处理应用,本项目将为您提供有价值的参考和灵感。
- 选择文件夹并处理图像:用户点击按钮选择患者数据文件夹,之后启动图像处理线程。
- 实时更新进度条:通过捕捉线程发射的
progress_updated
信号,实时更新处理进度。 - 显示图像切片:使用
Matplotlib
将医学图像切片和对应标签显示在UI中。 -
def start_processing(self): if hasattr(self, 'base_dir'): self.process_button.setEnabled(False) self.status_label.setText("正在处理,请稍等...") # 创建后台线程处理图像 self.thread = ImageProcessor(self.base_dir) self.thread.slice_processed.connect(self.display_slice) self.thread.progress_updated.connect(self.update_progress) self.thread.process_completed.connect(self.processing_done) self.thread.start() def display_slice(self, image_slice, label_slice, patient, slice_num): self.ax_image.imshow(image_slice.T, cmap='gray', origin='lower') self.ax_image.set_title(f'{patient} - Image Slice {slice_num}') self.ax_label.imshow(label_slice.T, cmap='gray', origin='lower') self.ax_label.set_title(f'{patient} - Label Slice {slice_num}') self.canvas.draw()
start_processing
函数负责启动图像处理线程,而display_slice
函数则更新当前显示的图像和标签切片。4. 应用流程
- 选择患者文件夹:用户点击“选择患者文件夹”按钮,选择包含患者MRI数据的文件夹。
- 开始处理:点击“开始处理”按钮,启动多线程图像处理,系统会逐切片处理每个患者的MRI数据,并将处理进度显示在进度条上。
- 可视化显示:处理过程中,应用会显示每个图像切片和其对应的标签切片。
- 处理完成:所有数据处理完成后,进度条显示100%,并提示用户处理完成。