画像の濃淡情報(演習2)
画像の濃淡情報
- この演習では
- Python Imaging Library を用いて画像を読み込み
- Pixel ごとの処理を行うプログラムを作成する
- PIL には、pixel ごとでなく、まとめてごそっと処理できる機能もあるが、とりあえずは使用しない
- 演習は ~/image/e2/ で行う
$ cd image $ mkdir e2 $ cd e2
ヒストグラムを求める
- サンプル画像 ... ダウンロードして利用する
# e201.py ... make histogram import Image img = Image.open('sample.pgm') width, height = img.size hist = [0,]*256 for j in range(height): for i in range(width): pixval = img.getpixel((i, j)) hist[pixval] += 1 for t in range(len(hist)): print '%3d %4d' % (t, hist[t])
- 実行
$ python e201.py
ヒストグラム表示の準備
- Gnuplot を使用
- XWindow (X11) を起動
- xterm が出るので、その中で作業する
$ cd image/e2 $ gnuplot
- 試しに、y = sin x のグラフを描いてみる
gnuplot> plot sin(x) with lines
- gnuplot は終了せずに置いておく(終了したら同じ手順で再起動)
- gnuplot の終了コマンドは
quit
- gnuplot の終了コマンドは
ヒストグラムの表示
- シェルのリダイレクトを用いて、ヒストグラムデータを sample.hist というファイルに保存
$ python e201.py > sample.hist
- Gnuplot で、
gnuplot> plot "sample.hist" with lines
濃度変換
- pixel 値を反転するには、入力を x 出力を y として
- y = 255 - x
- とすればよい
# e202.py ... invert image import Image im0 = Image.open('sample.pgm') width, height = im0.size im1 = Image.new('L', (width, height)) for j in range(height): for i in range(width): x = im0.getpixel((i,j)) y = 255 - x im1.putpixel((i,j), y) im1.show()
im1.show()
をim1.save("sample_inv.pgm")
とすると "sample_inv.pgm" に保存される
練習
- sample_inv.pgm のヒストグラムを sample_inv.hist に作成し、gnuplot で表示する
問題:濃度変換
- 以下のようなコントラスト変換を行うプログラムを e203.py に作成しなさい。
- 変換前の画像は次の中から選ぶこと
- また、変換した画像を "e203.pgm" に保存し、そのヒストグラムを e203.hist に作成しなさい。
- 必ず gnuplot でヒストグラムを確認すること。
y = 0 ... ( x < 64) (x - 64) * 2 ... (64 <= x < 196) 255 ... ( x >= 196)
発展課題(e204)
- 以下のように、一部を白黒反転するような濃度変換も可能である。このような技法を「ソラリゼーション」と呼ぶ。ソラリゼーションは 銀塩写真でも処理途中で印画紙に光を当てることで可能であり、古くから行われている手法である。
y = 2 * x ... ( x < 128 ) 255 - 2 * (x - 128) ... ( x >= 128 )
発展課題(e205)
- Image クラスのメソッドである point() を使うと、全pixel に適用する変換を一度に行うことができる。
- ただし、PGM 画像は "L" mode であるため、変換表(lookup table) をあらかじめ作る必要がある。
# e205.py ... bright import Image # make lookup table brighter = [] for x in range(256): y = 0.5 * (x - 255) + 255 brighter.append(int(y)) im0 = Image.open('sample.pgm') im1 = im0.point(brighter) im1.show()
- 上記プログラムを実行してみなさい。
- また、プログラムを修正して、自分が選んだ画像の明るさを変えて e205.pgm に保存しなさい。
- e205.pgm のヒストグラムを確認しなさい。
出席確認
- 本日作成した 最後の 画像をメールに添付して、菊地・画像処理論用 に送信。本文に感想等入れるも可。