图像数据预处理(一)——语义分割,医学影像分割
Semantic Segmentation Dataset由于图像的名字中有:1、中文、空格、数字开头、label2、origin的对应图像名字不同等各种各样的问题,数据探索和数据预处理尤为重要。针对1,可以用下面的代码来避免opencv在读取、保存时可能报错;针对2,尤其是我所不了解的,他人的数据、脏数据,要先搞清楚数据集的结构,将其整理成符合模型训练的结构。可见opencv路径报...
·
- 由于图像的名字中有:
- 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)
- 数据集:label RGB 3通道;origin 灰度图,虽然读取后显示的也是三维数组,但三个维度都一样
- label 绿色血管图做二值化 threshold
- origin 灰度图做归一化 /255,在训练的时候做
- 因此对origin只需进行滑动窗口分割预处理,对label需要先做__二值化__(去掉模糊的部分,让特征更明显),再做滑动窗口分割。
- 因为语义分割本质上是分类问题(这里是二分类),即 某一个像素属于哪一类(0 或 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
- train、val数据比例大概3:1
为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐
已为社区贡献1条内容
所有评论(0)