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

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

領域処理のお勉強(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度カメラの仕組み等がわかって楽しい♪

画像の復元と生成(6)

f:id:robonchu:20180430170927j:plain

参考:1307(月)ピンボケ写真修正。アンシャープマスク他 - 四級猫 . .

やりたいこと

画像復元の原理について学ぶ

教科書

CG-ARTS | 書籍・教材

ぼけ・ぶれ画像の復元

画像の劣化モデル

点拡がり関数:点広がり関数と線広がり関数とは? | ギモンらど!!

f:id:robonchu:20180430145628j:plain

参考: クラスター変分法と確率的情報処理 --Belief Propagation と画像処理アルゴリズム-- - ppt download

焦点ボケによる劣化に対する点拡がり関数のモデル化

カメラの焦点ぼけによる劣化は原画像では点であったものが広がりをもつようになる劣化である。また、広がりは方向によらず一定。

f:id:robonchu:20180430151733j:plain

参考: Pythonで画像処理(ローパスフィルタと畳み込み) - cBlog

カメラのぶれによる劣化に対する点拡がりモデル関数のモデル化

カメラの動きが等速直線運動で近似できる場合の点拡がり関数はカメラのブレ方向θにのみ、幅Wに一次元に広がっている関数で近似できる。

点拡がり関数のモデルのパラメータ推定

劣化画像の2次フーリエ変換が周波数領域で周期的に0になる性質を利用してモデルパラメータを推定することができる

逆フィルタ・ウィーナフィルタによる画像復元

逆フィルタが発散し、劣化画像に含まれるノイズ成分が増幅され、復元画像に大きなノイズが生じることがある。

周波数領域におけるノイズを考慮したものとして、ウィーナフィルタがある。

参考:ウィナー・フィルタでノイズ除去 - Allisone

f:id:robonchu:20180430153608p:plain

参考: 1.5. Scipy: 高水準の科学技術計算 — Scipy lecture notes

さまざまな画像復元・生成

ノイズ除去

以下の2つの仮定を行うとノイズは独立同一分布に従う。また、モデルとして独立同一なガウス分布がよく用いられる。

  1. ノイズの確率密度分布が画像全体で変化しない

  2. ノイズは画素ごとに独立である

また、単純な線形フィルタではノイズ除去の際にエッジがなまることが多く、エッジを保存するような非線形フィルタが用いられることが多い。

画像の性質を拘束に利用する拘束付き最小2乗法によりノイズ除去を行う方法がある。以下にキーワードを記載する。

  1. 事後確率最大化法(MAP法)

  2. 尤度

  3. 事前確率

  4. マルコフ確率場

  5. 共役勾配法

上記の事前確率をモデル化したり、拘束の汎関数設計は困難なことが多いため、パッチベース手法がよく取られる。

パッチベース手法

f:id:robonchu:20180430172624j:plain

参考: SSII2014 チュートリアル資料

画像超解像

標本化により劣化した画像から高周波成分を復元する処理を 画像超解像 と呼ぶ。以下の2つがある。

  1. 画像データベースや学習に基づき1枚の低解像度画像から高解像度画像を復元する事例ベース超解像

  2. 複数の低解像度画像を利用して高解像度画像を復元する複数フレーム超解像

f:id:robonchu:20180430173545j:plain

参考: 次世代デジカメ技術なぅ(2):デジカメにリコンフィギュラブルな頭脳を――カシオ「EXILIMエンジンHS」 (3/3) - MONOist(モノイスト)

ハイダイナミックレンジ画像

ダイナミックレンジ:観測可能な最大値と最小値の比

8bit量子化では明暗差がある画像ではダイナミックレンジが不足してしまう

そのため、露出設定の異なるダイナミックレンジの狭い複数の画像を用いてダイナミックレンジの広いハイダイナミックレンジ画像を生成する方法がある。

露出設定を変えて撮影した複数の画像からハイダイナミックレンジ画像を合成して、トーンマッピングすることにより明暗領域を同時に観察できる。

f:id:robonchu:20180430175509p:plain

参考:t-pot『Tone mapping』

ガイド画像を利用した画像処理

ライトフィールド撮影

ライトフィールドカメラの原理

f:id:robonchu:20180430181315g:plain

ライトフィールド:Light Field Imaging by Kawaguchi Tatsuya

f:id:robonchu:20180430181100j:plain

参考: プロジェクト | 九州大学 大学院システム情報科学研究院 情報知能工学部門 イメージ・メディア理解研究室

コンピューテーションフォトグラフィ

コンピュテーショナルフォトグラフィでは、光学によって得られた像は中間生成物に位置づけられる。撮影時の光の方向や角度、被写体までの距離など、さまざま情報を記録し、あとからデジタル処理で画像を生成する。これにより、撮影後のピント調整やぶれの除去など、従来のカメラでは不可能だった機能を実現する。

参考: コンピュテーショナルフォトグラフィ:Computational Photography:研究開発:日立

例:符号化露光

f:id:robonchu:20180430181923j:plain

参考: 20160612 第34回cv勉強会@関東 コンピュテーショナルフォトグラフィ

所感

機械学習を使わずとも、ピントをあとから変えたり、高解像度化を行えるのは便利

周波数領域によるフィルタリングのお勉強(5)

f:id:robonchu:20180429092143j:plain

参考:周波数領域における画像処理

やりたいこと

周波数領域によるフィルタリングについて学ぶ

教科書

CG-ARTS | 書籍・教材

画像のフーリエ変換

画像フィルタリング、復元・再構成、テクスチャ解析、符号化などに用いられる

2次元フーリエ変換

f:id:robonchu:20180429092855j:plain

参考: 【画像処理】フーリエ変換の原理・実装例 | アルゴリズム雑記

振幅・位相・パワースペクトル : https://tmytokai.github.io/open-ed/activity/spectrum/text01/page02.pdf

高速フーリエ変換 (FFT)FFTとは何か、フーリエ変換との関連と絶対抑えるべき注意点 - HELLO CYBERNETICS

f:id:robonchu:20180429095411p:plain

参考: 周波数フィルタリング | Rによる画像処理プログラミング

周波数フィルタリング

f:id:robonchu:20180429095703g:plain

参考: フィルタリングについて

フーリエ変換の重要な性質

  • 2つの関数の畳込み積分の結果をフーリエ変換したものは、それぞれの関数のフーリエ変換の積に等しくなる

  • 空間フィルタの大きさが小さい時は空間フィルタリングが有利であり、その大きさが大きくなるに従って、周波数フィルタリングのほうが有利になる

ローパス・ハイパス・バンドパスフィルタ

f:id:robonchu:20180429095515p:plain

参考: 周波数フィルタリング | Rによる画像処理プログラミング

  • ローパスフィルタ:高周波成分が除かれ、平滑化された画像が得られる

    • 空間フィルタのガウシアンフィルタや平均化フィルタもフーリエ変換してみるとローパスフィルタの性質を持っていることがわかる
  • ハイパスフィルタ:ローパスの逆。画像の高周波成分は残し、低周波成分は除去する

  • バンドパスフィルタ:画像に含まれる空間周波数のうちある中間的な周波数の範囲を残すもの

    • 空間フィルタのLoGフィルタをフーリエ変換してみるとバンドパスフィルタの性質を持っていることがわかる

ローパス

f:id:robonchu:20180429102343p:plain

ハイパス

f:id:robonchu:20180429102404p:plain

バンドパス

f:id:robonchu:20180429102423p:plain

参考: 画像処理におけるフーリエ変換④〜pythonによるフィルタ設計〜 - IMACEL Academy -人工知能・画像解析の技術応用に向けて-|LPixel(エルピクセル)

高域強調フィルタ

ハイパスフィルタは画像の直流成分を含む低周波数成分を除去してしまうため、画像の平均的な明るさが保たれない。

一方、低周波成分を保ちつつ高周波を強調するフィルタを高域強調フィルタという。

H_high_emph = 1 + k x H_high(←ハイパスフィルタ)

で表すことができる。直流成分は1を保ちつつ高域が強調される。
  • 空間フィルタのアンシャープマスクと等価の処理になる

参考

【画像処理】フーリエ変換の原理・実装例 | アルゴリズム雑記

所感

いろんな分野でフーリエ変換がでてくる。大事!!!