尽可能不重叠的批量切割图像并保存【Python】

有时候,我们需要将一张大图分割成多个小图。网上提供了大量方法,但是这些方法大多只能让你保证小块之间不重叠,或者无法控制切割的最终数量。本文将介绍sklearn.feature_extraction.image库中的extract_patches_2d函数。该函数可以将一张图像分割成多个重叠或非重叠的小图,以便进一步处理或分析。当你指定需要切割的数量时,该程序将会尽可能不重叠的切割你的图像。如下图所示。 


 这个程序是怎么实现的呢?本文将会首先介绍这个函数的使用,其次我将会给出一个示例程序直接帮助你批量切割图片。

目录

 〇、准备工作,PIL库安装

一、函数介绍

二、批量转换图片


 〇、准备工作,PIL库安装

可以通过以下命令在Python中安装Pillow库(它是Python Imaging Library的分支版本):

pip install Pillow

同时,你可以使用pip命令来安装scikit-learn,即sklearn。在命令行中输入以下命令即可安装:

pip install -U scikit-learn

此外,还可以通过Anaconda或Miniconda等科学计算发行版进行安装。如果你使用Anaconda,可以使用以下命令来安装Pillow库:

conda install pillow

和 sklearn:

扫描二维码关注公众号,回复: 15611131 查看本文章
conda install scikit-learn

一、函数介绍

要使用extract_patches_2d函数,你需要指定输入图像、小块(patch)大小和最大小块数量。小块大小是指要提取的每个小图的大小,通常以像素为单位表示。最大小块数量是指要从图像中提取的最大小块数量。如果不指定最大小块数量,则该函数将提取尽可能多的不重叠小块。

例如,假设你有一张500x500像素的图像,并且希望将其分割成大小为32x32像素的重叠patch,可以按如下方式使用extract_patches_2d函数:

# 读取图像文件并将其转换为NumPy数组
image = plt.imread('image.jpg')

# 定义patch大小
patch_size = (32, 32)

# 定义要提取的最大patch数量
max_patches = None

# 从图像中提取patch
patches = extract_patches_2d(image, patch_size, max_patches=max_patches)

在上面的代码中,我们首先使用plt.imread()函数将图像文件加载为NumPy数组。然后,我们定义了patch大小为32x32像素,并将最大patch数量设置为None以提取尽可能多的不重叠patch。最后,我们使用extract_patches_2d函数从图像中提取patch,并将结果保存在patches变量中。

二、批量转换图片

在这个case里,我将介绍如何批量切割一个文件夹里的大量图片。

import os
from PIL import Image
from sklearn.feature_extraction.image import extract_patches_2d
from numpy to np
# 定义输入和输出文件夹路径
input_dir = '/path/to/input/folder/'
output_dir = '/path/to/output/folder/'

# 定义patch大小
patch_size = (32, 32)

# 定义要提取的最大patch数量
max_patches = None

# 遍历输入文件夹中的所有图像文件
for filename in os.listdir(input_dir):
    if filename.endswith('.jpg') or filename.endswith('.png'):
        # 加载图像作为NumPy数组
        image = np.array(Image.open(os.path.join(input_dir, filename)))

        # 从图像中提取patch
        patches = extract_patches_2d(image, patch_size, max_patches=max_patches)

        # 将patch保存为图像文件
        for i, patch in enumerate(patches):
            # 将patch转换为PIL图像对象
            patch_image = Image.fromarray(patch)

            # 创建输出文件夹(如果不存在)
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)

            # 保存patch图像文件
            patch_filename = os.path.splitext(filename)[0] + '_patch{}.jpg'.format(i)
            patch_image.save(os.path.join(output_dir, patch_filename))

在此示例中,我们首先定义了输入和输出文件夹的路径,以及要提取的patch大小和最大patch数量。然后,我们使用os库遍历输入文件夹中的所有图像文件,并使用PIL库将它们加载为NumPy数组。接下来,我们使用extract_patches_2d函数从图像中提取patches,并使用PIL库将每个patch保存为单独的图像文件。最后,我们将输出文件保存到输出文件夹中。

值得注意的是,我这里假设输入文件夹中只包含图像文件,并且所有图像文件都具有.jpg.png文件扩展名。如果你的文件夹中包含其他类型的文件或文件扩展名,请相应地更改代码。此外,此示例代码将输出文件保存为JPEG格式。如果你需要使用其他格式,请相应地更改patch_image.save()调用中的文件扩展名。

创作不易,如果帮到你可不可以点赞关注,谢谢啦~

猜你喜欢

转载自blog.csdn.net/weixin_49030835/article/details/129545045
今日推荐