空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

パターン認識のお勉強(11)

f:id:robonchu:20180512193754j:plain

参考: 2014/5/29 東大相澤山崎研勉強会:パターン認識とニューラルネットワーク,Deep Learningまで

やりたいこと

パターン認識について学ぶ

教科書

CG-ARTS | 書籍・教材

目次

プロトタイプ法による識別

特徴空間においてテスト画像から各クラスのプロトタイプまでのユークリッド距離を測り、最も近いクラスにテスト画像を識別する。

f:id:robonchu:20180512200009p:plain

参考: 「わかりやすいパターン認識」 第1章:パターン認識とは - ppt download

クラスの分布を考慮した識別

f:id:robonchu:20180512200852j:plain

参考:

NN法とkNN法

f:id:robonchu:20180512201200p:plain

参考:

kd-tree法

バックトラック: survey/kdtree.md at master · komi2/survey · GitHub

f:id:robonchu:20180512202559j:plain

参考: Scalable nearest neighbor algorithms for high dimensional data

ハッシングによる近似最近傍探索

f:id:robonchu:20180512201849j:plain

参考: 情報システム基盤学 基礎1 アルゴリズムとデータ構造 - ppt download

アダブースト

複数の識別器を組み合わせて一つの強力な識別器を学習するアンサンブル学習の一つ

f:id:robonchu:20180512203130p:plain

参考:

リアルアダブースト

ハードマージンSVMサポートベクターマシン

f:id:robonchu:20180512220724p:plain

参考:

ソフトマージンSVM

f:id:robonchu:20180512221529j:plain

参考:

カーネルトリック

高次に写像しながらも、写像の計算を避けるテクニックをカーネルトリックと呼ぶ。

f:id:robonchu:20180512222145p:plain

よく使用されるカーネル関数

  1. ユークリッド内積

  2. 多項式カーネル

  3. RBFカーネル

参考:

1対他分類器による多クラス識別

ニューラルネットワーク

robonchu.hatenablog.com

robonchu.hatenablog.com

深層学習

robonchu.hatenablog.com

ランダムフォレスト

学習サンプルをランダムサンプリングにより作成したサブセットごとに決定木を構築し、複数の決定木の結果を統合して識別する。

f:id:robonchu:20180513090836p:plain

参考:

階層的クラスタリング

f:id:robonchu:20180513091232j:plain

参考: クラスター分析の手法②(階層クラスター分析) | データ分析基礎知識

k-means法

f:id:robonchu:20180513092010j:plain

参考:

主成分分析

robonchu.hatenablog.com

robonchu.hatenablog.com

f:id:robonchu:20180513093251p:plain

参考:

線形判別分析

f:id:robonchu:20180513094016j:plain

参考:

部分空間法

SELFIC法

主成分分析で低次元化した特徴空間でクラスの近さに基づく識別を行う方法

CLAFIC法

主成分分析を用いて、クラスごとに入力画像群をよく表現する低次元な特徴空間を求め、その特徴空間をパターン学習の結果とみなす方法

参考:

KL展開:

f:id:robonchu:20180513100337p:plain

参考:

顔検出と顔識別

顔画像の特徴量:Haar-like特徴量

参考:

顔識別の方法

  1. 顔の局所領域においてローカルバイナリパターンのヒストグラムを作成する

  2. このLBPヒストグラムを用いて、NN法により最も類似している登録画像を求める

f:id:robonchu:20180513101456p:plain

参考: OpenCVで物体検出器を作成③ LBP特徴【開発会社プロフェッサ】

人検出

人の輪郭形状を捉える勾配方向ヒストグラムをもとにしたHOG特徴量が利用される

f:id:robonchu:20180513102055j:plain

参考: 局所特徴量と統計学習手法による物体検出

画像検索

f:id:robonchu:20180513102600p:plain

参考: Visual Wordsを用いた類似画像検索 - 人工知能に関する断創録

人体姿勢推定

f:id:robonchu:20180513103309j:plain

f:id:robonchu:20180513103336j:plain

f:id:robonchu:20180513103400j:plain

f:id:robonchu:20180513103412j:plain

参考:

所感

このあたりはSOTAな深層学習手法のほうがはるかに精度は高そう。

実際に構築するときは、計算コストとのトレードオフで適切な手法を選択していきたい。

パターン検出とマッチングのお勉強(10)

f:id:robonchu:20180507210906p:plain

参考:Archives

やりたいこと

パターン検出とマッチングについて学ぶ

教科書

