Advertisement

图像数据预处理(一)——语义分割,医学影像分割

阅读量:

Semantic Segmentation Dataset

  • 由于图像的名字中有:
  • 1、中文、空格、数字开头、label
  • 2、origin的对应图像名字不同
  • 等各种各样的问题,数据探索和数据预处理尤为重要。针对1,可以用下面的代码来避免opencv在读取、保存时可能报错;针对2,尤其是我所不了解的,他人的数据、脏数据,要先搞清楚数据集的结构,将其整理成符合模型训练的结构。
  • 可见opencv路径报错
复制代码
    import cv2 as cv
    import numpy as np
    import os
    
    def get_files(path):
    files=os.listdir(path)
    return files
    
    def cv_imread(file):
    img = cv.imdecode(np.fromfile(file, dtype=np.uint8), -1)
    return img
    
    def cv_imwrite(filename, src):
    cv.imencode(".jpg", src)[1].tofile(filename)
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
  • 数据集:binary RGB 3通道;原始灰度图像虽然读取后显示为三维数组形式但其三个维度具有相同的尺寸设置
  • Binary image green vessel undergoes binary conversion threshold操作
  • Original gray-scale image normalized to [0,1] range through dividing by 255该过程通常在模型训练阶段执行
  • 因此针对原始图像而言,在进行滑动窗口分割之前需完成归一化处理而对于目标标签则需先执行上述二值化操作以去除模糊区域以增强特征表达后再进行滑动窗口分割
  • 因为基于语义分割的方法本质上是一种分类技术即每个像素点将被划分为特定类别(此处仅分为两类即背景与血管)
复制代码
    #origin直接分割
    def img_process(in_path,out_path,size):
    files=get_files(in_path)
    for k in range(len(files)):
        img=cv_imread(in_path+files[k])#第k张图
        
        i=0
        while (i+1)*size<=len(img):#i行
            j=0
            while (j+1)*size<=len(img[0]):#j列,假设图片是矩形的
                part=img[i*size:(i+1)*size,j*size:(j+1)*size]
               
                j+=1
                save_path=out_path+str(k)+'_'+str(i)+'_'+str(j)+'.jpg'
                cv.imwrite(save_path,part)
            i+=1
    
    in_path='F:/data2/train/origin/'
    out_path='F:/data2/train/origin_depart/'
    img_process(in_path,out_path,256)
    
    in_path='F:/data2/val/origin/'
    out_path='F:/data2/val/origin_depart/'
    img_process(in_path,out_path,256)
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
复制代码
    import matplotlib.pyplot as plt
    msk = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
    plt.imshow(msk)
    
    
      
      
      
    
    代码解释
在这里插入图片描述
复制代码
    img=cv_imread(path)
    plt.imshow(img)
    
    
      
      
    
    代码解释
在这里插入图片描述
  • python中的图像的BGR,只要认准中间的G通道,两边的B和R无所谓
复制代码
    msk[np.where((img[...,0] < 50) & (img[..., 1] > 200) & (img[..., 2] < 50))] = 255
    plt.imshow(msk)
    
    
      
      
    
    代码解释
在这里插入图片描述
复制代码
    #label 需要二值化
    def img_process(in_path,out_path,size):
    files=get_files(in_path)
    for k in range(len(files)):
        img=cv_imread(in_path+files[k])#第k张图
        msk = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
        msk[np.where((img[...,0] < 50) & (img[..., 1] > 200) & (img[..., 2] < 50))] = 255
        #...,表示去之前的所有维数据,这里是三维数组,因此等价于 :: ,img[::, 2] 
        i=0
        while (i+1)*size<=len(msk):#i行
            j=0
            while (j+1)*size<=len(msk[0]):#j列,假设图片是矩形的
                part=msk[i*size:(i+1)*size,j*size:(j+1)*size]
               
                j+=1
                save_path=out_path+str(k)+'_'+str(i)+'_'+str(j)+'.jpg'
                cv.imwrite(save_path,part)
            i+=1
            
    in_path='F:/data2/train/label/'
    out_path='F:/data2/train/label_depart/'
    img_process(in_path,out_path,256)
    
    in_path='F:/data2/val/label/'
    out_path='F:/data2/val/label_depart/'
    img_process(in_path,out_path,256)
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

从train和val文件夹中分别提取了label_depart和origin_depart;两者的数量大致为3:1

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~