上一篇参考其他博主的代码,实现了批量crop图片和mask,但是没有对图片大小不能整除size的情况进行处理,所以进行改进。
加入了长宽的判断条件,使用opencv对大小不满足设定的size的patch进行填充,最后得到相同size的patch,主要使用cv2.copyMakeBorder方法,如果需要其他填充,可以查查官方文档
代码如下:
import cv2
import math
import os
import numpy as np
from pathlib import Path
file_path = "/xxx/img/" #原图路径
gt_path = "/xxx/seg/gt_img/" #mask路径
save_path = '/xxx/crop_images' #原图crop后保存路径
save_gt_path = '/xxx/crop_gt' # mask crop后保存路径
Path(save_path).mkdir(parents=True, exist_ok=True)
Path(save_gt_path).mkdir(parents=True, exist_ok=True)
for filename in os.listdir(file_path):
# crop的size
height = 512
width = 512
# overlap大小
over_x = 128
over_y = 128
h_val = height - over_x
w_val = width - over_y
# 设置是否丢弃不符合大小的图像
mandatory = False
img = cv2.imread(file_path + filename,1) #原图按照3通道彩色读入
gt_img = cv2.imread(gt_path + filename,0) #mask按照灰度图单通道读入
print("img info :",filename, img.shape)
print("gt info :",filename, gt_img.shape)
# original image size
original_height = img.shape[0]
original_width = img.shape[1]
max_row = float((original_height - height) / h_val) + 1
max_col = float((original_width - width) / w_val) + 1
max_row = math.ceil(max_row) if mandatory == False else math.floor(max_row)
max_col = math.ceil(max_col)