CG-ARTS | 書籍・教材

テンプレートマッチング

テンプレートマッチング:予め標準パターンをテンプレートとして用意しておき、このテンプレートを用いて入力画像とのマッチングを行う

位置を検出することもでき、探索範囲に対して類似度を調べ、その中から最も類似する位置を検出する

類似度

類似度を調べるには以下の2つがよく利用される

  1. SSD: 差の二乗和。ユークリッド距離の二乗。

  2. SAD: 差の絶対値和。市街地距離。

また、以下が使われることもある。

  1. NCC: 正規化相互相関。ベクトルのなす角の余弦

  2. ZNCC: 相互相関係数

サブピクセル位置推定

サブピクセル位置推定:対応点の座標の小数値を推定する技術(サブピクセル推定)

f:id:robonchu:20180507212816j:plain

参考: 機械の目が見たセカイ -コンピュータビジョンがつくるミライ(9) カメラを用いた3次元計測(3) - サブピクセル推定 | マイナビニュース

高速探索法

探索範囲すべての位置での類似度の計算(全探索)は計算時間が多くかかることがある。

以下に効率化手法を示す。

残差逐次検定法

残差があるしきい値を超えたら、検出位置ではないとし、次の位置での計算にうつる方法

しきい値は自動的に決める方法があり、最初はしきい値を決めず計算し、それを最初のしきい値とし、次々計算していく中でそのしきい値を超えない場合、その値をしきい値に変更する。

こうすることで、常に真の最小値に到達することが保証されている。

疎密探索法

画像情報を何段階化の解像度で表現し、解像度の疎密性を利用することで、類似度や相違度の最大値位置や最小値位置を効率的に探索することができる。

イメージピラミッドを作り、低解像度から探索を行い、探索された位置に対して高解像度画像に上げていき探索を行う。こうすることで高速に探索できる。

f:id:robonchu:20180507214254j:plain

参考:画像認識 第4章-物体追跡:Object Tracking- - とある学生のお勉強日記

参照画素の選択による高速化

同時生起行列の確率を計算し、確率が低い(独自性が高い)画素を類似度計算に用いる参照画素とする。

こうすることで、もし選択された画素が1%であれば、100倍高速化される。

エッジ情報を用いたチャンファーマッチング

テンプレートマッチングの一種であり、入力画像とテンプレート画像間のエッジ相違度に基づいて探索を行う手法

f:id:robonchu:20180508213723j:plain

参考: Archives

ヒスログラム情報を用いたアクティブ探索

カラーヒストグラム

カラー空間を量子化した際の各色番号に対する類度を表したもの

類似度の算出は以下の2つがある。

  1. ヒストグラムインタセクション

    f:id:robonchu:20180508214429p:plain

    参考:http://web.tuat.ac.jp/~s-hotta/gke/ch4/index.html

  2. バタチャリヤ係数

    f:id:robonchu:20180508214307j:plain

    参考:

    www.slideshare.net

アクティブ探索

テンプレートと入力画像上のある領域のカラーヒストグラムの類似度が低ければ、周辺の重なりを持つ領域の類似度も低いという考え方を利用して、周辺領域の類似度計算を省く

コーナー検出全体まとめ

f:id:robonchu:20180512143248p:plain

参考: qiita.com

ハリスのコーナー検出

f:id:robonchu:20180512135558j:plain

参考:

FASTによるコーナー検出

決定木をトラバーサル(横切る)するだけでコーナーを検出できる

f:id:robonchu:20180512140039j:plain

参考:

DoG画像を用いた特徴点とスケールの検出

画像間の拡大縮小に関係なく、対応点を決めることができる

f:id:robonchu:20180512142056j:plain

f:id:robonchu:20180512142107j:plain

参考:

Cannyのエッジ検出アルゴリズム

f:id:robonchu:20180512144411p:plain

アルゴリズムCanny法によるエッジ検出 — OpenCV-Python Tutorials 1 documentation

参考:

SIFT

スケールと回転に不変な特徴記述

f:id:robonchu:20180512144927p:plain

f:id:robonchu:20180512150516j:plain

参考:

2値特徴量

BRIEF: BRIEF (Binary Robust Independent Elementary Features, 二値頑健独立基本特徴) — OpenCV-Python Tutorials

ORB: ORB (Oriented FAST and Rotated BRIEF, 方向付きFASTと回転BRIEF) — OpenCV-Python Tutorials 1 documentation

対応点マッチング

f:id:robonchu:20180512151410j:plain

