画像の余白をトリミングするPythonスクリプト

Pythonを使って画像の余白を切り取ってしまおう,というお話. 例えばスキャンした画像やスクリーンショットした画像,専門的なアプリケーションから出力された画像など,縁に余白が出来たJPEGなりPNG画像が大量にあるとしよう. 2,3枚ならば手動でCropping(切り抜き)しても良いが,数十枚もあるとそれは厄介だ. 例の本ではないが,"退屈なことはPythonにやらせよう"!

わたしの環境 (Pythonライブラリ含む)

  • macOS Catalina 10.15.1
  • Homebrew 2.2.0
  • Python 3.7.4
  • pip 19.3.1
  • libvips 8.8.3
  • pyvips 2.1.8

Python3が入っていない場合はHomebrewを使ってインストール.

brew install python3

次に画像処理ライブラリlibvipsをインストール.

brew install vips

libvipsのPython用ラッパーライブラリpyvipspipでインストール.

pip3 install pyvips

これで環境は整った!

使ったPythonスクリプト

TSS/PythonCropper at master · seeker5084/TSS

crop.py

import sys
import pyvips
from os import path
from glob import glob

threshold = 10
croppedName = " (cropped)"

for filename in sys.argv[1:]:

    print(filename)

    im = pyvips.Image.new_from_file(filename)

    background = im(0, 0)
    mask = (im.median(3) - background).abs() > threshold
    columns, rows = mask.project()

    left = columns.profile()[1].min()
    right = columns.width - columns.fliphor().profile()[1].min()
    top = rows.profile()[0].min()
    bottom = rows.height - rows.flipver().profile()[0].min()

    im = im.crop(left, top, right - left, bottom - top)

    filename = path.splitext(filename)[0] + croppedName + path.splitext(filename)[1]
    im.write_to_file(filename)

画像の最左上ピクセルの色を読み取って,それを背景色と認識. 上下左右から背景色だけの行/列を見つけて行き,背景色以外の色にぶつかった位置を記憶. その位置で画像をCrop(切り抜き)して出力している.

threshold変数の値を変えることで背景色以外の色と認識するしきい値を調整可能. またcroppedName変数を空文字""にすることで切り抜いた画像で元画像を上書き保存する. 文字を入れれば元のファイル名と拡張子の間にその文字が入ったファイル名として出力される.

スクリプトのフォーク元はこちら: http://libvips.blogspot.com/2014/02/trim-auto-crop-with-ruby-vips.html

使い方

例えば次のような余白のある画像があるとする.

白い余白が四隅にある画像graph.jpg

次のコマンドを走らせるときれいに余白を切り取れる.

python3 crop.py graph.jpg

こんなかんじに!

真っ白の余白が無くなってスッキリしたgraph (cropped).jpg

なお,このスクリプトはワイルドカードも受け付けるので,大量のバッチ処理にも大変重宝!

python3 crop.py *.png
627096498189073597 https://www.storange.jp/2019/11/python.html https://www.storange.jp/2019/11/python.html 画像の余白をトリミングするPythonスクリプト 2019-11-30T20:28:00+09:00 https://www.storange.jp/2019/11/python.html Hideyuki Tabata 200 200 72 72