Unet_p12项目数据制作处理代码

文件结构如下:
这里写图片描述

#coding:utf-8
#该代码实现了标签图片的灰度、二值化,并保存;多张图片集合成序列图片,并保存为.mhd格式
#实现了原始图片对应标签文件同名一一对应,并保存,文件名写入到对应的文件夹
# 灰度化后会有对比度低的警告,imshow()可以传文件的路径,也可以传np.array
#先定义好原始图片的路径和处理后要保存的路径,linux 系统用/ 替换\\
origin_image_path = '..\\origin_data\\SE6\\'  #原始图片路径 
origin_label_path = '..\\origin_data\\attachments\\'  #原始标签路径
artery_image_path = '..\\data\\artery_data\\'  #处理后的动脉图片路径
artery_label_path = '..\\data\\artery_label\\'  #处理后的动脉标签路径
vein_image_path = '..\\data\\vein_data\\'  #处理后的静脉图片路径
vein_label_path = '..\\data\\vein_label\\'  #处理后的静脉图片路径
artery_label_path_mhd = '..\\data\\artery_label_mhd\\' #保存.mhd文件的路径
vein_label_path_mhd = '..\\data\\vein_label_mhd\\' #保存.mhd文件的路径
artery_txtname = '..\\data\\artery.txt'
vein_txtname = '..\\data\\vein.txt'

#导入需要的包
from skimage import io,color,transform
import os
import SimpleITK as itk
from PIL import Image
import numpy as np

def covert_binary(img):  #定义一个二值化的函数,接收的是已经imread图片的np.array,由于标签图像是四通道的,像素值都为0,这种方法好像不太好使
    rows,cols=img.shape

    for i in range(rows):
        for j in range(cols):
            if (img[i,j]<=0.5):
                img[i,j]=0
            else:
                img[i,j]=1

def covert_gray_binary(path): #接收图片的路径
    img=Image.open(path) #打开图片,类型是一个Mode:RGBA,所以像这种四通道的,还得这种方式二值化
    img_gray = img.convert('L') # 类型转化成了Mode:L
    table = []
    theshold =0.5
    for i in range(256):
        if i<=theshold:
            table.append(0)
        else:
            table.append(1)
    return img_gray.point(table,'1')

#因为是根据标签图片的文件名去找出相对应的原始图片,所有先挑出标签图像
label_list = os.listdir(origin_label_path) #得到的是原始标签图片路径下所有文件名组成的列表
for filename in label_list:  #filename 是文件名,字符串
    if filename[-5]==np.str(1):       #原始标签图片的文件名规律,例如一张图片的文件名:p_3_1.png,索引为-5的值是1的都是artery动脉图片,值为2就是vein 静脉,由此可以作为条件判断
        path = origin_label_path + filename
        img = covert_gray_binary(path)
        #img = io.imread(path,as_grey=True) #读取原始标签图片中符合条件的(动脉)图片,以灰度图的形式,shape类似于(512,512)
        #img_resize = transform.resize(img,(512,512)) #统一图片size
        #img_binary = covert_binary(img_resize)  #对图片二值化处理,标签是四通道,像素都为0 ,先不用这种方法
        str = artery_label_path + '%s.bmp' % filename[:-6]
        img.save(str) #保存处理好的图片到artery_label_path路径中,并且文件名也与原始图片的对应

    else:
        path1 = origin_label_path + filename
        #img1 = io.imread(path1,as_grey=True) #读取原始标签图片中符合条件的(静脉)图片,以灰度图的形式,shape类似于(512,512)
        #img1_resize = transform.resize(img1,(512,512)) #统一图片size
        #img1_binary = covert_binary(img1_size)  #对图片二值化处理
        img1 = covert_gray_binary(path1)        
        str1 = vein_label_path + '%s.bmp' % filename[:-6]
        img1.save(str1) #保存处理好的图片到vein_label_path路径中,并且文件名也与原始图片的对应,因为这个是模式Mode,io.imsave保存就是一片黑的图片


def covert_resize(f):
    img = io.imread(f) #读取已经二值化后的图像
    img_resize = transform.resize(img,(512,512)) #统一图片size
    return img_resize


str_artery = artery_label_path + '*.bmp' #读取已经二值化后的图像的路径
coll_artery = io.ImageCollection(str_artery,load_func=covert_resize) # 批量读取处理好的图片
mat_artery = io.concatenate_images(coll_artery) #把多张图片集合起来,可以mat.shape 看看是不是(batch_size,512,512)
array2img = itk.GetImageFromArray(mat_artery) #从矩阵mat得到图片,相反的函数为:itk.GetArrayFromImage()
newname = 'Case00' #集合后的文件名
#io.imsave(artery_label_path_mhd + newname + '.mhd',array2img) #保存处理好的图片到artery_label_path路径中,并且文件名也与原始图片的对应
itk.WriteImage(array2img,artery_label_path_mhd + newname + '.mhd') #上面的方式保存不管用,可能是经过itk.GetArrayFromImage()转化的原因


#下面代码同理实现vein静脉标签图片上述功能 
str_vein = vein_label_path + '*.bmp'
coll_vein = io.ImageCollection(str_vein,load_func=covert_resize) # 批量读取处理好的图片
mat_vein = io.concatenate_images(coll_vein) #把多张图片集合起来,可以mat.shape 看看是不是(batch_size,512,512)
array2img = itk.GetImageFromArray(mat_vein) #从矩阵mat得到图片,相反的函数为:itk.GetArraryFromImage()
newname = 'Case00' #集合后的文件名
itk.WriteImage(array2img,vein_label_path_mhd + newname + '.mhd') #保存处理好的图片到vein_label_path路径中,并且文件名也与原始图片的对应


#把分出来的标签图片路径的文件名写到一个.txt文件中
def label_to_image(path_type,txt_type,str_type):
    img_path = os.listdir(path_type)
    txtname = txt_type
    f = open(txtname,'a+')
    for filename in img_path:
        new_context = filename + ' '
        f.write(new_context)
        str = origin_image_path + '%s.bmp' % filename
        img = io.imread(str)
        io.imsave(str_type + '%s.bmp' % filename,img)

artery_img_save = label_to_image(artery_label_path,artery_txtname,artery_image_path)
vein_img_save = label_to_image(vein_label_path,vein_txtname,vein_image_path)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值