2014年1月26日日曜日

様々な色領域のラベリング

人間の顔や手などを認識するのに、前処理として肌色を検出する。

RGBでなくHSVやYCbCr空間を使用すると安定して肌色を検出できることがよく知られている。

HSV


H:色相(Hue)
S:彩度(Saturation)
V:明度(Value)

H色相は、赤っぽい、青っぽいといった「色あい」を表す。
色相を環状に並べたものを色相環といい、赤は 0°、黄色は 60°といったように円上の角度で色あいを示す。

S彩度は「鮮やかさ」を表す。
色相が同じでも、彩度が高ければ鮮やかに見え、低ければグレーに近くなる。
彩度がゼロの場合は無彩色(黒、グレー、白)になります。

V明度は「明るさ」を表す。
明度が高ければ明るい色に、低ければ暗い色になる。

・S と V を固定し H を遷移させて虹色のグラデーションを生み出す
・S を 1.0、 V を 1.0 に固定し H を乱数で決めることで、グレーや黒といった無彩色を避けながらランダムな色を作り出す(逆に無彩色だけを選ぶことも。) 
※参考 http://www.demoscene.jp/?p=1460

以下、変換式。

H =
60 × (G - B) / (Max - Min), if Max = R
60 × (B - R) / (Max - Min), if Max = G
60 × (B - G) / (Max - Min), if Max = B

S = (Max - Min) / Max 

V=Max


YCbCr

Y:輝度
Cb、Cr:色差


Y = 0.299 × R + 0.587 × G + 0.114 × B
Cb = -0.172 × R - 0.339 × G + 0.511 × B
Cr = 0.511 × R - 0.428 × G + 0.083 × B

※係数は視覚度特性による。


肌色


(H < 50 || H > 210) かつ (-50 < Cb && Cb < -20) かつ (20 < Cr && Cr < 40)



白い紙に印刷された黒い文字をラベリングするにはどうしたらよいだろうか。
SとVを低く抑えたフィルターをかけてみるか。


画像のラベリング

画像のラベリングのサンプル。

画像のラベリングのスタンダードな手法は 2 つある。

1. 再帰処理


2. 接続表


1. は注目画素から探索範囲を膨張して、背景画素や探索範囲の境界に到達したら収束させる処理を、全ての画素に対して行う。
背景画素が少ない場合の探索では、画素×画素程度の計算量が必要になりそう。


2. は探索は全画素数の2~3倍程度で良さそう。1回目は、注目画素が抽出した物体画素だった場合に、4または8近傍を探索して、ラベル付けされていなければ ラベル番号n +1を振り、ラベル付けされていれば ラベル番号nを振る処理をラスター処理する。
2回目は、各画素の4または8近傍に対し、自分自身のラベルnよりも小さいラベルmが降られているか、振られていれば、nをすべて、小さいラベルmに置き換える。この処理をラスター処理する。
最後は、ラベルを小さい方から順に詰める処理をラベルの中で行う。


以下、コード。

2013年11月17日日曜日

AngularJS IN DART

dart には angularjs が移植されている。

angularjsの素晴らしさを整理してみる:http://pochi.hatenablog.jp/entry/2013/11/13/002504

angularjsのdartへの移植が進行中:http://www.infoq.com/jp/news/2013/06/angularjs-dart

クロージャ:http://dqn.sakusakutto.jp/2009/01/javascript_4.html

Google Dart 事始め

Google Dartの正式版がリリースされたので使ってみる。

公式ページ


https://www.dartlang.org/


APIリファレンス

1.0リリース前のコードからは変更も多数。最新のAPIをチェックすべき。

http://api.dartlang.org/docs/channels/stable/latest/

参考サイト

DARTことはじめ:http://usagi.github.io/intro-dart/#/
DART入門:http://zenback.itmedia.co.jp/contents/www.sssg.org/blogs/hiro345/archives/10994.html
What is Dart:http://sitekamimura.blogspot.jp/2013/09/dart-what-is-dart-kindle-kathy-walrath.html

