python 读取dicom文件转化成图片,使用PyQt5展示

使用python 读取DICOM文件,将其转化成图片,并使用PyQt5展示

ui.py文件代码

# -*- coding: utf-8 -*-



from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1162, 912)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.label.setText("")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1162, 26))
        self.menubar.setObjectName("menubar")
        self.menufile = QtWidgets.QMenu(self.menubar)
        self.menufile.setObjectName("menufile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionopen = QtWidgets.QAction(MainWindow)
        self.actionopen.setObjectName("actionopen")
        self.menufile.addAction(self.actionopen)
        self.menubar.addAction(self.menufile.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menufile.setTitle(_translate("MainWindow", "file"))
        self.actionopen.setText(_translate("MainWindow", "open"))

main.py代码

import sys

import pydicom
import numpy as np
from PIL import Image
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog

import ui


def dicom_to_image(dicom_file, output_file):
    # 读取DICOM文件
    dicom = pydicom.dcmread(dicom_file)

    # 提取像素数据
    pixel_array = dicom.pixel_array

    # 如果是多帧图像,选择第一帧
    print(pixel_array.ndim)
    if pixel_array.ndim > 2:
        print(f"多维图像检测到,使用第一个维度的数据。原始shape: {pixel_array.shape}")
        pixel_array = pixel_array[0]

    # 将像素值归一化到[0, 255]范围内
    image_array = (pixel_array - np.min(pixel_array)) / (np.max(pixel_array) - np.min(pixel_array)) * 255.0
    image_array = image_array.astype(np.uint8)

    # 检查数据维度并处理
    if image_array.ndim == 3 and image_array.shape[2] == 1:
        image_array = image_array[:, :, 0]

    # 将NumPy数组转换为图像并保存
    image = Image.fromarray(image_array)
    image.save(output_file)


class MainWindow(QMainWindow,ui.Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        # 绑定点击函数
        self.actionopen.triggered.connect(self.open_file)
    def open_file(self):

        filename, _ = QFileDialog.getOpenFileName(None, "dicom file", "./", "*.dcm", "")
        if filename:
            print(f"文件名称:{filename}")
            dicom_to_image(filename, "output_image.png")
            self.show_image_in_label("output_image.png",self.label)
    def show_image_in_label(self,path,label):

        # 如果是图像文件,则显示图像
        pixmap = QPixmap(path)
        # 将图像缩放为控件大小
        pixmap_scaled = pixmap.scaled(label.size(), aspectRatioMode=Qt.KeepAspectRatio)
        # 在label上显示图像
        label.setPixmap(pixmap_scaled)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

文件转化代码
 

def dicom_to_image(dicom_file, output_file):
    # 读取DICOM文件
    dicom = pydicom.dcmread(dicom_file)

    # 提取像素数据
    pixel_array = dicom.pixel_array

    # 如果是多帧图像,选择第一帧
    print(pixel_array.ndim)
    if pixel_array.ndim > 2:
        print(f"多维图像检测到,使用第一个维度的数据。原始shape: {pixel_array.shape}")
        pixel_array = pixel_array[0]

    # 将像素值归一化到[0, 255]范围内
    image_array = (pixel_array - np.min(pixel_array)) / (np.max(pixel_array) - np.min(pixel_array)) * 255.0
    image_array = image_array.astype(np.uint8)

    # 检查数据维度并处理
    if image_array.ndim == 3 and image_array.shape[2] == 1:
        image_array = image_array[:, :, 0]

    # 将NumPy数组转换为图像并保存
    image = Image.fromarray(image_array)
    image.save(output_file)

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要读取DICOM文件中的图像,可以使用Python中的PyDICOM库。以下是一个基本的示例代码,它读取DICOM文件并将其转换为NumPy数组: ``` import pydicom import numpy as np # 读取DICOM文件 ds = pydicom.dcmread("path/to/dicom/file.dcm") # 提取像素数据并将其转换为NumPy数组 pixel_data = ds.pixel_array np_array = np.array(pixel_data) # 可以在这里使用np_array来对图像进行处理或分析 ``` 在这个例子中,我们首先使用`pydicom.dcmread()`函数来读取DICOM文件。然后,我们使用`ds.pixel_array`属性提取像素数据,并将其转换为NumPy数组。 此时,我们可以使用NumPy中提供的各种函数和方法来对图像进行处理或分析。例如,我们可以使用`np.mean()`函数来计算图像的平均像素值: ``` mean_value = np.mean(np_array) print(mean_value) ``` 当然,这只是一个简单的示例。您可以根据需要使用PyDICOM和NumPy来进行更复杂的图像分析和处理。 ### 回答2: DICOM(Digital Imaging and Communications in Medicine)是医学图像和相关信息传输的国际标准。在Python中,我们可以使用pydicom库来读取DICOM文件中的图像。 首先,我们需要安装pydicom库。可以使用以下命令来安装: ``` pip install pydicom ``` 接下来,我们可以使用以下代码来读取DICOM文件中的图像: ```python import pydicom import matplotlib.pyplot as plt # 读取DICOM文件 ds = pydicom.dcmread("path/to/dicom_file.dcm") # 获取像素数据 pixels = ds.pixel_array # 显示图像 plt.imshow(pixels, cmap=plt.cm.gray) plt.axis("off") plt.show() ``` 在代码中,我们先使用pydicom.dcmread函数读取DICOM文件。然后,通过访问ds.pixel_array属性,我们可以获取图像的像素数据。最后,使用matplotlib.pyplot库中的函数来显示图像。 我们还可以从DICOM文件中获取其他相关信息,例如图像尺寸、像素间距等。下面是一个示例代码: ```python # 读取DICOM文件 ds = pydicom.dcmread("path/to/dicom_file.dcm") # 获取图像尺寸 width = ds.Columns height = ds.Rows # 获取像素间距 spacing_x = ds.PixelSpacing[0] spacing_y = ds.PixelSpacing[1] # 打印相关信息 print("图像尺寸:{} x {}".format(width, height)) print("像素间距:{}mm x {}mm".format(spacing_x, spacing_y)) ``` 通过上述代码,我们可以获取DICOM图像的尺寸和像素间距信息,并打印在控制台上。 以上是使用Python读取DICOM文件图像的简单示例。pydicom库还提供了更多功能,可以用于处理DICOM文件中的其他信息,例如病人姓名、医院名称等等。 ### 回答3: Python提供了多种库用于读取DICOM(数字图像通信医学)文件图片,其中比较常用的是pydicom库。 使用pydicom库,首先需要安装这个库。可以通过以下命令使用pip安装pydicom: ``` pip install pydicom ``` 安装完成后,就可以使用pydicom库来读取DICOM文件图片了。首先,需要导入pydicom库: ```python import pydicom ``` 然后,可以使用pydicom的`read_file()`函数来读取DICOM文件。例如,假设DICOM文件名为"image.dcm",可以使用以下代码来读取这个文件: ```python ds = pydicom.read_file("image.dcm") ``` 读取成功后,可以通过`ds`对象获取DICOM文件中的各种信息。例如,可以使用`pixel_array`属性来获取图像像素数据: ```python image_data = ds.pixel_array ``` 此时,`image_data`就是图像的像素数据,可以进行进一步的处理或显示。 除了`pixel_array`,还可以通过`ds`对象访问DICOM文件中的其他属性,例如患者姓名、身体部位、图像尺寸等。可以使用`print(ds)`来查看DICOM文件的详细信息。 最后,需要注意的是,读取DICOM文件时可能会遇到一些异常情况,比如文件不存在或格式不正确。在使用pydicom读取DICOM文件时,可以适当添加异常处理代码,以确保程序的稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值