f:id:robonchu:20180512151419j:plain

参考: MIRU2013チュートリアル:SIFTとそれ以降のアプローチ

図形要素検出

ハフ変換

f:id:robonchu:20180512151737j:plain

f:id:robonchu:20180512151747g:plain

参考:

一般化ハフ変換

ランダム化ハフ変換

f:id:robonchu:20180512154343j:plain

特徴統合性理論

顕著性マップ

f:id:robonchu:20180512155235j:plain

参考: コンピュータビジョンのセカイ - 今そこにあるミライ(44) 自動作成を行うために用いられることの多い3つの重要度マップ手法 | マイナビニュース

所感

ロボットの認識器を作る上でとても大事な章だと思う。なかなか難しいところもある。。。

顕著性マップなど人間の視覚システムに基づいて考えられている理論は面白い。

領域処理のお勉強(9)

f:id:robonchu:20180507181750p:plain

参考: Willow Garage ブログの非公式翻訳: OpenCV 2.1をリリース

やりたいこと

領域処理について学ぶ

教科書

CG-ARTS | 書籍・教材

目次

領域のテクスチャ

テクスチャ:繰り返しの輝度パターンを指す

テクスチャの繰り返しパターンを数値化する方法を以下に示す

  1. 2次フーリエ変換

  2. ガボールフィルタ

  3. 画素値の同時生起行列

周波数特徴量

2次フーリエ変換を用いるとテクスチャの特徴を波という観点から見ることができる。

領域分割し、その領域のパワースペクトルを測ることでテクスチャを数値化できる。

f:id:robonchu:20180507144328j:plain

参考: 汚染度の定量化・2次元フーリエ変換、その理論的導入

ガボールフィルタ

f:id:robonchu:20180507145138j:plain

参考:

www.slideshare.net

ガボールフィルタ:正弦波・余弦波にガウス関数で窓をかけた関数になっており、パラメータを操作して、様々な方向と強度をもつフィルタを多数準備して、特徴抽出を行う。

このフィルタ群をフィルタバンクとよび、抽出された特徴量の群はtextonとする。

同時生起行列を用いた統計的特徴量

f:id:robonchu:20180507151209g:plain

参考: グレー レベルの同時生起行列の作成 - MATLAB & Simulink - MathWorks 日本

同時生起行列:離れた2つの場所にある画素対の値から画素値の一様性、方向性、コントラストなどの性質を表す特徴量を求めるもの

同時生起行列を用いて計算するおもな特徴量は次の7種類がある

  1. エネルギー

  2. コントラスト

  3. 相関

  4. エントロピー

  5. サムエントロピー

  6. 逆差分モーメント

隣接画素の統合による領域分割処理

f:id:robonchu:20180507153328j:plain

参考: 領域拡張法のテスト: メモブログ

領域統合法:類似した特徴量を持ち空間的に隣接した画素の集合に画像を分割する手法

画素特徴量のクラスわけによる領域分割処理

f:id:robonchu:20180507153856j:plain

参考: 画像処理論

画素をその特徴量に基づいて特徴空間に基づいて特徴空間に写像し、その特徴空間でクラス分けし、各クラスに属する画像群を領域として画像を分割する方法

ミーンシフトを用いた画像分割処理

ミーンシフト法 → 画像領域の分割や対象画像の追跡に用いられる

参考: Mean Shift Clustering

基本原理

ある任意の点から半径hの超球を考え、その範囲にある点群の平均を計算し、その位置に観測点を移動する。同様の操作を繰り返すと、観測点は最大勾配の方向に移動し、やがて極大点に収束する

確率密度関数の推定

f:id:robonchu:20180507155238j:plain

参考:

www.slideshare.net

確率密度関数の勾配

勾配法:確率密度関数のある点から勾配の大きい方に移動して極大点を探索する方法

f:id:robonchu:20180507155656j:plain

参考:

www.slideshare.net

勾配法を用いた極大探索

このミーンシフト法では確率密度関数が大小が自動的に計算されオーバーシュートや振動がないことで知られている

f:id:robonchu:20180507160623j:plain

参考:

www.slideshare.net

クラスタリングへの応用

各点にミーンシフト法を実行し、収束位置がしきい値以下なら同じクラスタに入れる。

特徴としては全ての点でこの処理が必要だが並列化でき、クラス数をあらかじめ設定する必要がない。

f:id:robonchu:20180507161408j:plain

参考:

www.slideshare.net

対象物と背景の間のエッジを利用した領域分割処理

