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用ラッパーライブラリpyvipsをpipでインストール.
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
使い方
例えば次のような余白のある画像があるとする.
次のコマンドを走らせるときれいに余白を切り取れる.
python3 crop.py graph.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
Hideyuki Tabata
200
200
72
72