「note」に引っ越し中です。移動したページごとに移動先へのリンクを作っていく予定です。

Inkscapeでビットマップ画像をベクタデータ化する

 このページでは、線画やロゴなどのビットマップ画像をInkscapeで編集できるように、Inkscapeにインポートして(読み込んで)その中の境界線をトレースすることでベクタデータ化する方法についてまとめてみたいと思います。

(2024.06.24更新)

 (参考:線画イメージをベクタデータ化する

 ビットマップ画像(ラスター画像ともいう)はInkscapeでは直接編集することができない(Inkscapeとは別のソフトを連動させて編集することはできる)ので、例えばペイント系ツールで作ったイラスト画像やロゴ画像をInkscapeを使ってシェイプやパスのように編集できるようにしたいときは「トレース機能」を使ってビットマップ画像の中の境界線(エッジ)を自動的に抽出してパスオブジェクトに変換するのが手っ取り早いです。

 ただ、Inkscapeの「トレース機能」ではビットマップ画像のエッジを正確に抽出することは難しいです。目に見えるエッジとトレースの結果生成されるパスとの間にはどうしてもズレができてしまいます。Inkscapeが悪いわけではなくて、トレース技術の限界なんだろうと思いますが。

 とはいえ元の絵図にできるだけ近いパスに変換するコツがないでもないと思います。

 まずトレースを「マルチカラー」の「色」検出モードで実行します。

 「マルチカラー」の「色」検出モードで実行すると見た目の色が変化する境界線を他のトレースパラメータよりも抽出しやすいように思います。他のパラメータだと見た目の色と関係ない境界線も抽出してしまいがちです。

 そして「角を平滑化」を少しプラスにし、「最適化」も大きくします。

 「最適化」を大きくすると生成されるパスがシンプルな構造になる(セグメントの数が少なくなる)ので生成後に編集するのが楽になります。

 ただし「角を平滑化」をゼロにしてしまうと抽出したエッジがなめらかに曲がらないものになってそのあと「最適化」を行ってもセグメントを減らす効果が出なくなります。

 そのため「角を平滑化」は少し大きい値にしておくほうが良いです。あまり大きくすると角のところが丸まってしまうのでそこは試してみて調節する必要がありそうです。

 「積み重ね」もチェックを入れておいたほうがいいと思います。「積み重ね」にチェックを入れないでトレースすると地図のように塗り分けるパスが生成されますが、エッジのところの隙間が目立つようになってしまい、後で編集するときの手間が増えます。

 また、トレース対象とするビットマップ画像ファイルをInkscapeにインポートするとき、できるだけ解像度の高い(ピクセル数の多い)画像ファイルを使います。解像度が高いとトレースも細かい色の変化を抽出しやすくなるからだと思います。紙に描かれた絵図をスキャンしてInkscapeに取り込むような場合も、スキャン時に高い解像度で行うほうが良いです。

 高解像度のビットマップ画像ファイルをInkscapeにインポートするとインポート直後は当然ビットマップオブジェクトとしても幅/高さの大きいものになってしまいますが、その後オブジェクトを縮小しても内部のデータは高解像度のままなので、よりよいトレース結果になります。

 例えば次のように低い解像度のファイル(左)と高い解像度のファイル(右)をインポートして、ビットマップオブジェクトの大きさをキャンバス上で揃えたとしても、右のオブジェクトの内部データのほうが大きい(高解像度)のままです。

 この例で実際にトレースを実行してみました。ちなみに低解像度のほうは「300x300ピクセル」ぐらい、高解像度のほうは「3000x3000ピクセル」ぐらいです。

 左の低い解像度の場合、ズームインしてみると角のところが丸いパスになってしまっていることが分かります。

 一方、右の高い解像度の場合、同じトレースパラメータでトレースを実行すると、そんなに違いが出ていないように見えますが・・・

 ズームインすると角のところがきれいにトレースできていることが分かります。

 さらに、トレース結果が元のビットマップ画像とどれぐらい合致しているのかを「2つの画像を比較する」に書いた方法でチェックしてみました。

 まず低解像度のほうですが、次のようにトレースした結果のパスは少しズレていることが分かります。

 高解像度のほうは大きなズレはないようです。

 ところで、トレースした結果生成されるパスオブジェクトは画像の中の境界線以外にもう1本だけ、画像それ自体の枠の部分も長方形のパスオブジェクトになっています。色を付けると次のようになります。

 この枠にあたるパスはほとんどの場合不要なので、その場合は削除します。

 枠にあたるパスはそれ以外の境界線にあたるパス群と自動的にオブジェクトグループ化されていますが、グループを解除すれば簡単に削除できます。

 もっと線画っぽいビットマップ画像を線に沿ったパスにベクタデータ化する方法については「線画イメージをベクタデータ化する」のほうに書いてみました。