スネーク:エッジを閉曲線として抽出する

スネークでは複数の対象物や鋭い屈曲がある閉領域を正しく抽出できないという欠点がある。

f:id:robonchu:20180507172717p:plain

参考: 動的輪郭モデル

輪郭抽出

グラフカットを用いた領域分割

f:id:robonchu:20180507180210j:plain

グラフカット:全画面を対象と背景の2種類にラベル付するときに最小となるコスト関数を与え、コスト最小となるラベルの組み合わせを効率良く求める方法

f:id:robonchu:20180507180122p:plain

参考:

コスト関数の意味:グラフィカルモデル入門

GrabCut

領域分割の利用例

合成画像を作るときによく用いられる。つなぎ目の不自然さをなくすために以下のような方法がある。

マッティング:部分画像の境界の画素値を同じ位置に重なる背景画像の画素値の平均値で置き換える処理

アルファブレンディング画像のアルファブレンドを行うときに陥りがちな罠 - どらの日記

参考: 合成のなじみを良くする「エッジブレンディング」のテクニック - コンポジゴク

所感

背景除去や特徴量を用いたセグメンテーションの方法などどれも興味深い。

これらと深層学習の両知識を増やしてコスパの良いロボットの認識器をどんどん考えていきたい。

Xamarinで遊んでみる

f:id:robonchu:20180505191510p:plain

やりたいこと

Xamarinを使ってiOSアプリ開発を無料でしたい

レシピ

教科書

インストール

  1. Mac OS Update

  2. Xcode Update

  3. Visual Studio for mac Install

実機の準備(例:iOS11.03のiPhone6s)

  1. iPhoneMacにつなぐ

Xcodeの設定

Visual Studioiphoneでの実機ビルドを行う為に、Xcodeでダミープロジェクトをつくってバンドル識別子を取得する必要がある

  1. アカウントの登録

  2. プロジェクトの作成(ここでバンドル識別子が取得できる)

    1. iOS

    2. Single View Application

参考:

Visual Studioのプロジェクトの作成(設定)・ビルド

  1. 新しいプロジェクトを作る

    1. iOS

    2. Single View Application

  2. 作成したプロジェクトのInfo.plistのバンドル識別子を上記の物に変更する

  3. 上方タブのDebug -> iPhoneに設定し、横の▷(実行ボタン)をクリック

  4. iPhone上で設定→一般→プロファイル→信頼をクリック

上記手順で実行できる

Xamarinの初期コード構成

  1. Main.cs

    • アプリケーションのエントリーポイント
  2. Info.plist

    • アプリケーション名やバージョンなどを設定できるファイル
  3. Main.storyboard

    • 画面を定義する為のストーリーボードファイル
  4. ViewController.cs

    • ストーリーボードの画面に対してロジックを奇術するためのクラス

いくつかコードをトライ

ボタンなど基本の操作のサンプル

磁気センサ

GPS

加速度センサ

加速度センサを使う

ViewControllerを以下を参考に書きかえ

上記コードの解説
画面サイズ基準でラベルサイズを指定
            // Viewのサイズを取得
            layoutW = View.Bounds.Width;
            layoutH = View.Bounds.Height;

            // Viewサイズを元にLabelサイズを指定
            textW = layoutW / 2;
            textH = layoutH / 6;
デバッグ出力
System.Diagnostics.Debug.WriteLine("Width: {0}, Height: {1}", layoutW, layoutH);
ラベルの作成
            // Label作成&配置
            var sensorText = new UILabel(new CGRect(layoutW / 2 - textW / 2, layoutH / 2 - textH / 2, textW, textH));
            sensorText.BackgroundColor = UIColor.FromRGB(192, 192, 192);
            sensorText.Lines = 0;
            sensorText.TextAlignment = UITextAlignment.Center;
            sensorText.LineBreakMode = UILineBreakMode.TailTruncation;
            View.AddSubview(sensorText);
加速度の表示&反映

