基于 PyQt5 和 Matplotlib 的医学图像处理应用开发

news2024/11/25 14:59:41

1. 引言

在医学领域,图像处理是一项非常重要的技术,特别是在医学成像(如MRI、CT扫描等)的数据处理上,可以帮助医生更加准确地进行诊断。本项目基于 PythonPyQt5 图形用户界面框架与 Matplotlib 数据可视化库,开发了一款简洁高效的 医学图像处理器。该应用能够读取 .nii.gz 格式的医学图像,并结合图像标签(标注的分割结果),以切片的形式进行可视化和处理,极大地方便了医学图像数据的查看和分析。


2. 项目架构与功能概述

项目采用模块化的设计,分为以下几个核心模块:

  1. 用户界面模块(UI):基于 PyQt5,用于构建图形用户界面,支持文件夹选择、图像切片可视化、处理进度显示等功能。
  2. 图像处理模块:负责读取医学图像文件(NIfTI 格式),并对图像数据进行逐切片处理和存储。
  3. 美化模块:负责设置应用界面的风格,包括窗口背景、按钮样式、进度条等美观处理。
  4. 后台处理模块:使用 多线程 进行图像处理,确保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_styleset_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 实现图像可视化处理。同时,通过 多线程 保证了大数据量处理时界面的流畅响应,用户可以实时查看处理进度和图像数据。

如果您正在处理医学图像数据,或者需要开发类似的图像处理应用,本项目将为您提供有价值的参考和灵感。


  1. 选择文件夹并处理图像:用户点击按钮选择患者数据文件夹,之后启动图像处理线程。
  2. 实时更新进度条:通过捕捉线程发射的 progress_updated 信号,实时更新处理进度。
  3. 显示图像切片:使用 Matplotlib 将医学图像切片和对应标签显示在UI中。
  4. 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. 应用流程

  5. 选择患者文件夹:用户点击“选择患者文件夹”按钮,选择包含患者MRI数据的文件夹。
  6. 开始处理:点击“开始处理”按钮,启动多线程图像处理,系统会逐切片处理每个患者的MRI数据,并将处理进度显示在进度条上。
  7. 可视化显示:处理过程中,应用会显示每个图像切片和其对应的标签切片。
  8. 处理完成:所有数据处理完成后,进度条显示100%,并提示用户处理完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Variational Auto-Encoder(VAE)缺少数学推导未完结版

VAE是Diffusion的基础&#xff0c;在其中将输入的图片数据编码到潜在空间后再解码出来。 略显复杂&#xff0c;博主结合李宏毅视频、网上一些讲解以及自己的理解将其总结如下&#xff1a; 一、什么是VAE VAE&#xff08;变量自编码器&#xff09;最早在以上两篇文章被提出。 …

yakit使用教程(四,信息收集)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a;yakit下载安装教程。 一&#xff0c;基础爬虫。 在新建项目或新建临时项目后&#xff0c;点击安全工具&#xff0c;点击基础爬虫。 此工具并不是为了爬取网站上的一…

【零散技术】MAC 安装多版本node

时间是我们最宝贵的财富,珍惜手上的每个时分 不同前端项目运行的node版本不一致&#xff0c;会导致无法运行&#xff0c;就像Odoo也需要依据版本使用对应的python环境。python 可以用 conda随时切换版本&#xff0c;那么Node可以吗&#xff1f;答案是肯定的。 1、安装 n&#x…

k8s-资源管理、实战入门

资源管理 一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 &#xff08;1&#xff09;kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;所谓的部署服务&…

SpringBoot高校学科竞赛平台:性能优化与实践

3系统分析 3.1可行性分析 通过对本高校学科竞赛平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本高校学科竞赛平台采用SSM框架&#xff0c;JAVA作为开发语…

详细分析Redisson分布式锁中的renewExpiration()方法

目录 一、Redisson分布式锁的续期 整体分析 具体步骤和逻辑分析 为什么需要递归调用&#xff1f; 定时任务的生命周期&#xff1f; 一、Redisson分布式锁的续期 Redisson是一个基于Redis的Java分布式锁实现。它允许多个进程或线程之间安全地共享资源。为了实现这一点&…

C++ 高级特性:函数重载、内联函数、引用、auto关键字、范围for循环和nullptr空指针

目录&#xff1a; &#x1f4d1;前言&#x1f4d6;函数重载&#x1f4d6;内联函数&#x1f4d6;引用☁️引用的概念☁️引用的特性⭐引用在定义时必须初始化⭐一个变量可以有多个引用(类比于一个人可以有多个外号)⭐ 引用一旦引用一个实体&#xff0c;再不能引用其他实体 ☁️常…

