| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Python Imaging Library

提供: MyMemoWiki
2020年2月15日 (土) 08:05時点におけるPiroto (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

目次

Python Imaging Library

Python

Pillow Python Imaging Library (Fork)

概要

  • Python Imaging Library は、イメージ処理機能をPythonに追加する。
  • 様々なファイルフォーマットのサポート、高効率な内部描画、強力なイメージ処理機能を提供
  • コア・イメージライブラリは基本的ないくつかのピクセルフォーマットで保存されたデータに高速にアクセスできるようにデザインされている
  • 一般的なイメージ処理ツールとして安定した土台を提供する。

イメージアーカイブ

  • Python Imaging Library はイメージをアーカイブするバッチ処理アプリケーションに理想的である
  • サムネイルを作成する、ファイルフォーマットを変換する、イメージをプリントするなど。

イメージ表示

  • 現在のリリースは、Windows DIBインターフェースと同様の、Tk PhotoImage、 BitmapImage インターフェースを含む
  • それは、PythonWin および 他のWindowsベースのツールキットとともに利用できる。
  • デバッグ用途にて、イメージをディスクに書き込み、外部の表示ユーティリティを呼び出すメソッドも備える

イメージ処理

[Python Imaging Library Modules] [モジュール群]

チュートリアル

Imageクラス

  • 最も重要なクラス
  • モジュールと同じ名前で定義されている
  • いくつかの方法でインスタンスを生成できる
    • ファイルからイメージをロード
    • 1からファイルを生成する
ファイルからイメージをロードするにはImageモジュールのopen関数を利用する
  • 成功するとImageオブジェクトを返す
>>> import Image
>>> im = Image.open(r'c:\work\py\pil01.jpg')
>>> print im.format, im.size, im.mode
JPEG (682, 453) RGB
  • 属性の内容
属性 内容
format イメージのソースを特定する。ファイルから読めなかった場合は、Noneがセットされる。
size 幅と高さ(ピクセル)を持つタプル
mode http://typea-mixi01.appspot.com/yh_s?q=%E3%83%90%E3%83%B3%E3%83%89%E7%95%AA%E5%8F%B7]と名前、ピクセルのタイプおよび深さを定義。"L" (luminance) グレースケール、"RGB" トゥルーカラー、"CMYK" [CMYKカラーモデル]
一旦 Imageクラス を作成するとイメージの処理や操作ができる
  • イメージを表示する例
>>> im.show()

イメージの読み書き

イメージを読み込む
  • ライブラリは多数のフォーマットをサポートしている
  • ファイルフォーマットについて知らなくてもよい。
  • ライブラリが自動的にファイル内容に基づいて決定する。
イメージの書き込み
  • Imageクラスのsaveメソッドでファイルを保存する。
  • ファイルを保存するときに、ファイル名は重要
  • ファイル名の拡張子に基づいた変換をライブラリは行う。
>>> import Image
>>> im = Image.open(r'c:\work\py\pil01.jpg')
>>> im.save(r'c:\work\py\pil01.bmp')

<blockquote>標準の拡張子を使わない場合など、saveメソッドの2つ目の引数にフォーマットを指定することもできる</blockquote>

>>> im.save(r'c:\work\py\pil01.xxx','gif')

サムネイルを作成する

>>> import Image
>>> size = (100, 100)
>>> im = Image.open(r'c:\work\py\pil01.jpg')
>>> im.thumbnail(size)
>>> im.save(r'c:\work\py\pil01_thum.jpg')

イメージファイルの識別

  • ライブラリは、ラスタデータのデコードやロードを本当に必要な場合以外行わない。
  • ファイルを開いたとき、ファイルヘッダーはファイルフォーマット、モード、サイズなど、ファイルをデコードするためのプロパティを決定するために読み込まれるが、ファイルの残りの部分は後まで処理されない。
  • これは、ファイルサイズや圧縮方法によらず、イメージファイルをすばやく処理できることを意味する。
>>> import Image
>>> im = Image.open(r'c:\work\py\pil01.jpg')
>>> print im.format, im.size, im.mode
JPEG (682, 453) RGB

切り取り、貼り付け、マージ

  • Imageクラスはイメージの領域を操作するメソッドを含んでいる
  • cropメソッドで、矩形を抽出できる
  • 左上隅を (0,0) としたタプルで(left, upper, right, lower)を指定して矩形を選択する
矩形を切り取り
>>> import os
>>> import Image
>>> os.chdir(r'c:\work\py')
>>> im = Image.open(r'.\pil01.jpg')
>>> box = (100,100,400,400)
>>> region = im.crop(box)
>>> region.save(r'.\region01.jpg')
矩形を貼り付けなおす
  • 矩形を貼り付け戻すとき、矩形のサイズが一致する必要があります。
  • また、矩形はイメージの範囲外に拡張されません
  • しかしながら、イメージのモードは一致する必要はありません。
  • 貼り付け前に自動的に変換されます
>>> region = region.transpose(Image.ROTATE_180)
>>> im.paste(region, box)
>>> im.save(r'.\pil01.jpg')
カラーバンドの分割とマージ
  • RGBイメージのような、マルチバンドイメージのカラーバンドを独立して扱うことができる。
  • split メソッドは、元の複数のカラーバンドからひとつの色を抜き出した新しいイメージのセットを作成する。
  • merge 関数は、モードとイメージのタプルからそれらを混ぜ合わせ新しいイメージを作成する。
>>> import Image
>>> im = Image.open(r'c:\work\img\test01.jpg')
>>> r, g, b = im.split()
>>> im = Image.merge("RGB", (b, g, r))
>>> im.save(r'c:\work\img\test02.jpg')
  • test01.jpg

1044 test01.jpg

  • test02.jpg

1045 test02.jpg

幾何学的な変形

  • Imageクラスは、resize および rotate メソッドを持つ
>>> im = Image.open(r'c:\work\img\test01.jpg')
>>> out = im.resize((50,50))
>>> out = out.rotate(45)
>>> out.save(r'c:\work\img\test03.jpg')
  • test03.jpg

1046 test03.jpg

  • transpose メソッドを使うと、rotateと同様に回転することや、垂直や水平に反転できる。
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
>>> im = Image.open(r'c:\work\img\test01.jpg')
>>> im = im.transpose(Image.FLIP_LEFT_RIGHT)
>>> im.save(r'c:\work\img\test06.jpg')
  • test06.jpg

1047 test06.jpg

色の変換

  • convert 関数で異なるピクセル表現にイメージを変換できる
  • カラーモードを変換する
>>> import Image
>>> im = Image.open(r'c:\work\img\test01.jpg').convert('CMYK')
>>> im.save(r'c:\work\img\test07.jpg')

1048 test07.jpg

イメージ拡張機能

  • 多くのメソッドやモジュールが拡張機能として提供されている
フィルタの適用
  • ImageFilterモジュールは、多くの事前定義されたフィルターを提供
    • BLUR
    • CONTOUR
    • DETAIL
    • EDGE_ENHANCE
    • EDGE_ENHANCE_MORE
    • EMBOSS
    • FIND_EDGES
    • SHARPEN
    • SMOOTH
    • SMOOTH_MORE
>>> import ImageFilter
>>> im = Image.open(r'c:\work\img\test01.jpg')
>>> out = im.filter(ImageFilter.EMBOSS)
>>> out.save(r'c:\work\img\test08.jpg')
  • test08.jpg

1049 test08.jpg

ポイント操作

  • pointメソッドは、イメージのピクセル値変換に利用できる(たとえばコントラスト操作)
  • 多くの場合、関数オブジェクトを引数としてこのメソッドに渡されることを期待する。
  • すべてのピクセルはこの関数にしたがって処理される。
コントラスト変換
>>> im = Image.open(r'c:\work\img\test01.jpg')
>>> out = im.point(lambda i: i / 3.0)
>>> out.save(r'c:\work\img\test09.jpg')
  • test09.jpg

1050 test09.jpg

カラーバンドを独立して操作
>>> im = Image.open(r'c:\work\img\test01.jpg')
>>> source = im.split()
>>> r, g , b = 0, 1, 2
>>> mask = source[r].point(lambda i: i < 100 and 255)
>>> out = source[g].point(lambda i: i * 0.7)
>>> source[g].past(out, None, mask)
>>> source[g].paste(out, None, mask)
>>> im = Image.merge(im.mode, source)
>>> im.save(r'c:\work\img\test10.jpg')
  • test10.jpg

1051 test10.jpg

マスクを生成する書式
  • Pythonは論理演算に必要な部分しか評価しない。そして最後に検査した値を返す。
  • なので、以下の 式(expression)が 偽なら false(0) を返し、真なら最後に評価した 255を返す。
imout = im.point(lambda i: expression and 255)

強化機能(ImageEnhance モジュール)

  • イメージの強化機能クラスを、ImageEnhance モジュールで利用可能。
  • いったんイメージから enhancement オブジェクトを作成したら、すばやく異なる設定を試すことができる。コントラスト調整、輝度、カラーバランス、シャープネスなど。
>>> import Image, ImageEnhance
>>> im = Image.open(r'c:\work\img\test01.jpg')
>>> enh = ImageEnhance.Contrast(im)
>>> out = enh.enhance(2.0)
>>> out.save(r'c:\work\img\test11.jpg')
  • test11.jpg

1052 test11.jpg

イメージシーケンス(アニメーションフォーマット)

  • PILはいくつかの基本的なイメージシーケンス(アニメーションフォーマットとも呼ばれる)を含んでいる。
  • サポートしているのは、FLI/FLC、GIF、あといくつか実験的なフォーマット。
  • TIFFファイルは1つ以上のフレームを含むことができる。
  • このようなファイルを開くと、PILは自動的に最初のフレームをロードする。
  • seek および tell メソッドによりフレーム間を移動することができる。
アニメーションGIFをフレームに分解
>>> import Image
>>> im = Image.open(r'c:\work\img\anime.gif')
>>> try:
...     while True:
...             im.save(r'c:\work\img\anime' + str(im.tell()) + '.gif')
...             im.seek(im.tell()+1)
... except EOFError:
...     pass
...
分解前
  • anime.gif

1040 anime.gif

分解後 1フレーム目
  • anime0.gif

1041 anime0.gif

分解後 4フレーム目
  • anime3.gif

1042 anime3.gif

分解後 8フレーム目
  • anime7.gif

1043 anime7.gif

Postscript 表示

  • PILは、テキストやグラフィックをPostscript プリンタへ印刷する関数を持つ。

イメージを読むその他の方法

  • 上記までは、単純にファイル名のみを引数に Image モジュールの open 関数を利用していた。
  • 成功すれば、Image オブジェクトが生成され、失敗すれば IOError が発生。
バイナリモードで開いたファイルからImageを作成
>>> import Image
>>> fp = open(r'c:\work\img\test01.jpg', 'rb')
>>> im = Image.open(fp)
>>> im.show()
文字列IOからImageを作成
>>> import Image, StringIO
>>> fp = open(r'c:\work\img\test01.jpg', 'rb')
>>> buf = fp.read()
>>> im = Image.open(StringIO.StringIO(buf))
>>> im.show()