言語仕様


  1. クラスを使う
  2. クラスの外側にメソッドが記述可能
  3. オプションと引数:Javaと違って省略引数可能。C++のように後ろの引数を省略 or 引数に名前をつけて省略
  4. 文字列インターポレーション:php的に、"Hello, ${name}"とできる
  5. マルチライン文字列: ($s=<<END;) のような文字列リテラル
  6. 動的メソッドハンドリング:実行時にメソッドがあるか確認する
  7. カスケード演算子: JavaScript の with。
  8. オプショナルな型:小さなアプリなら型をかかない、ちゃんとしたアプリでは型をかく、が選べる
  9. レキシカルスコープ:{}が識別子のスコープ。クロージャ(Java8で実装予定のλや無名関数で実現する関数オブジェクトの一種)やローカル変数キャプチャもOK。
  10. ライブラリ:Pub(オープンなリポジトリで便利)
  11. Isolate:マルチスレッドでお互いのメモリにアクセス出来ないので安全
Javaで出来て、Dartで出来ないのは、メソッドのオーバーロード不可能。intが初期値を代入しないとnullになる。継承は1つまで。

※マルチライン文字列リテラル(以下だったらENDで囲まれた文字列の改行を維持する)
my $s = <<'END';
aaaa
iiii
uuuu
END


※カスケード演算子
with (document) {
  //このブロックの中ではdocument.を省略できる
  var hoge = getElementById('hoge');
  ...
}
※邦訳版
http://www.cresc.co.jp/tech/java/Google_Dart/DartLanguageSpecification_about.html

コードのサンプル


コード動かす

トップページから必要なSDKをダウンロードして解凍すると、Dart Editor (もとはEclipse)が入っているので起動する。

HelloWorld

新しいプロジェクト(WebApplication)を作成すると、webディレクトリの配下に以下のファイルが用意される。

[プロジェクト名].css
[プロジェクト名].dart
[プロジェクト名].html

その他に、packages/browserディレクトリが出来て、中に以下のファイルができる。
dart.js
hiterop.js


編集するのは、「.dart」の拡張子を持つ dart ファイル。後は、htmlとcssを編集する。C系と同じようにエントリーポイント(main)からプログラムが実行される。

dartを編集してから、htmlを右クリックして「run as JavaScript」を実行するとdart2jsが動いてJavaScriptが生成される。

構文

文字列


  • 文字列リテラルはECMAScriptライク
  • ${xxx}や\nなど、シェルスクリプトライクな文法が使用可能
  • ${new Date.now().day -1}などの式を、文字列内に内挿可能


型と変数


  • bool / int / double / num
  • String / List / Set / Queue / Map / ...
  • final 修飾で定数宣言(C++ の const と似ている)


制御文

Javaの構文をほぼそのまま使える

  • for / for-in / while / do-while
  • switch case break / if else / ?:
  • break / continue
  • try throw catch


演算子

Java、C++にある演算子はほぼそのまま使える


関数とラムダ式



クラスの継承

前半にも書いたが、多重継承は不可。


ジェネリクス

使える。型制約も可能。


DART SDK


  • dart : Dart処理系(Dart VM) Dart VMを搭載したブラウザだと動作。V8より高速。
  • frogc(dart2js) : dartからjsへのコンパイラー 
これ直接使うのはしんどい。Dart Editorのバックエンドとして動いてるって知っておく程度。


DART用HTMLファイル

cssとdartファイル指定。JavaScriptを生成してWebサーバに配置すればOK.

毎日さっくりと使えるTODOリストが無かったのでサンプルから作成。


以上。ワクワクする仕様。何つくろうかな。

チュートリアル

https://www.dartlang.org/codelabs/darrrt/#set-up
https://www.dartlang.org/docs/tutorials/add-elements/#copy-app

JavaScript 事始め

JavaScript 事始め

node.js使いたいので勉強。

もともとブラウザ内で動的なコンテンツを生成するためにつくられた言語。
以下、事始めで使ったコード。

2013年11月13日水曜日

chrootユーザを作成する

sftp限定ユーザの作成

#useradd test
#passwd test
#usermod -d / test
#chown root:root /home/test
#chmod 755 /home/test
#mkdir /home/test/files
#chmod 755 /home/test/files
#chown test:test /home/test/files
#groupadd sftponly
#usermod -G sftponly test
#vi /etc/ssh/sshd_config
 Subsystem       sftp    internal-sftp
 Match group sftponly
        ChrootDirectory /home/%u
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp