2値画像をベクター画像に変換

2値画像をベクター画像に変換する必要があったので色々調査。

Illustratorで簡単にできが、プログラムの中で処理をしたかったので一旦違う方法で攻めます。

Potrace

Peter Selinger: Potrace

Potraceを使えば任意のフォーマットのベクター画像に変換できます。書き出しはpdf, svg, postscript, eps, dxfなど色々。 ただし入力はpnm (pbm, pgm, ppm), bmpのみ。jpegとかpngを変換しようとしてる場合はこのフォーマットにしておく必要があります。

公式サイトにバイナリファイルが置かれてるのでこれをダウンロードすればそのままコマンドラインから使えます。

SVGファイルを出力するコマンド

potrace -s [filename]

実行例 f:id:l94q:20150908010249j:plain

ビットマップ画像

f:id:l94q:20150908010424p:plain

SVG画像(SVGの表示できなかったので、ここで表示してるのはPNG

Autotrace

AutoTrace

今回ベクトル化したかったのは文字のストロークだったので、アウトラインをベクトル化するPotraceは使えなかったので他のを調査。 Autotraceだと中心線をベクトル化してくれるので、文字とかサインをベクトル化したい場合に便利。

公式サイトからはダウンロードできなくなってるのでHomebrewでインストール。

brew install autotrace

使い方

autotrace -centerline -color-count 2 -output-file output.svg -output-format SVG input.bmp

-centerlineのオプションつけることで中心線をベクトル化してくれる。

実行例

f:id:l94q:20150908011611j:plain

ラリーページのサイン(ビットマップ画像)

f:id:l94q:20150908011638p:plain

SVG画像

所感

本当は文字のベクトル化を自分で細線化→ベクトル化のコードを加工としていたのだけど、アルゴリズムが想像以上に複雑で躓いてました。実際こういうツールがあるのだから、全部自分でやるというのは無駄なことと考えたほうがいいと感じました。時間も限られてるしね。 既存にあるツールで使えるものはどんどん使って、空いた時間で自分の伸ばすべきスキルを伸ばすのがいいと感じました。