画像解析(演習6)

~/image/e6 で演習

ひとくちに

  • 画像解析と言ってもピンからキリまで。
  • 何を明らかにしたいのかによって方法は様々。
  • なので、今回は「画像解析ごっこ」

とりあえず、クラスタリング

  • だが、階層的クラスタリングは計算時間がかかるので、今日はやらない
  • 非階層的クラスタリングを使う
  • 計算を走らせるたびに違った結果になったりもする。

サンプル画像

  • 以前使用した 1.ppm を使う。
  • ダウンロードして本日の演習ディレクトリに入れておく

共通で使用する後処理

  • ClusterImg.py
  • クラスタリングした結果を見るのに、
  • そのクラスタに属する点の平均(R,G,Bごと)を計算して
  • 画像に(で表示、または保存)する

そのままクラスタリング

  • できたらプログラムを修正して、結果の画像を e601.ppm に保存する。
    # -*- coding: utf-8 -*-
    # e601.py
    import Image
    from Pycluster import *
    import ClusterImg
     
    img = Image.open('1.ppm')
    width , height = img.size
    data = list(img.getdata())
    # kcluster をデフォルト設定で使用
    N = 10
    clusterid, error, nfound = kcluster(data, N)
    # 後処理と表示
    clustavr = ClusterImg.calcavr(clusterid, img, N)
    print clustavr
    cimg = ClusterImg.clusterimg(img.size, clusterid, clustavr)
    cimg.show()
    

前処理で情報を追加

  • 次のような処理をクラスタリングの前に入れると、高波数成分が多いという情報を 追加できる(はず) (途中で追加情報の画像を確認してもよい)
    imx = img.convert('L')
    imx = imx.filter(ImageFilter.FIND_EDGES)
    imx = imx.filter(ImageFilter.SMOOTH_MORE)
    # imx.show()
    data = scipy.transpose(scipy.array([list(imx.getdata())]))
    data = scipy.concatenate((scipy.array(img.getdata()), data), 1)
    
  • ImageFilter, scipy など必要なモジュールを import しておくことも忘れずに。
  • プログラムは e602.py で作成、結果は e602.ppm に保存。

前処理で情報を減らす

  • 画像の濃淡情報を削除して、色情報だけでクラスタリングしてみる
  • YUV 変換で UV 成分だけを使用する。
    uv = []
    for x in data:
        r, g, b = x
        u = -0.14713 * r - 0.28886 * g + 0.436   * b
        v =  0.615   * r - 0.51499 * g - 0.10001 * b
        uv.append((u, v))
    
  • この uv をクラスタリングするための data として与える。
  • プログラムを e603.py で作成、結果は e603.ppm に保存。

発展課題

  • e603.py を 4.ppm に適用して、1.ppm との違いなどの結果を考察せよ

まいど、出席確認

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