Blog

画像の解析初級編 (傾きを検出してみる)

2015.10.20Cat:プログラマー 数学

はじめに

スキャンデータなど傾きの多い画像を
筆者が以前よく扱っていた際に「楽して一括補正出来ないだろうか」と思い勉強した内容です。

※残念ながら完成間近にしてソースが全て消えたため、頓挫しました。

線の検出の仕方

本稿では「ハフ変換」と言う座標変換を使った方法を扱います。
直交座標(x-y座標)と極座標(ρ-θ)を行ったり来たりすることで傾きを検出します。

円の検出も出来るのですが、今回は割愛します。

ハフ変換の導入

まず、直交座標上に(x, y)と言う点があるとき、
この点を通る全ての直線は
ハフ変換式

ハフ変換式

のように表すことが出来ます。

それぞれ、原点から直線に垂直に線を引いた際の距離(ρ)、角度(θ)となります。
そしてこの距離と角度で表した座標のことを極座標と言います。

以下の図が参考事例です。

ハフ変換の原理

ハフ変換の原理

ハフ変換の簡単な事例

数値的に簡単な事例をあげたいと思います。
x-y座標に以下の様な y = -x + 2 の直線(1)があるとします。
image00

この直線は(1,1)を通ります。
これを極座標に変換してみると
ρ = cos(θ) + sin(θ)
と、以下の様な円を描きます。

x=1, y=1を通る直線の集合

x=1, y=1を通る直線の集合


大抵の座標では放物線を描きますが、Mac標準搭載のGrapherでは何故か円を描きました。。ここはスルー。

更に、1の直線は(1.5, 0.5)も通ります。
この時の極座標は以下のような円となります。

x=1.5, y=0.5を通る直線の集合

x=1.5, y=0.5を通る直線の集合

上の2と3の交点を求めると

2点どちらも通る直線が赤のバツで示した交点

2点どちらも通る直線が赤のバツで示した交点

のようになります。
この交点は「(1,1)も通るし、(1.5,0.5)も通る直線」を意味します。

この点はρ=√2, θ=1/4πです。

Hough逆変換は、
y = -(cosθ/sinθ)・x + ρ/sinθ
  および
x = -(sinθ/cosθ)・y + ρ/cosθ

より、x-y座標に逆変換すると・・・
y=-x+2

が求まります!

実際に使うとして

しかし、この方法はノイズに弱い、無駄な点の情報を拾ってしまうなどの欠点があります。

そのため、実際の実装としては、
・ノイズを除去する
・輪郭強調フィルタをかけてエッジ部分だけを処理するようにする
などの手順を踏まなければなりません。

また実際の画像は全て必ず一定の直線とは限らないため、
平均を取る処理など色々実践で使うには工夫が必要ですが、基本的な理論は三角関数と極座標を知っていれば理解可能なものです。

筆者の対象は書籍が主ですが、実写でも判別がしやすいものであれば・・・
before
このような画像も・・・
after
こんな感じに勝手に回転してくれます。

四隅に出来る余白の補間はひじょ〜〜〜〜に難しいので当面は対象外です。。。

Author Profile

ohba

ランニングと音楽とヲタトーク好きプログラマーです。
数学と英語を勉強中です。

DeepLearning始めました!

» 投稿一覧
  • Launch Cart次世代ECサイト構築システム 初期月額無料
  • LaunchMovie ECに特化した動画制作サービス

Archive

ページTOPへ