OpenCV按指定大小分割图像并保存详细讲解

这几天在忙着整理自己的数据集,使用工业级相机拍了好多高清照片,但是模型训练的时候需要使用512*512像素点大小的图像,而且我的模型设计的时候就已经规定好了训练样本大小。
那就分割呗,把拍的照片按512*512分割一小块一小块的,然后打标签,喂模型进行训练。

一、单张图像按指定需求进行分割

思路:首先给定图片的位置picture_path,然后指定要保存的位置picture_save_pathpicture_name为了后续保存分割图像命名方便,就按原名称_数字进行命名,例如原名称a1.TIF,分割之后存放的名称为a1_1_1.jpga1_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
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/130176228
今日推荐