お絵描きソフトInkscape(インクスケープ)の使い方を初級レベルから上級レベルまで広く紹介しています。
情報追加のリクエストや分かりにくい点があれば下のCONTACTフォームからどうぞ。

Inkscapeで使えるフィルタプリミティブ要素:feConvolveMatrix

 このページでは、Inkscapeのフィルタエディタ上ではコンボリューションマトリクスと表示されるフィルタプリミティブ要素を紹介します。

(2023.06.01更新)

 パラメータとして設定された行列(一般にカーネルと呼ばれる)を使って、畳み込みを実行します。Inkscapeのフィルタエディタ上ではと表示されます。

 畳み込みにともなう他のパラメータ(サイズターゲット除数バイアスエッジモードアルファを維持するか否か)も併せて指定します。

 このフィルタプリミティブ要素を使って畳み込みを行うと、ぼかしを入れたりエッジを強調したりする変換が可能になるそうです。(どんなパラメータを指定すればそうなるのか?というところが問題なのですが・・・)

どんな計算をしているのか?

 変換元の画像の各ピクセル値(R値G値B値A値)に順番に注目して、そのピクセルにカーネル(行列)を重ね、カーネルの各要素に重なっているピクセル(注目しているピクセルとその周囲のピクセル)の値とカーネルの要素の値との積和を求め、除数で割って、バイアスを加算して計算された値を、変換先の画像の同じ位置のピクセル値にします。

 画像の端っこのピクセルについては、その外側を決まったルール(エッジモード)に従った仮想的なピクセルを追加した上で計算します。

 言葉で書くと何だか難しいですが、多くの方が図を使って工夫した説明をしてくれているので、畳み込みの大まかな計算の流れを理解するには、そちらを読ませてもらったほうが早いです。(→ 一例:畳み込み演算と転置畳み込み演算を理解する

パラメータの意味

 feConvolveMatrixのパラメータの多くは、一般的な畳み込み演算に必須のパラメータというわけではないですが、SVGの標準仕様として決まっています。

 サイズは、カーネルの行数と列数です。

 ターゲットは、カーネルのどの位置を変換元のピクセルに重ねるかを指定するものです。ゼロ(X=0,Y=0)なら、カーネルの左上の要素を重ねた上で計算します。

 除数は、カーネルとピクセル値との積和を求めた後で、その計算値を割る値です。ゼロの場合は、カーネルの要素の合計値が使われ、その合計値もゼロの場合は「1.0」を使います。(なんかややこしい)

 バイアスは、積和を除数で割ったあとに加える値です。

 エッジモードは、画像の端のピクセルに対して積和を計算するときに、存在しない外側の部分を仮想的なピクセルを追加する、そのルール(モード)を指定するものです。

 アルファを維持するにチェックを入れると、R値G値B値だけを畳み込みの対象にして、A値(アルファ)については変換元の画像の各ピクセルのA値をそのまま踏襲することになります。

カーネル(核)の指定方法

 カーネルの行列の各要素の値は、フィルタエディタ上で直接入力します。

 次のように、行列の形で数値が並んだ状態で表示され、変更したい数値を2回クリックすると変更できるようになります。当然ですが、マイナスの値も入力可能です。

 ちなみに、上の例のようなカーネルの場合、注目しているピクセルと周囲のピクセルの値から単純に平均をとった値を変換後のピクセル値にすることになるので、次のようにピクセル1列分のぼかしが入ることになります。(左がフィルタ適用前、右がフィルタ適用後)


 上の例のカーネルは要素が対称に並んでいるので気にする必要はありませんが、要素が非対称に並んでいる次のようなカーネルの場合は注意が必要です。

 一般に、畳み込み演算は「後ろのデータ」から「前のデータ」の順に畳み込みを行うので(その理由はまた別のはなし)、画像に用いるカーネルの定義も、右下のピクセルに対応する値から左上のピクセルに対応する値に向けて並べるのが定番のようなのです。SVGの形式でもカーネルの要素はその順に並べるように決まっていて、Inkscapeのフィルタエディタでもその順に指定します。

 指定したカーネルを使って畳み込み演算を実行する際は、カーネルの行列を180度回転してから使うのだそうです。

 (参考:フィルタとは何か