Personal tools
You are here: Home メンバー 菊地時夫 授業 画像処理論 画像の濃淡情報(演習2)
Document Actions

画像の濃淡情報(演習2)

by 菊地時夫 last modified 2007-05-16 11:21

画像の濃淡情報

  • この演習では
  • 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

ヒストグラムの表示

  • シェルのリダイレクトを用いて、ヒストグラムデータを 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 のヒストグラムを確認しなさい。

出席確認

  • 本日作成した 最後の 画像をメールに添付して、菊地・画像処理論用 に送信。本文に感想等入れるも可。

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: