2008年04月17日

画像から距離を算出する[R]

画像から座標情報をクリックによって取得し,対象物の長さを算出する.

必要なもの

  1. rimageパッケージ
  2. 長さを知りたい対象物と,既知の長さのスケールが写っている画像

方法

まず,rimageパッケージをインストールしておく.インストールしたら読み込んでおく.

library(rimage)

これでjpeg画像などが読めるようになる.ここでは以下の画像を読み込む.

 happa3

赤の色紙がスケール.5mm四方のサイズにカットしてある.知りたいのは左に写っている葉のサイズに関する情報だとする.

まずはこれをRに読み込ませる.

leaf <- read.jpeg("leaf.jpg")

ここでは,leaf.jpgという名前で作業ディレクトリに保存してあったこの画像を,leafという変数へ代入した. read.jpeg関数ではR,G,Bの成分については0〜FF(16進)で表現されていた情報が0〜1の数値へ変換され, 座標情報については行列という形へ変換される.行列に演算をほどこすによってガンマ補正や回転が可能であるが,ここでは扱わない. 今知りたいのは距離の情報だ.

次に,これをグラフィックデバイスに表示する.

plot(leaf)

あまり大きな画像はここで時間がかかる.場合によっては落ちるので,画像はできるだけ小さくした方が効率がいい.

次に,座標情報を取得する.座標情報は,locator関数により対話的に取得する. locator関数は実行されると待機状態となり,その間にクリックされたグラフィックデバイス内の座標情報をx,y成分に分けて返す.

locator(2)

とするならばクリックが2回行われるまで待機状態となり,2回のクリックが終わった時点で,

$x
[1] 1.553408 4.102340
$y
[1] 3.378737 1.999335

といった具合に値を返す.

2点間の距離は,2点の座標をそれぞれ(x1, y1), (x2, y2)とするなら,3平方の定理により,

20080417eq1

で与えられる.すなわち,座標情報を

p1 <- locator(2)

で変数へ代入していた場合,その算出は

sqrt((p1$x[1] - p1$x[2])^2 + (p1$y[1] - p1$y[2])^2)

である.

この手順を繰り返し,スケール間の長さ,対象物の長さを算出後,スケールに対する対象物の長さを算出, スケールの実寸を乗ずることで対象物の実際の長さが分かる.関数にまとめれば,

measure <- function()
 {
cat("スケールサイズを入力(単位:mm) : ")
scale.size <- as.numeric(readline())
p1 <- locator(2)
scale <- sqrt((p1$x[1] - p1$x[2])^2 + (p1$y[1] - p1$y[2])^2)
p2 <- locator(2)
size <- sqrt((p2$x[1] - p2$x[2])^2 + (p2$y[1] - p2$y[2])^2)
return((size/scale)*scale.size)
 }

引数なしで

measure()

と実行するとスケールのサイズ入力を求めるので,半角数字で入力する.エンターを押すと待機状態となるので,「スケールの両端」→ 「測定したい距離の両端」の順に4箇所をクリックすると,算出された距離が返ってくる.

ちなみに,最初の画像に示された葉の葉幅は16.7mmだった.

…実用性は…ない!

だって面倒だもの.わざわざRでやる利点はなにも無いのですよ.

画像から距離だとか面積だとかを知りたい場合はLIA32という優れたフリーソフトがあるのでそれを使うのが賢明です.

posted by Rion778 at 18:49 | Comment(0) | TrackBack(0) | PC関連。HTMLとか,Linuxとか,Rとか | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL(言及がない、関連がないと判断した場合削除することがあります)
http://blog.seesaa.jp/tb/93707834
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。