这几天在忙着整理自己的数据集,使用工业级相机拍了好多高清照片,但是模型训练的时候需要使用512*512像素点大小的图像,而且我的模型设计的时候就已经规定好了训练样本大小。
那就分割呗,把拍的照片按512*512分割一小块一小块的,然后打标签,喂模型进行训练。
一、单张图像按指定需求进行分割
思路:首先给定图片的位置picture_path
,然后指定要保存的位置picture_save_path
,picture_name
为了后续保存分割图像命名方便,就按原名称_数字
进行命名,例如原名称a1.TIF
,分割之后存放的名称为a1_1_1.jpg
、a1_1_2.jpg
以此类推
target_width、target_high、target_channel
设定需要分割的宽高通道数,我这边数据集是彩色的需要512*512像素的数据集,故设置成target_width = 512
target_high = 512
target_channel = 3
然后读取图片picture = cv2.imread(picture_path)
看下图片的宽高通道数信息print(picture.shape)
,我这里是(4024, 6048, 3)
,这是OpenCV的imread()方法,返回的结果类型为[H,W,C]
,跟Pytorch还不一样,家人们需要注意下
然后把图片的H、W、C信息给取出来
因为需要一块一块的分割,其实就是一点一点的移动而已
H_number = int(H/target_high)
W_number = int(W/target_width)
看下能分割几个,H是图片实际的高度,target_high为
需要分割的小块高度,比如我这个原图H是4024,我需要分割成512高度的图像target_high=512,然后H_number = 4024/512 = 7.859375,然后取整H_number=7;同理W也是一样的操作
然后就是循环呗,每行每行进行分割
mask = picture[i*target_width:(i+1)*target_width, j*target_high:(j+1)*target_high, :]
,这里的picture[W,H,C]
,使用切片操作就行,宽度从[i*target_width:(i+1)*target_width]
,其实就是一小块一小块的进行移动而已,同理高度也是 j*target_high:(j+1)*target_high
,:
颜色通道就不动了,多少还是多少;最终mask就是一块所需要的大小图片,然后就是保存
save_picture = picture_save_path + picture_name + "_{}_{}.jpg".format(i+1,j+1)
,指定要保存的位置路径和命名,最后想保存什么格式把.jpg
改一下就行
cv2.imwrite(save_picture,mask)
,最后保存一下即可
完整代码
import cv2
picture_name = "a1"
picture_path = "E:/sample/a1.TIF"
picture_save_path = "E:/result/"
target_width = 512
target_high = 512
target_channel = 3
picture = cv2.imread(picture_path)
print(picture.shape)# (4024, 6048, 3) [H,W,C]
H = picture.shape[0]
W = picture.shape[1]
C = picture.shape[2]
H_number = int(H/target_high)
W_number = int(W/target_width)
C_number = C
print("H_number is:",H_number)
print("W_number is:",W_number)
for i in range(0, H_number):
for j in range(0, W_number):
mask = picture[i*target_width:(i+1)*target_width, j*target_high:(j+1)*target_high, :]
save_picture = picture_save_path + picture_name + "_{}_{}.jpg".format(i+1,j+1)
cv2.imwrite(save_picture,mask)
print("okk")
可分为7*11=77张小图
效果展示
图片位置
分割位置
二、批量分割图像
我拍了差不多一百来张照片,然后对这些样本进行批处理分割
首先我先对这些照片进行了重命名,可参考博文:对批量文件重命名
拿到这34个样本
然后开始对这些图像进行批处理分割
和上面的操作差不多,只不过多了个os读取批量获取文件名称和路径而已
picture_path
图像的路径
picture_save_path
批处理之后要保存的路径
for filename in os.listdir(picture_path):
通过os.listdir()
,获得每个照片的名称filename
picture_absolute_path = picture_path + filename
路径+名称,得到每张图片的绝对路径picture_absolute_path
picture_name,picture_suffix = os.path.splitext(picture_allname)
,将照片的名称picture_name
和后缀picture_suffix
分离
后续的操作就和处理单张图像一样了
完整代码
import cv2
import os
picture_path = r"E:/sample/"
picture_save_path = "E:/result/"
target_width = 512
target_high = 512
target_channel = 3
for filename in os.listdir(picture_path):
picture_absolute_path = picture_path + filename # E:/sample/14-04-2023-16-37-45.TIF
picture_allname = os.path.basename(picture_absolute_path) # 14-04-2023-16-37-45.TIF
picture_name,picture_suffix = os.path.splitext(picture_allname)
# picture_name 14-04-2023-16-37-45
# picture_suffix .TIF
#print(picture_name) # 14-04-2023-16-37-45
picture = cv2.imread(file_path)
#print(picture.shape)
H = picture.shape[0]
W = picture.shape[1]
C = picture.shape[2]
H_number = int(H/target_high)
W_number = int(W/target_width)
C_number = C
for i in range(0, H_number):
for j in range(0, W_number):
mask = picture[i*target_width:(i+1)*target_width, j*target_high:(j+1)*target_high, :]
save_picture = picture_save_path + picture_name + "_{}_{}.jpg".format(i+1,j+1)
cv2.imwrite(save_picture,mask)
print(filename + "is okk")
print("finished!!!")
效果展示
单张图片可分割成7 * 11 = 77
张
一共34张,故总共可以分为77 * 34 = 2618
张