Frameとは:[iPhone] UIView の frame と bounds の違い | Sun Limited Mt.

           var textLoc = sensorText.Frame;

            motionManager = new CMMotionManager();

            if (motionManager.AccelerometerAvailable)
            {
                // Accelerometer Update間隔
                motionManager.AccelerometerUpdateInterval = 0.015;
                // UpdateがQueueに入る度に処理を行う(多分)
                motionManager.StartAccelerometerUpdates(NSOperationQueue.CurrentQueue, (data, error) =>
                {
                    sensorText.Text = string.Format("X = {0:N4}\nY = {1:N4}", data.Acceleration.X, data.Acceleration.Y);
                    // 現在の位置を取得
                    nowX = sensorText.Frame.X;
                    nowY = sensorText.Frame.Y;

                    System.Diagnostics.Debug.WriteLine("nowX: {0}, nowY: {1}", nowX, nowY);

                    // Viewをはみ出さないようにAccelerometerの値によってLabelを移動
                    if (nowX + (nfloat)data.Acceleration.X * 10 > 0 && nowX + (nfloat)data.Acceleration.X * 10 < layoutW - textW)
                        textLoc.X = nowX + (nfloat)data.Acceleration.X * 10;

                    if (nowY - (nfloat)data.Acceleration.Y * 10 > 0 && nowY - (nfloat)data.Acceleration.Y * 10 < layoutH - textH)
                        textLoc.Y = nowY - (nfloat)data.Acceleration.Y * 10;

                    sensorText.Frame = textLoc;
                });
            }
動作画面

f:id:robonchu:20180505162026p:plain

この画面の中央に加速度が表示される

Bluetoothを使う

ハマり個所

所感

これからロボットの操作用IFにスマホを使っていきたい♪

3Dセグメンテーションのお勉強

やりたいこと

3Dセグメンテーションについて学ぶ

教科書

GitHub - timzhang642/3D-Machine-Learning: A resource repository for 3D machine learning

RANSAC

【お勉強してみた】RANSACのおはなし - Qiita

自然界のデータにはたくさんノイズがある

ノイズがあると、法則性をうまく見つけられないことがある

そんなノイズをうまく無視するのがRANSAC

参考:

Point Net

www.slideshare.net

Git:GitHub - charlesq34/pointnet2: PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

SEGCloud

f:id:robonchu:20180502160249p:plain

論文:https://arxiv.org/pdf/1710.07563.pdf

6-DoF Object Pose from Semantic Keypoints

f:id:robonchu:20180502160926p:plain

6-DoF Object Pose from Semantic Keypoints

Git:object3d/code at master · geopavlakos/object3d · GitHub

Good!!!

3D Bounding Box Estimation Using Deep Learning and Geometry

f:id:robonchu:20180502161743p:plain

論文: https://arxiv.org/pdf/1612.00496.pdf

Git: GitHub - fuenwang/3D-BoundingBox: PyTorch implementation for 3D Bounding Box Estimation Using Deep Learning and Geometry

Sliding Shapes for 3D Object Detection in Depth Images

f:id:robonchu:20180502162507j:plain

Sliding Shapes for 3D Object Detection in Depth Images

Object Detection in 3D Scenes Using CNNs in Multi-view Images

論文:https://stanford.edu/class/ee367/Winter2016/Qi_Report.pdf

Deep Sliding Shapes for Amodal 3D Object Detection in RGB-D Images

f:id:robonchu:20180502163316j:plain

Deep Sliding Shapes

Git:GitHub - shurans/DeepSlidingShape: Deep Sliding Shapes for Amodal 3D Object Detection in RGB-D Images

Good!!!

DeepContext: Context-Encoding Neural Pathways for 3D Holistic Scene Understanding

f:id:robonchu:20180502163730p:plain

DeepContext

Voxel Net

f:id:robonchu:20180502170755j:plain

論文: https://arxiv.org/pdf/1711.06396.pdf

Git: GitHub - jeasinema/VoxelNet-tensorflow: A 3D object detection system for autonomous driving.

PointNets

f:id:robonchu:20180502171533j:plain

論文: https://arxiv.org/pdf/1711.08488.pdf

Git: GitHub - charlesq34/frustum-pointnets: Frustum PointNets for 3D Object Detection from RGB-D Data

Good!!!

(おまけ)三次元のデータ形式

PCD

PLY

参考

2値化画像処理のお勉強(8)

f:id:robonchu:20180501163851p:plain

参考:二値化処理 | JProgramer

やりたいこと

2値画像処理について学ぶ

教科書

CG-ARTS | 書籍・教材

二値化

f:id:robonchu:20180501163802j:plain

参考:画像処理(二値化)

2値化

2値化は文字をファックスで送る場合やOCRによって文字認識を行う場合などに必要となる処理である。

以下に2値化の方法を示す。

p-タイル法

画像中の文字の占める領域の画素数が文字の大きさと撮影条件からあらかじめ予測できる場合に、予測された画素数に応じてしきい値を決める手法。未知画像には適さない。

f:id:robonchu:20180501164624p:plain

