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

MyMemoWiki

「Python Imaging Library」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==Python Imaging Library== [Python] *http://www.pythonware.com/library/pil/handbook/overview.htm =====Pillow Python Imaging Library (Fork)===== *Pillow *https://pypi…」)
 
 
(同じ利用者による、間の2版が非表示)
1行目: 1行目:
==Python Imaging Library==
+
==[[Python Imaging Library]]==
[Python]
+
[[Python]] |
*http://www.pythonware.com/library/pil/handbook/overview.htm
+
*http://www.pythonware.com/library/pil/handbook/over[[vi]]ew.htm
=====Pillow Python Imaging Library (Fork)=====
+
=====Pillow [[Python Imaging Library]] (Fork)=====
*Pillow
+
*[[Pillow]]
*https://pypi.python.org/pypi/Pillow/2.2.1
+
*https://pypi.python.org/pypi/[[Pillow]]/2.2.1
 
*http://pillow.readthedocs.org/
 
*http://pillow.readthedocs.org/
 
===概要===
 
===概要===
*Python Imaging Library は、イメージ処理機能をPythonに追加する。
+
*[[Python Imaging Library]] は、イメージ処理機能をPythonに追加する。
 
*様々なファイルフォーマットのサポート、高効率な内部描画、強力なイメージ処理機能を提供
 
*様々なファイルフォーマットのサポート、高効率な内部描画、強力なイメージ処理機能を提供
*コア・イメージライブラリは基本的ないくつかのピクセルフォーマットで保存されたデータに高速にアクセスできるようにデザインされている
+
*コア・イメージライブラリは基本的ないくつかのピクセルフォーマットで保存されたデータに高速にアクセスできるように[[デザイン]]されている
 
*一般的なイメージ処理ツールとして安定した土台を提供する。
 
*一般的なイメージ処理ツールとして安定した土台を提供する。
  
 
====イメージアーカイブ====
 
====イメージアーカイブ====
*Python Imaging Library はイメージをアーカイブするバッチ処理アプリケーションに理想的である
+
*[[Python Imaging Library]] はイメージをアーカイブするバッチ処理アプリケーションに理想的である
 
*サムネイルを作成する、ファイルフォーマットを変換する、イメージをプリントするなど。
 
*サムネイルを作成する、ファイルフォーマットを変換する、イメージをプリントするなど。
 
====イメージ表示====
 
====イメージ表示====
*現在のリリースは、Windows DIBインターフェースと同様の、Tk PhotoImage、 BitmapImage インターフェースを含む
+
*現在のリリースは、[[Windows]] DIBインターフェースと同様の、Tk PhotoImage、 BitmapImage インターフェースを含む
*それは、PythonWin および 他のWindowsベースのツールキットとともに利用できる。
+
*それは、PythonWin および 他の[[Windows]]ベースのツールキットとともに利用できる。
 
*デバッグ用途にて、イメージをディスクに書き込み、外部の表示ユーティリティを呼び出すメソッドも備える
 
*デバッグ用途にて、イメージをディスクに書き込み、外部の表示ユーティリティを呼び出すメソッドも備える
 
====イメージ処理====
 
====イメージ処理====
24行目: 24行目:
 
