赞
踩
有时候,我们需要将一张大图分割成多个小图。网上提供了大量方法,但是这些方法大多只能让你保证小块之间不重叠,或者无法控制切割的最终数量。本文将介绍sklearn.feature_extraction.image
库中的extract_patches_2d
函数。该函数可以将一张图像分割成多个重叠或非重叠的小图,以便进一步处理或分析。当你指定需要切割的数量时,该程序将会尽可能不重叠的切割你的图像。如下图所示。
这个程序是怎么实现的呢?本文将会首先介绍这个函数的使用,其次我将会给出一个示例程序直接帮助你批量切割图片。
目录
可以通过以下命令在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:
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()
调用中的文件扩展名。
创作不易,如果帮到你可不可以点赞关注,谢谢啦~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。