Python で画像を操作します。Python で画像を操作する代表的なパッケージと言えば Pillow でしょう。別のパッケージとしては、OpenCV パッケージがありますが、私は使ったことがないです。ということで、今回は Pillow を使った画像操作の実装について説明したいと思います。
Contents
バージョン
- Python 3.5.4
- Pillow 6.0.0
環境構築
実装を始める前に、まずは環境を構築していきます。
venv 仮想環境の作成
python -m venv venv source venv/bin/activate
Python venv を使って、仮想環境を作ります。仮想環境の作成は、必須ではないですが、OSを汚したくないのであれば、やった方がいいでしょう。
Pillow インストール
pip install Pillow
仮想環境を作成し、アクティベートしたら、そこに Pillow をインストールします。
Python で画像を操作する
それでは、画像の操作について実装を始めていきたいと思います。
これから実装を始めていきますが、プログラムの中では、上の犬の画像 dog.jpg を元に画像を操作していきます。手元の環境で実行したい人は、ダウンロードしてください。
画像を切り抜く(トリミング)
from PIL import Image dog_im = Image.open('dog.jpg') cropped = dog_im.crop((190, 107, 407, 249)) cropped.save('cropped.jpg')
画像を切り抜くプログラムです。open 関数でファイルを読み込み、crop 関数で切り抜きます。crop 関数の引数はドキュメントでは以下のような説明になっています。切り抜きスタートのx座標とy座標(左上)、切り抜きエンドのx座標とy座標(右下)をタプルで渡します。ちょっと言葉での説明が難しいですね・・・
The crop rectangle, as a (left, upper, right, lower)-tuple.
プログラムを実行すると、以下のようになります。
画像をコピー&ペースト
from PIL import Image dog_im = Image.open('dog.jpg') cropped = dog_im.crop((190, 107, 407, 249)) copied = dog_im.copy() copied.paste(cropped, (0, 0)) copied.save('pasted.jpg')
画像のコピペするプログラムです。ペーストする画像は、先ほど切り取った画像です。paste 関数の第二引数は、ペースト開始位置をx、y座標で指定する感じです。
プログラムを実行すると、以下のようになります。
画像のサイズを変更(リサイズ)する
from PIL import Image dog_im = Image.open('dog.jpg') width, height = dog_im.size resize_im = dog_im.resize((int(width / 2), int(height / 2))) resize_im.save('resize.jpg') thumb_im = dog_im.copy() thumb_im.thumbnail((100, 100)) thumb_im.save('thumbnail.jpg')
画像のサイズを変更するプログラムです。サイズ変更は、リサイズ関数 resize 関数とサムネイル関数 thumbnail 関数の2つの関数があります。
resize 関数は、その名と通り、指定するサイズに変更しますが、thumbnail 関数は、縦横比を維持しながらのサイズ変更になります。
また、戻り値で画像を返すか、オブジェクト画像を直接変更するかの違いもあります。
プログラムを実行すると、以下のようになります。
画像を回転する
from PIL import Image dog_im = Image.open('dog.jpg') dog_im.rotate(90).save('rotated90.jpg') dog_im.rotate(180).save('rotated180.jpg') dog_im.rotate(270).save('rotated270.jpg')
画像を回転するプログラムです。rotate 関数に回転させたい角度を引数で渡すだけです。
プログラムを実行すると、以下のようになります。
まとめ
Python で画像を操作しました。もっとも利用頻度が高そうな、操作を説明しましたが、Pillow はまだまだ沢山の機能があります。一度ドキュメントに目を通すといいかもしれません。