关于WPF(Windows Presentation Foundation)中Grid控件

本文将从Grid控件的基础概念开始&#xff0c;逐步深入探讨其特性、用法、实例代码&#xff0c;以及最佳实践。 1. WPF和布局简介 WPF是一种用于构建Windows桌面应用程序的UI框架&#xff0c;它通过XAML&#xff08;Extensible Application Markup Language&#xff09;使开…

java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式再最下方&#xff08;本次10月份活动福利&#xff0c;免费提供下载&#xff0c;自行到对应的方式1下载&#xff0c;csdn的0积分下载&#xff09; java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频) 基于Java的扫雷游戏…

电子电气架构 --- 智能网联汽车未来是什么样子?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

C3D网络介绍及代码撰写详解(总结3)

可以从本人以前的文章中可以看出作者以前从事的是嵌入式控制方面相关的工作&#xff0c;是一个机器视觉小白&#xff0c;之所以开始入门机器视觉的学习主要是一个idea&#xff0c;想把机器视觉与控制相融合未来做一点小东西。废话不多说开始正题。&#xff08;如有侵权立即删稿…

基于微信小程序的在线点歌系统(论文+源码)-kaic

摘 要 随着社会与互联网的发展&#xff0c;人们已经不在停留在温饱的层面上&#xff0c;而是开始了享受生活&#xff0c;而最能突出网络飞速发展的当属娱乐&#xff0c;从最初的网吧上网到现在的我们可以随时随地上网&#xff0c;观看自己喜欢的各式各样的电影电视剧和短视频&a…

数据结构与算法 - 顺序表与链表的区别

文章目录 前言 一、顺序表与链表的定义 1、顺序表 2、链表 二、区别 1、顺序表(动态顺序表)&#xff1a; 2、链表(带头双向循环链表)&#xff1a; 3、将上述文字用图表形式展示&#xff1a; 4、CPU高速缓存命中率 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索…

Nginx实战指南:基础知识、配置详解及最佳实践全攻略

背景 在Java系统实现过程中&#xff0c;我们不可避免地会借助大量开源功能组件。然而&#xff0c;这些组件往往功能丰富且体系庞大&#xff0c;官方文档常常详尽至数百页。而在实际项目中&#xff0c;我们可能仅需使用其中的一小部分功能&#xff0c;这就造成了一个挑战&#…

数组中两个字符串的最小距离(图+文字详解)

链接&#xff1a;数组中两个字符串的最小距离__牛客网 题目:给定一个字符串数组strs&#xff0c;再给定两个字符串str1和str2&#xff0c;返回在strs中str1和str2的最小距离&#xff0c;如果str1或str2为null&#xff0c;或不在strs中&#xff0c;返回-1。 思路: 给定两个下标…

Pycharm 随时调整字体大小(放大或缩小)

实现按住 ctrl 滑动鼠标滚轮实现代码窗口字体大小调整&#xff1a; File 一>Settings 一>Editor一>General里 的Mouse Control把Change font size with CtrlMouse Wheel打上对勾&#xff0c;点击OK即可 使用快捷键 放大字体&#xff1a; Windows/Linux: Ctrl macOS…

IP报文格式、IPv6概述

IPv4报文格式 IPv4报文首部长度至少为20字节(没有可选字段和填充的情况下)&#xff0c;下面来逐一介绍首部各个字段的含义 Version版本&#xff1a;表示采用哪一种具体的IP协议&#xff0c;对于IPv4来说该字段就填充4以表示&#xff0c;如果是IPv6就填充6IHL首部长度&#xff…

Android内容观察者(案例:监听数据库+代码+效果图)

目录 1.内容观察者概念 1. 什么是 ContentObserver&#xff1f; 2. 主要方法 3. 使用场景 4. 工作原理 5. 注册和注销 6. 实现步骤 7. 注意事项 2.创建内容观察者 3.注册内容观察者 4.取消注册内容观察者 5.完整的activity代码 6.案例:检测数据库 1&#xff09;创建一个Android…

HTML(五)列表详解

在HTML中&#xff0c;列表可以分为两种&#xff0c;一种为有序列表。另一种为无序列表 今天就来详细讲解一下这两种列表如何实现&#xff0c;效果如何 1.有序列表 有序列表的标准格式如下&#xff1a; <ol><li>列表项一</li><li>列表项二</li>…

Linux下CMake入门

CMake的基础知识 什么是 CMake CMake 是一个跨平台的构建工具&#xff0c;主要用于管理构建过程。CMake 不直接构建项目&#xff0c;而是生成特定平台上的构建系统&#xff08;如 Unix 下的 Makefile&#xff0c;Windows 下的 Visual Studio 工程&#xff09;&#xff0c;然后…