このページでは、Inkscapeを使って線画イメージ画像をベクトル化(ベクタデータ化)する方法について考えてみたいと思います。

(2025.02.19更新)
手元にロゴやイラストのような線画イメージ画像(ビットマップ画像)があって、それをInkscapeで自由に編集できるように、ベクトル化したい(SVG形式のパスオブジェクトに変換したい)とします。

まず思いつくのは、ペンツールを使って、線の上をなぞるようにパスを描いていくことで、画像中の線と同じ形のパスを作る方法ですが、画像中に描かれている線が多い場合は手間がかかりすぎます。
そこでInkscapeのトレース機能を使って、画像中の線を自動的に抽出してパスオブジェクトを生成してもらおうと考えます。
「画像トレースのパラメータと手順」でも書いたように、Inkscapeのトレース機能ではいろんなパラメータを指定可能になっていますが、とりあえず「明るさの境界」モードに適当なパラメータを設定して実行すると、次のようになります。

元画像の青い線をなぞるように太いパスが生成されれば理想なのですが、青い線の「ふち」を辿ったようなパス(二重線みたいなパス)が生成されてしまいます。これは当たり前といえば当たり前で、Inkscapeのトレース機能は画像の中の色の境界を自動的に抽出するのが基本なので、青い線と水色の背景の境い目に沿ったパスになってしまうわけです。
トレース時のパラメータとして他のものを選んでも基本的にはこういうトレース結果になります。
ではどうしようもないのかというと、「中心線トレース」という特別なモードがあって、これは画像を分けている領域の真ん中の軸(中心線)に沿ったパスを生成してくれるモードなので、このモードを使えば青い線の真ん中を通るパスを生成してくれます。

といっても、何の修正も必要のない完璧なベクトルデータに変換してくれるというわけにもいきません。
実際にやってみました。中心線トレースモードでは次のようなパラメータ設定画面がダイアログに表示されます。

まず他と区別しやすいように、5つのパラメータを全部最小値にして実行してみます。

まあまあなパスが生成されているようにも見えますが、一部分を拡大してみると、カーブのところが角張ってしまったり、交点のところに隙間ができてしまったりしています。

他のパラメータも試してみました。

「フィルター反復」は画像の中の色の変化をなだらかにする処理のようで、おおざっぱな中心線になっています。「エラーしきい値」は本来の中心線から大きくズレることを許容する処理のようで、生成されたパスはなめらかに曲がったものになりますがやはりおおざっぱな中心線です。「角を平滑化」と「最適化」は、大きい値を設定してみても最初の最低値パラメータで実行したときの結果と変わりませんでした。「2つの画像を比較する」のページで書いた方法で確認してみましたが、最低値パラメータで実行したときから形は変わってませんでした。
結局、どのパラメータにも最低値を設定して実行した結果がいちばん線画のベクトル化の結果として良かったと思いますが、隙間や曲がり具合については最終的にノードツールで修正する必要がありそうです。手でトレースするよりはだいぶ手間が減ると思いますが。
色の境界の抽出処理について
中心線トレースには、もう1つ少し注意したほうがいいポイントがあると思います。
中心線トレース機能が中心線を求める前に、中心線を引く対象として色で区切られた領域(すなわち「線」に当たる領域)を抽出する必要があるわけですが、中心線トレース機能がどんな方法でそれを行っているのか分かっていません。「見た目に色がくっきり変化しているところを抽出しているのじゃないのか?」と思っていたら、実際にやってみるとそうでもありません。
例えば白い背景の上に次の左の例のようにぼやけた赤い線が縦に描かれている画像だとします。これに中心線トレースを実行すると、ぼやけている赤い部分のちょうど真ん中あたりに次の右の例のようにパスが生成されます。ちゃんと白い背景から赤い線の領域を抽出してその真ん中にパスを生成できているようです。

ところが、他の背景色でも同じようにやってみると、うまくいかない場合があります。

最後のもの(背景が濃い青)だけが画像中の「線」の抽出に失敗しました。それぞれのケースで何が違うのかを考えてみたら、どうも中心線トレースでは彩度の変化が境界線として抽出されているんじゃないかという気がします。最後のものは、赤と青で見た目に全然違う色に分かれているようですが、実は彩度は一緒なので境界線として扱ってもらえていないようです。
この点で、中心線トレースを実行する線画イメージがどんな配色になっているのか注意が必要で、場合によってはあらかじめ背景色をペイントツールなどで変更してから中心線トレースを実行する必要があるかもしれません。
地図でやってみた
試しに関東地方の簡単な地図画像で県の境界をパス化してみました。

元の画像がくっきりした白黒の線画なので、うまい具合にベクタデータ(パスオブジェクト)に変換できていると思います。
細かいところでは次のように少しパスのノードがごちゃついているところもありますが、元の画像とぴったり重なるようにノードツールでノードの位置を調整すれば簡単に治せます。