*ヒストグラムメソッドは統計からイメージを作成する。これは、[http://typea-mixi01.appspot.com/yh_s?q=%E8%87%AA%E5%8B%95%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%B9%E3%83%88%E8%AA%BF%E6%95%B4 自動コントラスト調整]の強化に使える
 
*ヒストグラムメソッドは統計からイメージを作成する。これは、[http://typea-mixi01.appspot.com/yh_s?q=%E8%87%AA%E5%8B%95%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%B9%E3%83%88%E8%AA%BF%E6%95%B4 自動コントラスト調整]の強化に使える
  
===[Python Imaging Library Modules] [モジュール群]===
+
===[[Python Imaging Library Modules|モジュール群]]===
 
*http://www.pythonware.com/library/pil/handbook/index.htm
 
*http://www.pythonware.com/library/pil/handbook/index.htm
*Python Imaging Library Modules
+
*[[Python Imaging Library Modules]]
 
===チュートリアル===
 
===チュートリアル===
 
*http://www.pythonware.com/library/pil/handbook/introduction.htm
 
*http://www.pythonware.com/library/pil/handbook/introduction.htm
40行目: 40行目:
 
*成功するとImageオブジェクトを返す
 
*成功するとImageオブジェクトを返す
  
  >>> import Image
+
  >>> import Image
  >>> im = Image.open(r'c:\work\py\pil01.jpg')
+
  >>> im = Image.open(r'c:\work\py\pil01.jpg')
  >>> print im.format, im.size, im.mode
+
  >>> print im.format, im.size, im.mode
  JPEG (682, 453) RGB
+
  JPEG (682, 453) [[R]]GB
  
 
*属性の内容
 
*属性の内容
62行目: 62行目:
 
=====一旦 Imageクラス を作成するとイメージの処理や操作ができる=====
 
=====一旦 Imageクラス を作成するとイメージの処理や操作ができる=====
 
*イメージを表示する例
 
*イメージを表示する例
  >>> im.show()
+
  >>> im.show()
  
 
====イメージの読み書き====
 
====イメージの読み書き====
75行目: 75行目:
 
*ファイル名の拡張子に基づいた変換をライブラリは行う。
 
*ファイル名の拡張子に基づいた変換をライブラリは行う。
  
  >>> import Image
+
  >>> import Image
  >>> im = Image.open(r'c:\work\py\pil01.jpg')
+
  >>> im = Image.open(r'c:\work\py\pil01.jpg')
  >>> im.save(r'c:\work\py\pil01.bmp')
+
  >>> im.save(r'c:\work\py\pil01.bmp')
  
<blockquote>標準の拡張子を使わない場合など、saveメソッドの2つ目の引数にフォーマットを指定することもできる</blockquote>
+
&lt;blockquote&gt;標準の拡張子を使わない場合など、saveメソッドの2つ目の引数にフォーマットを指定することもできる&lt;/blockquote&gt;
  >>> im.save(r'c:\work\py\pil01.xxx','gif')
+
  &gt;&gt;&gt; im.save(r'c:\work\py\pil01.xxx','gif')
  
 
====サムネイルを作成する====
 
====サムネイルを作成する====
  >>> import Image
+
  &gt;&gt;&gt; import Image
  >>> size = (100, 100)
+
  &gt;&gt;&gt; size = (100, 100)
  >>> im = Image.open(r'c:\work\py\pil01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\py\pil01.jpg')
  >>> im.thumbnail(size)
+
  &gt;&gt;&gt; im.thumbnail(size)
  >>> im.save(r'c:\work\py\pil01_thum.jpg')
+
  &gt;&gt;&gt; im.save(r'c:\work\py\pil01_thum.jpg')
  
 
====イメージファイルの識別====
 
====イメージファイルの識別====
93行目: 93行目:
 
*ファイルを開いたとき、ファイルヘッダーはファイルフォーマット、モード、サイズなど、ファイルをデコードするためのプロパティを決定するために読み込まれるが、ファイルの残りの部分は後まで処理されない。
 
*ファイルを開いたとき、ファイルヘッダーはファイルフォーマット、モード、サイズなど、ファイルをデコードするためのプロパティを決定するために読み込まれるが、ファイルの残りの部分は後まで処理されない。
 
*これは、ファイルサイズや圧縮方法によらず、イメージファイルをすばやく処理できることを意味する。
 
*これは、ファイルサイズや圧縮方法によらず、イメージファイルをすばやく処理できることを意味する。
  >>> import Image
+
  &gt;&gt;&gt; import Image
  >>> im = Image.open(r'c:\work\py\pil01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\py\pil01.jpg')
  >>> print im.format, im.size, im.mode
+
  &gt;&gt;&gt; print im.format, im.size, im.mode
  JPEG (682, 453) RGB
+
  JPEG (682, 453) [[R]]GB
  
 
====切り取り、貼り付け、マージ====
 
====切り取り、貼り付け、マージ====
104行目: 104行目:
  
 
=====矩形を切り取り=====
 
=====矩形を切り取り=====
  >>> import os
+
  &gt;&gt;&gt; import os
  >>> import Image
+
  &gt;&gt;&gt; import Image
  >>> os.chdir(r'c:\work\py')
+
  &gt;&gt;&gt; os.chdir(r'c:\work\py')
  >>> im = Image.open(r'.\pil01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'.\pil01.jpg')
  >>> box = (100,100,400,400)
+
  &gt;&gt;&gt; box = (100,100,400,400)
  >>> region = im.crop(box)
+
  &gt;&gt;&gt; region = im.crop(box)
  >>> region.save(r'.\region01.jpg')
+
  &gt;&gt;&gt; region.save(r'.\region01.jpg')
  
 
=====矩形を貼り付けなおす=====
 
=====矩形を貼り付けなおす=====
117行目: 117行目:
 
*しかしながら、イメージのモードは一致する必要はありません。
 
*しかしながら、イメージのモードは一致する必要はありません。
 
*貼り付け前に自動的に変換されます
 
*貼り付け前に自動的に変換されます
  >>> region = region.transpose(Image.ROTATE_180)
+
  &gt;&gt;&gt; region = region.transpose(Image.[[R]]OTATE_180)
  >>> im.paste(region, box)
+
  &gt;&gt;&gt; im.paste(region, box)
  >>> im.save(r'.\pil01.jpg')
+
  &gt;&gt;&gt; im.save(r'.\pil01.jpg')
  
 
=====カラーバンドの分割とマージ=====
 
=====カラーバンドの分割とマージ=====
*RGBイメージのような、マルチバンドイメージのカラーバンドを独立して扱うことができる。
+
*[[R]]GBイメージのような、マルチバンドイメージのカラーバンドを独立して扱うことができる。
 
*split メソッドは、元の複数のカラーバンドからひとつの色を抜き出した新しいイメージのセットを作成する。
 
*split メソッドは、元の複数のカラーバンドからひとつの色を抜き出した新しいイメージのセットを作成する。
 
*merge 関数は、モードとイメージのタプルからそれらを混ぜ合わせ新しいイメージを作成する。
 
*merge 関数は、モードとイメージのタプルからそれらを混ぜ合わせ新しいイメージを作成する。
  
  >>> import Image
+
  &gt;&gt;&gt; import Image
  >>> im = Image.open(r'c:\work\img\test01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg')
  >>> r, g, b = im.split()
+
  &gt;&gt;&gt; r, g, b = im.split()
  >>> im = Image.merge("RGB", (b, g, r))
+
  &gt;&gt;&gt; im = Image.merge("[[R]]GB", (b, g, r))
  >>> im.save(r'c:\work\img\test02.jpg')
+
  &gt;&gt;&gt; im.save(r'c:\work\img\test02.jpg')
 
*test01.jpg
 
*test01.jpg
 
[[File:1044_test01.jpg]]
 
[[File:1044_test01.jpg]]
138行目: 138行目:
 
====幾何学的な変形====
 
====幾何学的な変形====
 
*Imageクラスは、resize および rotate メソッドを持つ
 
*Imageクラスは、resize および rotate メソッドを持つ
  >>> im = Image.open(r'c:\work\img\test01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg')
  >>> out = im.resize((50,50))
+
  &gt;&gt;&gt; out = im.resize((50,50))
  >>> out = out.rotate(45)
+
  &gt;&gt;&gt; out = out.rotate(45)
  >>> out.save(r'c:\work\img\test03.jpg')
+
  &gt;&gt;&gt; out.save(r'c:\work\img\test03.jpg')
 
*test03.jpg
 
*test03.jpg
 
[[File:1046_test03.jpg]]
 
[[File:1046_test03.jpg]]
  
 
*transpose メソッドを使うと、rotateと同様に回転することや、垂直や水平に反転できる。
 
*transpose メソッドを使うと、rotateと同様に回転することや、垂直や水平に反転できる。
  out = im.transpose(Image.FLIP_LEFT_RIGHT)
+
  out = im.transpose(Image.FLIP_LEFT_[[R]]IGHT)
 
  out = im.transpose(Image.FLIP_TOP_BOTTOM)
 
  out = im.transpose(Image.FLIP_TOP_BOTTOM)
  out = im.transpose(Image.ROTATE_90)
+
  out = im.transpose(Image.[[R]]OTATE_90)
  out = im.transpose(Image.ROTATE_180)
+
  out = im.transpose(Image.[[R]]OTATE_180)
  out = im.transpose(Image.ROTATE_270)
+
  out = im.transpose(Image.[[R]]OTATE_270)
  
  >>> im = Image.open(r'c:\work\img\test01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg')
  >>> im = im.transpose(Image.FLIP_LEFT_RIGHT)
+
  &gt;&gt;&gt; im = im.transpose(Image.FLIP_LEFT_[[R]]IGHT)
  >>> im.save(r'c:\work\img\test06.jpg')
+
  &gt;&gt;&gt; im.save(r'c:\work\img\test06.jpg')
 
*test06.jpg
 
*test06.jpg
 
[[File:1047_test06.jpg]]
 
[[File:1047_test06.jpg]]
163行目: 163行目:
 
**[http://ja.wikipedia.org/wiki/RGB RGB]
 
**[http://ja.wikipedia.org/wiki/RGB RGB]
 
**[http://ja.wikipedia.org/wiki/CMYK CMYK]
 
**[http://ja.wikipedia.org/wiki/CMYK CMYK]
  >>> import Image
+
  &gt;&gt;&gt; import Image
  >>> im = Image.open(r'c:\work\img\test01.jpg').convert('CMYK')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg').convert('CMYK')
  >>> im.save(r'c:\work\img\test07.jpg')
+
  &gt;&gt;&gt; im.save(r'c:\work\img\test07.jpg')
  
 
*[http://typea-mixi01.appspot.com/yh_s?q=CMYK+Firefox ブラウザとCMYKの問題(↓の画像が表示されない、色がおかしい)]
 
*[http://typea-mixi01.appspot.com/yh_s?q=CMYK+Firefox ブラウザとCMYKの問題(↓の画像が表示されない、色がおかしい)]
175行目: 175行目:
 
=====フィルタの適用=====
 
=====フィルタの適用=====
 
*ImageFilterモジュールは、多くの事前定義されたフィルターを提供
 
*ImageFilterモジュールは、多くの事前定義されたフィルターを提供
**BLUR
+
**BLU[[R]]
**CONTOUR
+
**CONTOU[[R]]
 
**DETAIL
 
**DETAIL
 
**EDGE_ENHANCE
 
**EDGE_ENHANCE
**EDGE_ENHANCE_MORE
+
**EDGE_ENHANCE_MO[[R]]E
**EMBOSS
+
**EMB[[OSS]]
 
**FIND_EDGES
 
**FIND_EDGES
**SHARPEN
+
**SHA[[R]]PEN
 
**SMOOTH
 
**SMOOTH
**SMOOTH_MORE
+
**SMOOTH_MO[[R]]E
  
  >>> import ImageFilter
+
  &gt;&gt;&gt; import ImageFilter
  >>> im = Image.open(r'c:\work\img\test01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg')
  >>> out = im.filter(ImageFilter.EMBOSS)
+
  &gt;&gt;&gt; out = im.filter(ImageFilter.EMB[[OSS]])
  >>> out.save(r'c:\work\img\test08.jpg')
+
  &gt;&gt;&gt; out.save(r'c:\work\img\test08.jpg')
 
*test08.jpg
 
*test08.jpg
 
[[File:1049_test08.jpg]]
 
[[File:1049_test08.jpg]]
198行目: 198行目:
 
*すべてのピクセルはこの関数にしたがって処理される。
 
*すべてのピクセルはこの関数にしたがって処理される。
 
=====コントラスト変換=====
 
=====コントラスト変換=====
  >>> im = Image.open(r'c:\work\img\test01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg')
  >>> out = im.point(lambda i: i / 3.0)
+
  &gt;&gt;&gt; out = im.point(lambda i: i / 3.0)
  >>> out.save(r'c:\work\img\test09.jpg')
+
  &gt;&gt;&gt; out.save(r'c:\work\img\test09.jpg')
 
*test09.jpg
 
*test09.jpg
 
[[File:1050_test09.jpg]]
 
[[File:1050_test09.jpg]]
  
 
=====カラーバンドを独立して操作=====
 
=====カラーバンドを独立して操作=====
  >>> im = Image.open(r'c:\work\img\test01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg')
  >>> source = im.split()
+
  &gt;&gt;&gt; source = im.split()
  >>> r, g , b = 0, 1, 2
+
  &gt;&gt;&gt; r, g , b = 0, 1, 2
  >>> mask = source[r].point(lambda i: i < 100 and 255)
+
  &gt;&gt;&gt; mask = source[r].point(lambda i: i &lt; 100 and 255)
  >>> out = source[g].point(lambda i: i * 0.7)
+
  &gt;&gt;&gt; out = source[g].point(lambda i: i * 0.7)
  >>> source[g].past(out, None, mask)
+
  &gt;&gt;&gt; source[g].past(out, None, mask)
  >>> source[g].paste(out, None, mask)
+
  &gt;&gt;&gt; source[g].paste(out, None, mask)
  >>> im = Image.merge(im.mode, source)
+
  &gt;&gt;&gt; im = Image.merge(im.mode, source)
  >>> im.save(r'c:\work\img\test10.jpg')
+
  &gt;&gt;&gt; im.save(r'c:\work\img\test10.jpg')
 
*test10.jpg
 
*test10.jpg
 
[[File:1051_test10.jpg]]
 
[[File:1051_test10.jpg]]
  
 
=====マスクを生成する書式=====
 
=====マスクを生成する書式=====
*Pythonは論理演算に必要な部分しか評価しない。そして最後に検査した値を返す。
+
*[[Python]]は論理演算に必要な部分しか評価しない。そして最後に検査した値を返す。
 
*なので、以下の 式(expression)が 偽なら false(0) を返し、真なら最後に評価した 255を返す。
 
*なので、以下の 式(expression)が 偽なら false(0) を返し、真なら最後に評価した 255を返す。
  
226行目: 226行目:
 
*イメージの強化機能クラスを、ImageEnhance モジュールで利用可能。
 
*イメージの強化機能クラスを、ImageEnhance モジュールで利用可能。
 
*いったんイメージから enhancement オブジェクトを作成したら、すばやく異なる設定を試すことができる。コントラスト調整、輝度、カラーバランス、シャープネスなど。
 
*いったんイメージから enhancement オブジェクトを作成したら、すばやく異なる設定を試すことができる。コントラスト調整、輝度、カラーバランス、シャープネスなど。
  >>> import Image, ImageEnhance
+
  &gt;&gt;&gt; import Image, ImageEnhance
  >>> im = Image.open(r'c:\work\img\test01.jpg')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\test01.jpg')
  >>> enh = ImageEnhance.Contrast(im)
+
  &gt;&gt;&gt; enh = ImageEnhance.Contrast(im)
  >>> out = enh.enhance(2.0)
+
  &gt;&gt;&gt; out = enh.enhance(2.0)
  >>> out.save(r'c:\work\img\test11.jpg')
+
  &gt;&gt;&gt; out.save(r'c:\work\img\test11.jpg')
 
*test11.jpg
 
*test11.jpg
 
[[File:1052_test11.jpg]]
 
[[File:1052_test11.jpg]]
241行目: 241行目:
 
*seek および tell メソッドによりフレーム間を移動することができる。
 
*seek および tell メソッドによりフレーム間を移動することができる。
 
=====アニメーションGIFをフレームに分解=====
 
=====アニメーションGIFをフレームに分解=====
  >>> import Image
+
  &gt;&gt;&gt; import Image
  >>> im = Image.open(r'c:\work\img\anime.gif')
+
  &gt;&gt;&gt; im = Image.open(r'c:\work\img\anime.gif')
  >>> try:
+
  &gt;&gt;&gt; try:
 
  ...    while True:
 
  ...    while True:
 
  ...            im.save(r'c:\work\img\anime' + str(im.tell()) + '.gif')
 
  ...            im.save(r'c:\work\img\anime' + str(im.tell()) + '.gif')
267行目: 267行目:
 
*PILは、テキストやグラフィックをPostscript プリンタへ印刷する関数を持つ。
 
*PILは、テキストやグラフィックをPostscript プリンタへ印刷する関数を持つ。
  
====イメージを読むその他の方法====
+
====イメージを読む[[その他]]の方法====
 
*上記までは、単純にファイル名のみを引数に Image モジュールの open 関数を利用していた。
 
*上記までは、単純にファイル名のみを引数に Image モジュールの open 関数を利用していた。
 
*成功すれば、Image オブジェクトが生成され、失敗すれば IOError が発生。
 
*成功すれば、Image オブジェクトが生成され、失敗すれば IOError が発生。
  
 
=====バイナリモードで開いたファイルからImageを作成=====
 
=====バイナリモードで開いたファイルからImageを作成=====
  >>> import Image
+
  &gt;&gt;&gt; import Image
  >>> fp = open(r'c:\work\img\test01.jpg', 'rb')
+
  &gt;&gt;&gt; fp = open(r'c:\work\img\test01.jpg', 'rb')
  >>> im = Image.open(fp)
+
  &gt;&gt;&gt; im = Image.open(fp)
  >>> im.show()
+
  &gt;&gt;&gt; im.show()
  
 
=====文字列IOからImageを作成=====
 
=====文字列IOからImageを作成=====
  >>> import Image, StringIO
+
  &gt;&gt;&gt; import Image, StringIO
  >>> fp = open(r'c:\work\img\test01.jpg', 'rb')
+
  &gt;&gt;&gt; fp = open(r'c:\work\img\test01.jpg', 'rb')
  >>> buf = fp.read()
+
  &gt;&gt;&gt; buf = fp.read()
  >>> im = Image.open(StringIO.StringIO(buf))
+
  &gt;&gt;&gt; im = Image.open(StringIO.StringIO(buf))
  >>> im.show()
+
  &gt;&gt;&gt; im.show()

2020年2月16日 (日) 04:31時点における最新版

目次

Python Imaging Library

Python |

Pillow Python Imaging Library (Fork)

概要

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

イメージアーカイブ

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

イメージ表示

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

イメージ処理

モジュール群

チュートリアル

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