参考: Pタイル法 画像処理ソリューション

モード法

山と山の間の谷の底をしきい値とする。谷の底を自動かつ安定に検出するためにノイズ除去が必要。

f:id:robonchu:20180501164939j:plain

参考:画像処理(二値化)

判別分析法

分離度が大きくなるようにしきい値を決める。

分離度:クラス間分散とクラス内分散の比で定義される

f:id:robonchu:20180501165338p:plain

参考: C++でOpenCVを使って判別分析法(大津の2値化)を自作してみる | ITハット

連結性

f:id:robonchu:20180501165927p:plain

参考:

輪郭追跡

f:id:robonchu:20180501170252p:plain

参考: 2値画像の基本処理と計測 - メディア情報処理 - アットウィキ

輪郭追跡手順

  1. ラスタスキャンで画素が変化する場所を探索

  2. 右回りに黒を探索

  3. 見つかった黒画素に移動。追跡済みの場合は終了でそうでない場合は一つ前に戻る。

f:id:robonchu:20180501170914p:plain

参考: 輪郭追跡処理アルゴリズム 画像処理ソリューション

輪郭追跡の応用

チェインコード

f:id:robonchu:20180501171333p:plain

文字認識

f:id:robonchu:20180501171835g:plain

参考: 文字認識 | 文字認識の技術水準について | メディアドライブ

収縮・膨張処理

収縮:背景、穴に接する対象の画素を一回りはぎ取る処理。連結性を保持しない処理。

膨張:背景、穴に接する対象の画素に画素を一回り加える処理。連結成分同士が繋がる時があり、こちらも連結性を保持しない処理。

クロージング:同じ回数だけ膨張して収縮する処理。画像の小さな穴を除くことができる。

f:id:robonchu:20180501194305p:plainf:id:robonchu:20180501194337p:plain

オープニング:同じ回数だけ収縮して膨張する処理。画像の小さな連結成分を除くことができる。

f:id:robonchu:20180501194337p:plainf:id:robonchu:20180501194407p:plain

参考:膨張・収縮・オープニング・クロージング 画像処理ソリューション

収縮・膨張処理の応用例

画像信号を背景とパターン部分に2値化したのち、膨張・収縮処理を繰り返し行い、ノイズを除去したうえで比較し、欠陥を検出する方式などがある。

ラスタスキャンによるラベリング

二値化画像処理された画像において、白の部分(または黒の部分)が連続した画素に同じ番号を割り振る処理を ラベリングと言います。

通常、同じ番号ごとの面積(画素数)や幅、高さなどの特徴量を求めて欠陥検査や分類処理などに用いられます。

ラベリングには、二値化された画像の縦、横方向に連続している部分を同じラベルにする4連結と、 縦、横、斜め方向に連続している部分を同じラベルにする8連結との2種類の処理があります。

参考:ラベリング処理アルゴリズム 画像処理ソリューション

2値化画像

f:id:robonchu:20180501223312p:plain

4連結を用いたラベリング

f:id:robonchu:20180501223350p:plain

8連結を用いたラベリング

f:id:robonchu:20180501223425p:plain

輪郭追跡による距離変換画像

2値画像における対象物の各々に対し、その画像から最も近い背景画素に至る距離を求めてその画素の濃度値とする変換を距離変換という。この変換により得られる画像を距離変換画像という。

