画像を元にPythonでドロネー図

先日、Visualizationの勉強会があって、そこでPythonを使ってドロネー図を書いた見た、というのを発表したのでそのログ。

ドロネー図って?

ドロネー図とはwikipediaによると

ドロネー図(ドロネーず、英語:Delaunay diagram)あるいはドロネー三角形分割(ドロネーさんかっけいぶんかつ、триангуляция Делоне, Delaunay triangulation)は、距離空間内に離散的に分布した点の集合に対し得られる、それらをある方法に従い辺で結んだ図形である。

Delaunay

作成されるすべての三角形ができるだけ正三角形に近くなるように描画をします。描画方法とかは、このスライドがわかりやすいです。

どうやって書くの?

今回はpythonで実装しました。丁度仕事で、簡単にトラスが作れないかな(例えば画像をインプットとかにして)という話をしていたので、今回は画像をインプットにドロネー図を書くという仕様にしてみました。

ゆるっとした解説

肝心のドロネー三角形分割自体は、Delaunayモジュールが全部やってくれます。そのため、必要となるのは画像から点群を生成して、Delaunayモジュールに渡してあげる部分です。今回は、点群を生成するために画像の明度を使用しています。(明度が高いところは点がまばらに、明度が低いところは点の密度が高くなる)

点の描画位置の決め方は、各画素の明度を加算し、その合計が予め決められた閾値をこえたら点を打つ、という実装です。この閾値は、コマンド実行時のパラメータとして渡すことが出来ます。

動かしてみた結果

元画像

face

生成画像

下にいくに従って、点がまばらになります。今回は元画像が白黒にしてもわりと面白い画像だったので、ドロネー図にしても形状がだいたいわかる感じにはなりました。他のサンプル(風景画とか)も試したけど、あんまりおもしろくならなかった。

face_255face_2550face_10000face_25500face_255000face_2550000face_5000000