画像解析(演習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 との違いなどの結果を考察せよ
まいど、出席確認
- 本日作成した 最後のプログラム をメールの本文に記入して、菊地・画像処理論用 に送信。本文の最初に感想等入れるも可。
