画像を 32x32 のグリッド上に分割して保存するコードを PIL と numpy を使用して書きました。
こんな感じでいいでしょうか。
サンプルコード
python
1 import glob
2 import os
3
4 import matplotlib . pyplot as plt
5 import numpy as np
6 from PIL import Image
7
8 def split_img ( img , draw_result = False ) :
9 h , w , c = img . shape
10 v_split = h // 32 # 垂直方向の分割数
11 h_split = w // 32 # 水平方向の分割数
12 print ( 'partitions: (horizonal {}, vertical {})' . format ( h_split , v_split ) )
13
14 # 均等に分割できないと np.spllt() が使えないので、
15 # 除算したときに余りがでないように画像の端数を切り捨てる。
16 _img = img [ : h // v_split * v_split , : w // h_split * h_split ]
17 print ( '{} -> {}' . format ( img . shape , _img . shape ) ) # (167, 292, 3) -> (164, 161, 3)
18
19 # 分割する。
20 out_imgs = [ ]
21 for h_img in np . vsplit ( _img , v_split ) : # 垂直方向に分割する。
22 for v_img in np . hsplit ( h_img , h_split ) : # 水平方向に分割する。
23 out_imgs . append ( v_img )
24
25 # 描画する。
26 if draw_result :
27 fig , axes_list = plt . subplots ( v_split , h_split , figsize = ( 10 , 10 ) )
28 axes_list = axes_list . ravel ( )
29 for i , ( sub , axes ) in enumerate ( zip ( out_imgs , axes_list ) ) :
30 axes . imshow ( sub )
31 axes . set_axis_off ( )
32 plt . show ( )
33
34 return out_imgs
35
36 img_paths = 'test/*.png' # 分割する画像があるディレクトリ
37 for img_path in glob . glob ( img_paths ) :
38 img = np . array ( Image . open ( img_path ) )
39 out_imgs = split_img ( img ) # 画像を分割する。
40
41 img_dirpath , basename = os . path . split ( img_path )
42 name , ext = os . path . splitext ( basename )
43
44 # 画像を出力するディレクトリを作成する。
45 out_dirpath = os . path . join ( img_dirpath , name )
46 os . makedirs ( out_dirpath , exist_ok = True )
47 print ( 'save divided images to `{}`' . format ( out_dirpath ) )
48
49 for i , out_img in enumerate ( out_imgs ) :
50 basename = '{}_{}.{}' . format ( name , i , ext )
51 out_path = os . path . join ( out_dirpath , basename )
52
53 # 画像を保存する。
54 Image . fromarray ( out_img ) . save ( out_path )
結果