工作の2S(Seiri/Seiton)

工作やプログラムでやったことをまとめていきます

ハフ変換 エクセルでアルゴリズムを確認してみたったあざす

●ごあいさつ

すっごいひっさびさで、はてぶろエディタ、

 どうつかうんだっけ?!!???

もう、?と!が2:1の比率なくらいで、戸惑いながら書いていきます

エクセルでやってるので、すぐ確認できると思います
なんかの役に立てば幸いです

●ハフ変換の概要

本題です
OpenCVでは序盤の終わりくらいで登場する、「直線(円)を検出するためのアルゴリズム」です。
テスト解答欄の枠だったり、道路の白線認識だったり、人間は区切るのに直線を使用します。
だから、直線を認識できるのはコンピュータにとってもありがたいのです。
ここでは標準ハフ変換を書いていきます。それしか実験してないので。

●仕組み

ハフ変換による直線検出 — OpenCV-Python Tutorials 1 documentation

教科書的な説明は ↑ でやっていただけます。

ざっくりいうと
画像を輪郭だけにして、画素1つ1つに注目して想定しうるすべての直線パターンを
配列にカウントする。一番カウントされる直線パターンが直線だ!

ここで大事なのは座標系で、直線というと普通は "y = ax + b" だったり "(x1, y1)と(x2, y2)を通る"とか表すが
"原点から何度(θ)にいくら(ρ)の垂線を持つ"であらわすこと
f:id:kt-marshal:20180515221534p:plain
f:id:kt-marshal:20180515221545p:plain

よって、直線は
ρ = xcosθ + ysinθ
と一般化できる
f:id:kt-marshal:20180515222736p:plain

●エクセルで実装

後悔・・・すごい重い。エクセル方眼並みの大罪
ブックは下記に配置します
github.com

要点をまとめると
 ・オートシェイプが画像の輪郭ピクセルに相当する
  オートシェイプ、自由に足してよいです。そこがみそで
  点が持つ仮想線分のプロファイルがどう変わるかを体感できます
 ・すべてのオートシェイプ座標に対し2°分解能で仮想線分のρとθをセルにカウント(投票/Vote)
 ・セルには条件付き書式があり、値が大きいとオレンジになる
 ・オレンジに相当するρとθが、各点が共通して持つ線分である
 ・直線を具体的に求めたいなら、閾値を設けて閾値以上を直線と判定すればよい
  (閾値は当然画像中の点を越えることはない)
f:id:kt-marshal:20180515225332p:plain

●さいごに

計算量は点の数 * (180 / θ)くらいになるので
これを改善したのが「確率的ハフ変換」になります。
これはよくわかっていません。
ある点とある点を結べばその間にも点があるだろう、みたいな?
わかんね。


アディオス