笔记:系列dicom图片转PNG,并旋转镜像

脚本实现NII文件转PNG,包括切片保存、图像旋转和镜像操作,使用了Python的nibabel、imageio和PIL库。
摘要由CSDN通过智能技术生成

目录下要先新建zhuanzheng文件夹
z文件夹会自己创建

import os
import nibabel as nib
import imageio
from PIL import Image
from PIL import Image
import os


#nii文件转png
def read_niifile(niifilepath):  # 读取niifile文件
    img = nib.load(niifilepath)  # 下载niifile文件(其实是提取文件)
    img_fdata = img.get_fdata()  # 获取niifile数据
    return img_fdata
 
'''
def save_fig(niifilepath, savepath):  # 保存为图片
    fdata = read_niifile(niifilepath)  # 调用上面的函数,获得数据
    (x, y, z) = fdata.shape  # 获得数据shape信息:(长,宽,维度-切片数量,第四维)
    for k in range(x):
        silce = fdata[k, :, :]  # 三个位置表示三个不同角度的切片
        imageio.imwrite(os.path.join(savepath, '{}.png'.format(k)), silce)
        # 将切片信息保存为png格式
''' 
    
def save_fig(niifilepath, savepath):  # 保存为图片
    fdata = read_niifile(niifilepath)  # 调用上面的函数,获得数据
    (x, y, z) = fdata.shape  # 获得数据shape信息:(长,宽,维度-切片数量,第四维)
    for k in range(z):
        silce = fdata[:, :, k]  # 三个位置表示三个不同角度的切片
        imageio.imwrite(os.path.join(savepath, '{}.png'.format(k)), silce)
        # 将切片信息保存为png格式
 
    
def get_filelist(path):
    Filelist = []
    for home, dirs, files in os.walk(path):
        for filename in files:
            # 文件名列表,包含完整路径
            Filelist.append(os.path.join(home, filename))
            # # 文件名列表,只包含文件名
            # Filelist.append( filename)
 
    return Filelist 
    
if __name__ == '__main__':
    niifilepath = r"F:\desktop\1\draw\238246_brain.nii.gz"
    savepath = r'F:\desktop\1\draw\png238246\z'
    if not os.path.exists(savepath):
        os.makedirs(savepath)
    save_fig(niifilepath, savepath)

    #获取文件夹得目录
    filePath = savepath
 
    # 指定保存的文件夹
    outputPath = savepath
 
    # 获得文件夹下所有文件
    Filelist = get_filelist(filePath)
    print(len(Filelist))
    # 迭代所有图片
    for filename in Filelist:
        print(filename)
        # 读取图像
        im = Image.open(filename)
        # 指定逆时针旋转的角度
        #im_rotate = im.transpose(Image.ROTATE_90)
        #im_rotate = im.transpose(Image.ROTATE_180)
        im_rotate = im.transpose(Image.ROTATE_270)
        # 保存图像
        output_path = filename.replace(filePath, outputPath)
        outputdir = output_path.rsplit('\\', 1)[0]
        if not os.path.exists(outputdir):
            os.mkdir(outputdir)
        im_rotate.save(output_path)
        #水平镜像保存
       
 
# 设置输入和输出目录
input_dir = r"F:\png238246\z"
output_dir = r"F:\zhuanzheng"
 
# 循环输入目录中的所有png图像, 这里如果你是别的类型格式图片,直接更改点后图片类型即可
for filename in os.listdir(input_dir):
    if filename.endswith('.png') or filename.endswith('.png'):
        
        # 打开图像
        img = Image.open(os.path.join(input_dir, filename))
 
        # 水平镜像并保存
        mirrored_img = img.transpose(Image.FLIP_LEFT_RIGHT)
        mirrored_img.save(os.path.join(output_dir, f'horiz_{filename}'))
 
        # 垂直镜像并保存
        mirrored_img = img.transpose(Image.FLIP_TOP_BOTTOM)
        mirrored_img.save(os.path.join(output_dir, f'vert_{filename}'))
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的pydicom库来对DICOM图像进行读取、编辑和写入操作。下面是一段示例代码,首先读取多个DICOM图像,进行旋转并保存为新的DICOM文件: ```python import pydicom import numpy as np def rotate_dicom(dicom_file_path, angle): # Load DICOM file ds = pydicom.dcmread(dicom_file_path) # Get the image data as a numpy array img = ds.pixel_array # Rotate the image using numpy img_rotated = np.rot90(img, k=angle//90) # Update the image pixel data in the DICOM dataset ds.PixelData = img_rotated.tobytes() # Adjust the image orientation and position information ds.ImageOrientationPatient = ds.ImageOrientationPatient[-2:] + ds.ImageOrientationPatient[:2] ds.ImagePositionPatient = ds.ImagePositionPatient[-1::-1] # Update the DICOM tag for the rotation angle ds[0x0020, 0x0037] = ''.join(['[', str(np.cos(np.radians(angle))), '\\', str(-np.sin(np.radians(angle))), '\\0\\', str(np.sin(np.radians(angle))), '\\', str(np.cos(np.radians(angle))), '\\0]']) # Save the rotated DICOM file ds.save_as(dicom_file_path.replace('.dcm', '_rotated.dcm')) # Example usage dicom_files = ['image1.dcm', 'image2.dcm', 'image3.dcm'] for file in dicom_files: rotate_dicom(file, 90) ``` 这段代码中,我定义了一个rotate_dicom函数,它接受一个DICOM文件路径和旋转角度作为输入。首先,它使用pydicom库中的dcmread函数加载DICOM文件并获取像素数组。然后,它使用numpy库旋转图像数组,并更新DICOM数据集中的像素数据。接下来,它使用DICOM标签更新图像的定位和方向信息以及旋转角度。最后,它使用save_as函数将旋转后的图像保存为新的DICOM文件。在示例中,函数被循环调用以对多个DICOM文件进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值