最近在做一个线粒体的实例分割数据集转目标检测数据集,记录一下

原图:

原图mask

 

尺寸4096*4096, 需要经过预处理裁成512*512,同时mask是灰度图,要先转成黑白的,顺序是先二值化rbg to mask,再统一裁成512格式,最后再转换成对应的yolo格式

二值化,师弟写的,放上来记录一下

import cv2

import numpy as np

import os, glob

def rgb2masks(label_name):

lbl_id = os.path.split(label_name)[-1].split('.')[0]

lbl = cv2.imread(label_name, 1)

h, w = lbl.shape[:2]

idx = 0

num_instance = lbl[:,:,2].max()

mask_name_list = ['Podo','ECs','GBM']

mask = (lbl[:,:,0]!=0).astype(np.uint8)

mask[mask==1] =255

mask_name = save_path + lbl_id.replace('seg', 'im') + '_Mito' +'_1' + '.png'

cv2.imwrite(mask_name, mask)

# for i in range(num_instance):

# mask = (lbl[:,:,0]!=0).astype(np.uint8)

# # mask[mask==1] =255

# mask_name = save_path + lbl_id + '_Mito' +f'_{(i+1)}' + '.png'

# cv2.imwrite(mask_name, mask)

label_dir = './mitoem/MitoEM-H/mask_val'

save_path = './mitoem/MitoEM-H/mask_label_val/'

os.makedirs(save_path,exist_ok=True)

label_list = glob.glob(os.path.join(label_dir, '*.tif'))

for label_name in label_list:

rgb2masks(label_name)

裁剪代码

import shutil

import os

import ast

import cv2

from PIL import Image

def crop_to_512(img_dir,save_dir,crop_list,crop_size):

imgs = os.listdir(img_dir) # 对应图像对应切割

num=0

for img in imgs:

img_path = os.path.join(img_dir, img)

image = cv2.imread(img_path) # crop img

len_x = len(crop_list)

len_y = len(crop_list)

for i in range(len_x):

for j in range(len_y):

crop_img = image[

crop_list[j]:crop_list[j] + crop_size[1],

crop_list[i]:crop_list[i] + crop_size[0],

]

new_img_name = img[:-4]

new_img_name += '_0' + str(i) + '_0' + str(j) + '.png'

crop_img = Image.fromarray(crop_img)

crop_img.save(os.path.join(save_dir, new_img_name))

num += 1

print('finsih crop:',img)

if __name__ == '__main__':

img_dir='./mitoem/MitoEM-H/img_train' #png,4096*4096 to 512*512

save_dir='./mitoem/crop_img_train'

if not os.path.exists(save_dir):

os.makedirs(save_dir)

img_size=[4096,4096]

crop_size=[512,512]

# n=0

# list=[] #x_list

# for i in range(0,9):

#

# list.append(n)

# n=n+512

#

# print(list)

crop_list=[0, 512, 1024, 1536, 2048, 2560, 3072, 3584]

crop_to_512(img_dir,save_dir,crop_list,crop_size)

mask to yolo

import os

import numpy as np

from itertools import groupby

from skimage import morphology, measure

from PIL import Image

from scipy import misc

import cv2

# 因为一张图片里只有一种类别的目标,所以label图标记只有黑白两色

rgbmask = np.array([[0, 0, 0], [255, 255, 255]], dtype=np.uint8)

# 从label图得到 boundingbox 和图上连通域数量 object_num

def getboundingbox(image):

# mask.shape = [image.shape[0], image.shape[1], classnum]

mask = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)

mask[np.where(np.all(image == rgbmask[1], axis=-1))[:2]] = 1

# 删掉小于10像素的目标

mask_without_small = morphology.remove_small_objects(mask, min_size=10, connectivity=2)

# 连通域标记

label_image = measure.label(mask_without_small)

# 统计object个数

object_num = len(measure.regionprops(label_image))

boundingbox = list()

bboxs=list()

for region in measure.regionprops(label_image): # 循环得到每一个连通域bbox

b=[region.bbox[1],region.bbox[3],region.bbox[0],region.bbox[2]]

bbox=convert([4096,4096],b)

bboxs.append(bbox)

boundingbox.append(region.bbox)#

return object_num, boundingbox,bboxs

def convert(size, box):

dw = 1. / size[0]

dh = 1. / size[1]

x = (box[0] + box[1]) / 2.0

y = (box[2] + box[3]) / 2.0

w = box[1] - box[0]

h = box[3] - box[2]

x = x * dw

w = w * dw

y = y * dh

h = h * dh

return (x, y, w, h)

def mask_to_yolo(mask_dir,save_dir):

if not os.path.exists(save_dir):

os.makedirs(save_dir)

imgs=os.listdir(mask_dir)

for img in imgs:

img_path=os.path.join(mask_dir,img)

img0 = cv2.imread(img_path)

out_file = open(save_dir+'/'+img.split('.')[0]+'.txt', 'w')

object_num, boundingbox, bboxs = getboundingbox(img0)

for i in bboxs:

out_file.write('0' + " " + " ".join([str(a) for a in i]) + '\n')

if __name__ == '__main__':

mask_to_yolo()

# imgdir='./mitoem/MitoEM-H/mask_label_train/im0000_Mito_1.png'

# img=cv2.imread(imgdir)

# out_file = open('./mitoem/yolo/im0000_Mito_1.txt', 'w')

# object_num, boundingbox,bboxs=getboundingbox(img)

#

# print(object_num,boundingbox)

# for i in bboxs:

# out_file.write('0' + " " + " ".join([str(a) for a in i]) + '\n')

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: