raw和mhd转换为png,jpg,bmp和tif格式
本代码解决的问题
- 针对标签数据:raw和mhd转换为png,jpg,bmp和tif格式
- 针对标签数据:更改图像中某一类别的像素值
- 针对标签数据:现有软件进行转化时,无法转化为彩色的RGB图像。当mhd和raw文件是彩色图像时如图1,需要保存为彩色的如图2,现有的软件只能将其转化为二值化或者灰度图像,这些软件仅适用于将原始数据转换为其他格式,但不适用于处理原始数据对应的彩色标签
- 针对标签数据:解决在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
点关注,不迷路!!!!!!