mieki256's diary



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
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()

以上です。

過去ログ表示

Prev - 2021/10 -
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project