[f:id:robonchu:2018050122

形状特徴パラメータ

2値化画像中の連結成分は形状の特徴量によって分類できる。その特徴を数値化したものを形状特徴パラメータと呼ぶ。

  1. 重心

  2. 外接長方形

  3. 面積

  4. 周囲超

  5. オイラー

  6. モーメント特徴

参考:Re - ImageJで学ぶ!: 第24回 2値画像の形状解析で学ぶ!

距離

市街地距離(4近傍距離)

f:id:robonchu:20180501230249j:plain

チェス盤距離(8近傍距離)

f:id:robonchu:20180501230357j:plain

参考: クラスター分析の手法①(概要) | データ分析基礎知識

ベクトル化処理

細線化処理:連結成分の連結性を保存したまま画素を削る処理を繰り返す

細線化された2値画像の画素は特徴点である端点、分岐点、通過点の3種類に分類される。

f:id:robonchu:20180501231204p:plain

参考: パターン認識の前処理に必要な二値画像の細線化:CodeZine(コードジン)

細線化手法

ラスタスキャンを行い、注目画像を中心に3x3の画素値のパターンを観測し、注目画素が以下3つの条件を満たすとき、白画素にする

  1. 境界上にある黒画素であること

  2. 白画素に変更しても連結性が保存されること

  3. 端点でないこと

画素値の更新方法として以下の2つがある

  1. 逐次法:更新した画像をそのまま使い,次処理に移る

  2. 並列法:消去可能かどうかを検証する検証用画像と,画素値の更新を行う更新用画像を別々に持ち,更新用画像に結果を反映していきます.そして,全画素の処理が終了したら,更新用画像を,次処理の検証用画像とする

参考: 主にコーディング: 画像処理 #22 細線化

細線の特徴点抽出

細線化処理によって、端点、分岐点、孤立点、通過点の特徴点に分類する。特徴点と特徴点に区切られた画素列をセグメントという。

2分割法

セグメントを線分近似しCADシステムで扱える線分の始終点の座標列に変換することをベクトル化と呼ぶ。

線分近似でよく用いられる再帰的な分割法である2分割法の手順を以下に示す。

  1. 画素列の始点終点を繋いだ直線に対して、各画素からの距離を計算する

  2. 最大距離があるしきい値以下の場合、その直線を線分として採用。そうでない場合、その画素で画素列を分割し分割された画素列で前の手順から再帰的に繰り返す。

  3. 画素列の分割がなくなれば終了。

参考: 【C++】細線化した画像のセグメント分割 - Qiita

角点検出

画素を結ぶ線分のなす角度が小さい時に角点とし、画素列を分割する。この方法を用いると角点を線分の始終点にできるが、なめらかに曲がっている曲線に対して精度よく線分近似できない。

そのため、角点を検出して分割点とした後、分割点を2分割法で線分近似する方法が用いられる。

ベクトル化の応用例

人手で作った地図データから、自動で画像データをベクトル化し、家屋を検出するなど手間を省略するシステムなどがある。

所感

2値化画像の処理ひとつとっても奥が深い。。。

幾何学的変換のお勉強(8)

f:id:robonchu:20180501135427j:plain

参考:Okutomi lab

やりたいこと

画像の位置や形を変化させる画像の幾何学的変換について学ぶ

教科書

CG-ARTS | 書籍・教材

線形変換

[ [x`] , [y`] ] = [ [a, b] , [c, d] ] * [ [x] , [y] ]

で表すことができる変換を線形変換という

拡大・縮小

[ [x`] , [y`] ] = [ [s_x, 0] , [0, s_y] ] * [ [x] , [y] ]

回転

f:id:robonchu:20180501103344g:plain

参考: オープンメディアラボ(宮崎慎也・山田雅之・遠藤守・中貴俊 研究室)

[ [x`] , [y`] ] = [ [cosθ, -sinθ] , [sinθ, cosθ ] * [ [x] , [y] ]

鏡映

X軸

[ [x`] , [y`] ] = [ [1, 0] , [0, -1 ] * [ [x] , [y] ]

Y軸

[ [x`] , [y`] ] = [ [-1, 0] , [0, 1 ] * [ [x] , [y] ]

X=Y

[ [x`] , [y`] ] = [ [0, 1] , [1, 0 ] * [ [x] , [y] ]

スキュー

f:id:robonchu:20180501103947g:plain

参考: アフィン変換 画像処理ソリューション

X軸方向へスキュー

[ [x`] , [y`] ] = [ [1, b] , [0, 1 ] * [ [x] , [y] ]

b = tanθ

Y軸方向へスキュー

[ [x`] , [y`] ] = [ [1, 0] , [c, 1 ] * [ [x] , [y] ]

c = tanθ

合成変換

ここの変換行列の積により、合成変換を表す行列を計算できる

合成変換ではここの変換の順番を変えると結果が異なる点に注意!

同次座標とアフィン変換・射影変換

同次座標

同次座標:2次元平面上の点をu=[ [x], [y], [m] ]の形で表現する形式を同次座標表現と呼ぶ.実際の座標値は,[x/m y/m]の値を持つ.

参考:第10回目

アフィン変換

任意の線形変換と平行移動を組み合わせた変換をアフィン変換と呼ぶ

平行移動

[ [x`] , [y`] , [1] ] = [ [1, 0 , t_x ] , [0, 1 , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

線形変換

[ [x`] , [y`] , [1] ] = [ [a, b , 0 ] , [c, d , 0 ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

アフィン変換

[ [x`] , [y`] , [1] ] = [ [a, b , t_x ] , [c, d , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

ユークリッド変換

[ [x`] , [y`] , [1] ] = [ [cosθ, -sinθ , t_x ] , [sinθ, cosθ , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

相似変換

[ [x`] , [y`] , [1] ] = [ [s * cosθ, - s * sinθ , t_x ] , [s * sinθ, s * cosθ , t_y ] , [0, 0, 1] ]* [ [x] , [y] , [1] ]

射影変換

f:id:robonchu:20180501114406j:plain

参考: 5.3@ŽË‰e•ÏŠ·

任意の四角形を別の任意の四角形に移すような変換

[ [x`] , [y`] , [1] ] = [ [h11, h12 , h13 ] ,  [h21, h22 , h23 ] ,  [h31, h32 , h33 ] ]* [ [x] , [y] , [1] ]

すべての変換を包含するようなもの↓

f:id:robonchu:20180501114105j:plain

参考: 幾何学変換の関係 - ぱたヘネ

画像の再標本化

変換後の画像を再び縦横等間隔に標本化された位置の集まりとして表現すること

この際、下記に述べる補間を出力画像中のすべての画素位置に対して行う

f:id:robonchu:20180501130031p:plain

参考: ブラウザによって画質が変わる!?ブラウザ別画像処理法 | WEB制作ブログ

ニアレストネイバー

求めたい位置に最も近い画素位置の値をそのまま利用する

高速だが、なめらかなエッジがギザギザになって現れるジャギーが多い

参考: 画素の補間(Nearest neighbor,Bilinear,Bicubic) 画像処理ソリューション

バイリニア補間

周りの4点の画素値の重み付きの平均値を求めることになるため、平滑化の効果が生じる。ジャギーが目立たなくなるが、エッジがなまる傾向にある。

参考: 画素の補間(Nearest neighbor,Bilinear,Bicubic) 画像処理ソリューション

バイキュービック補間

周りの16点の画素値を用いて補間する。バイリニア補間に比べてシャープで自然な画像になる。

参考: 画素の補間(Nearest neighbor,Bilinear,Bicubic) 画像処理ソリューション

イメージモザイキングとその概略処理手順

複数の画像をつなぎ合わせるような処理のことをイメージモザイキングという。以下に手順を示す。

  1. 特徴量の検出とマッチング

  2. 幾何学的変換の推定

  3. 画像の幾何学的変換と合成

特徴点の検出とマッチング

マッチング:画像間での対応を求める

このマッチング手法としてSIFTなどがある。

f:id:robonchu:20180501132423j:plain

参考:

幾何学的変換の推定

イメージモザイキングでは射影変換がよく用いられる。

最低、対応する4組の点の特徴点を用いることで解が導出できる。

特徴点にはアウトライヤ(誤った対応点)があるため、それを含んだ状態でもパラメータを推定する必要がある。

その方法として、RANSACがよく利用される。以下にRANSACでの射影変換のパラメータ推定手順を示す。

  1. 必要最低限のデータ(4組)をランダムに選択する

  2. 選択した4点からパラメータを計算

  3. パラメータを用いて他の点が正しく変換できているかチェックする。ここで正しい物をインライアというインライアの数を数えて記憶。

  4. 上記を繰り返し、インライアの最も多い射影変換のパラメータをインライアの結果として出力する。

参考: 【お勉強してみた】RANSACのおはなし - Qiita

画像の幾何学的変換と合成

画像をつなぐときに明るさの違い等によりつなぎ目が目立つことがある。

目立たなくする方法として、画像の重なった部分でアルファブレンディングの考え方を利用した画素の重み付き平均する方法等がある。

f:id:robonchu:20180501134149j:plain

参考: OpenCVで遊ぼう!: OpenCVで自動的にパノラマ写真を作る(OpenCV Panography)

平面・円筒面・球面パノラマ

撮影対象が平面、もしくは、カメラが光学中心を回転中心として回転し撮影した画像であれば原理的に射影変換により、2つの画像をつなぎ合わせることができる。

平面パノラマでは原理的に画角が180度以上のパノラマ画像を生成することはできない。

それに対し、合成画像の投影面を円筒面や球面にすることで、より広い範囲のパノラマ画像を生成することができる。

f:id:robonchu:20180501134957j:plain

参考: EOS MとPhotoShopでパノラマ合成(Photomarge) | GANREF

平面パノラマにおいて、空間上の直線はパノラマ画像上でも直線になるが、円筒面・球面パノラマにおいては直線性が保たれないことに注意!

所感

最近はやりの360度カメラの仕組み等がわかって楽しい♪