python 医学图像膝关节数据raw和mhd转换为png,jpg,bmp和tif格式, plt.savefig去白边, 坐标值和轴

文章介绍了如何使用Python的SimpleITK和matplotlib库将带有标签的MHD和RAW格式数据转换为PNG、JPG、BMP和TIFF格式,同时提供了改变图像中特定像素值的方法。此外,还讨论了将原始MHD和RAW数据转换为DCM格式,以及使用MATLAB批量修改文件夹中所有图像的像素值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本代码解决的问题

  • 针对标签数据:raw和mhd转换为png,jpg,bmp和tif格式
  • 针对标签数据:更改图像中某一类别的像素值
  • 针对标签数据:现有软件进行转化时,无法转化为彩色的RGB图像。当mhd和raw文件是彩色图像时如图1,需要保存为彩色的如图2,现有的软件只能将其转化为二值化或者灰度图像,这些软件仅适用于将原始数据转换为其他格式,但不适用于处理原始数据对应的彩色标签
    图1
    在这里插入图片描述
  • 针对标签数据:解决在plt保存时去白边, 坐标值和轴进行保存
  • 针对image(非标签数据)数据:raw和mhd转换为png,jpg,bmp和tif格式
  • 注意:mhd和raw这两个文件必须同时存在

将带有标签的mhd和raw数据进行保存,下面是处理某一个切片


import SimpleITK as sitk
import cv2
#SimpleITK库
from PIL import Image
import matplotlib.pyplot as plt
#matplotlib库

case_path =r'D:\1\labels-001.mhd'
#图像路径

itkimage = sitk.ReadImage(case_path)#这部分给出了关于图像的信息,可以打印处理查看

#print(itkimage)

image = sitk.GetArrayFromImage(itkimage)
#z,y,x,Z为一共多少张图像,y和x为宽和高
print(image.shape)
#查看第35张图像的大小
print(image[35,:,:].shape)

# 多张图片保存路径
# i=35
# save_dir=r'D:\1/'+"%03d.png"%i


# 保存方式一:不会改变图像的大小

plt.imsave(r"D:\1\1.png",image[35,:,:])

# 保存方式二:会改变图像的大小
# plt.figure(1)
# plt.axis('off') # 去坐标轴
# plt.xticks([]) # 去刻度
# plt.yticks([]) # 去刻度
# plt.imshow(image[1,:,:])
# plt.savefig(r"D:\1\1.png",bbox_inches='tight',pad_inches = 0)
# plt.show()

将带有标签的mhd和raw数据进行保存,下面是一个标签数据下的所有切片进行保存的代码

import SimpleITK as sitk
import cv2
#SimpleITK库
from PIL import Image
import matplotlib.pyplot as plt
#matplotlib库
import os

path =r"D:\1"
#mhd所在的文件夹路径

for i in range (1,3):
    # mhd文件的绝对路径
    lable_file=path+"/labels-%03d.mhd"%i
    itkimage = sitk.ReadImage(lable_file)#这部分给出了关于图像的信息,可以打印处理查看
    # print(itkimage)

    image = sitk.GetArrayFromImage(itkimage)
    #z,y,x,Z为一共多少张图像,y和x为宽和高
    print(image.shape)
    # #查看第35张图像的大小
    # print(image[35,:,:].shape)

    # 获取文件名的basename,如'E:/2021作品/test.csv'获取后得到test
    lable_basename = os.path.basename(lable_file).split('.')[0]
    # 设置切片的文件夹目录
    slice_dir = r'D:\1/' + lable_basename
    if not os.path.exists(slice_dir):
        os.mkdir(slice_dir)
    # 保存mhd下的所有切片
    for j in range(0,image.shape[0]):
        save_slice = slice_dir + "/label_%03d.png" % (j+1)
        plt.imsave(save_slice, image[j, :, :])

原始数据mhd和raw(非标签数据)转化为dcm或者常见的格式

  • 将mhd和raw数据转化为dcm格式:处理流程——首先使用3Dslicer 软件将mhd和raw数据打开,然后转化为dcm格式,具体操作流程如下

在这里插入图片描述
在这里插入图片描述

  • 如果需要保存为jpg,png,tif格式等常规模式,只需要将上面得到的dcm结果继续转化即可,此时使用volume shop即可批量处理为pg,png,tif格式。大家可能会疑问,3Dslicer也有直接将其转化为常规格式的功能,为什么不直接用,因为3Dslicer只能保存一张切片,不能一键转换。如下图所示
    在这里插入图片描述

改变像素值,如果想将背景设置为[0,0,0]

  • 使用MATLAB代码将其进行转换
  • 小技巧:可以使用snipaste进行查看
I = imread('D:\1\labels-001\label_037.png'); %读取图像
[m n k]=size(I)
for i=1:m%图片长(像素)
    for j=1:n%图片宽(像素)
        if (I(i,j,1)==68 && I(i,j,2)==1 && I(i,j,3)==84) %如果某点的像素值为[68,1,84]
            I(i,j,1)=0;
            I(i,j,2)=0;
            I(i,j,3)=0;%[68,1,84]变为[0,0,0]
        end
    end
end
figure
imshow(I);
imwrite(I,'D:\1\result.png')

在这里插入图片描述

改变一个文件夹下所有图像的像素值

imgPath = 'D:\1\labels-001/';        % 图像库路径
imgDir  = dir([imgPath '*.png']); % 遍历所有jpg格式文件
disp(length(imgDir))

for i_file = 1:length(imgDir)          % 遍历结构体就可以一一处理图片了
    I = imread([imgPath imgDir(i_file).name]); %读取每张图片
    [m n k]=size(I)
    for i=1:m%图片长(像素)
        for j=1:n%图片宽(像素)
            if (I(i,j,1)==68 && I(i,j,2)==1 && I(i,j,3)==84) %如果某点的像素值为[68,1,84]
            I(i,j,1)=0;
            I(i,j,2)=0;
            I(i,j,3)=0;%则变为[0,0,0]
            end
        end
    end
    s='D:\1\labels-001/s/';%保存目标
    imwrite(I,[s imgDir(i_file).name])%将文件名保存为与原文件名相同的名字
end

在这里插入图片描述

参考链接1:https://www.jianshu.com/p/31ccb95409c5
参考链接2:https://blog.youkuaiyun.com/disanda/article/details/123552972
参考链接3:https://mp.weixin.qq.com/s

点关注,不迷路!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三少的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值