2021/10/13(水) [n年前の日記]
#2 [python] Python + PIL で画像を分割したり比較したりしてみたり
Python + PIL (Pillow) を使って、画像を分割したり、分割した画像群を比較してユニークな画像を抜き出したりする処理を試してみた。環境は、Windows10 x64 21H1 + Python 3.9.7 64bit + Pillow 8.3.2。
画像を分割する処理は、以下のページが参考になった。ありがたや。
_[Python3.6]画像を任意の枚数に分割する - Qiita
.crop(x, y, x + w, y + h) を使えばいいらしい。
画像群の比較は、NumPy とやらを使うと楽にできそうと知った。
_Python, NumPyで画像処理(読み込み、演算、保存) | note.nkmk.me
_numpy - 配列同士を比較する関数について - pystyle
im = numpy.array(Image.open('hoge.png')) で、ndarray なる配列(?)が得られるらしい。また、pil_img = Image.fromarray(im) で、PIL の画像形式に変換できて、pil_img.save("fuga.png") で保存できる模様。
ndarray 同士の比較は、numpy.array_equal(a1, a2) が使えそうだなと…。これで、寸分たがわず同じ画像かどうかを判定することができるので、リストに登録した画像群と比較して、同じ画像だったら除去、同じ画像ではなければリストに追加、という処理をして、ユニークな画像群だけを得ることができた。
できたスクリプトは以下のような感じ。大きいサイズ(今回は1024x768ドット)の画像群を読み込んで、64x64ドット単位で分割して、ユニークな画像だけを抜き出して、64x64ドットの画像群として保存する、という処理をしている。
_10_split_pattern.py
画像を分割する処理は、以下のページが参考になった。ありがたや。
_[Python3.6]画像を任意の枚数に分割する - Qiita
.crop(x, y, x + w, y + h) を使えばいいらしい。
画像群の比較は、NumPy とやらを使うと楽にできそうと知った。
_Python, NumPyで画像処理(読み込み、演算、保存) | note.nkmk.me
_numpy - 配列同士を比較する関数について - pystyle
im = numpy.array(Image.open('hoge.png')) で、ndarray なる配列(?)が得られるらしい。また、pil_img = Image.fromarray(im) で、PIL の画像形式に変換できて、pil_img.save("fuga.png") で保存できる模様。
ndarray 同士の比較は、numpy.array_equal(a1, a2) が使えそうだなと…。これで、寸分たがわず同じ画像かどうかを判定することができるので、リストに登録した画像群と比較して、同じ画像だったら除去、同じ画像ではなければリストに追加、という処理をして、ユニークな画像群だけを得ることができた。
できたスクリプトは以下のような感じ。大きいサイズ(今回は1024x768ドット)の画像群を読み込んで、64x64ドット単位で分割して、ユニークな画像だけを抜き出して、64x64ドットの画像群として保存する、という処理をしている。
_10_split_pattern.py
import glob from PIL import Image, ImageFilter import numpy infiles = "../output_images/*.png" bw, bh = 64, 64 def main(): l = glob.glob(infiles) imgs = [] for s in l: im = Image.open(s) iw, ih = im.size print("%s, w x h = %d x %d" % (s, iw, ih)) for y in range(0, ih, bh): for x in range(0, iw, bw): c = im.crop((x, y, x + bw, y + bh)) n = numpy.array(c) imgs.append(n) nimgs = [] for n in imgs: for o in nimgs: if numpy.array_equal(n, o): break else: nimgs.append(n) cnt = 0 for n in nimgs: fn = "pat_%06d.png" % cnt im = Image.fromarray(n) im.save(fn) cnt += 1 if __name__ == '__main__': main()
[ ツッコむ ]
以上です。