OpenCV のFilter2Dについて (任意の畳み込みフィルタ)

2021年3月12日

はじめに

OpenCV のFilter2Dを使った処理ついて調べたことをまとめた。

とりあえず関数を試してみたい方

実験用プログラム OpenCV_test の GitHubリポジトリ
URL
https://github.com/iryachi/OpenCV_test
実行ファイルだけ
https://github.com/iryachi/OpenCV_test/releases
使い方
https://iryachi.stars.ne.jp/opencv_test_imple/

Filter2Dについて

いろいろな畳み込みフィルタの基本になる関数。
この関数のパラメータによっていろいろな畳み込みフィルタを実現できる。 (meaning, laplacian, blurなど)
畳み込みフィルタについては以下
https://iryachi.stars.ne.jp/convolution-filter/

filter2D関数について

void cv::filter2D  (InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT
)

引数

srcInputArray入力画像グレースケールの画像
dstOutputArray出力画像グレースケールの画像 フォーマットはddepth による。
ddepthint出力画像深度出力画像のビット深度。
負数の場合、入力と同じビット深度。 CV_8U C, V_16S, CV_32F, CV_64Fなど
kernelInputArrayカーネル浮動小数点型行列 この値がそれぞれの画素にかけられる。
anchorPointカーネルアンカーカーネル内のフィルタ対象点(注目画素)の相対位置を表す (-1, -1) はカーネルの中心
deltadouble加算係数フィルタ結果に足される値
borderTypeint境界外処理方法cv::BorderTypes
画面 もしくは roi の境界処理をどうするか。(後述)

パラメータ anchor について

anchor ポイント (1,2) とした時

パラメータ delta について

上記 anchor ポイントの例を使うと、
計算結果 274 に delta を足したものが出力イメージに入ることになる。
全体の底上げをする感じ。

パラメータ borderType について

出力イメージで計算されていない部分(グレーの部分)をどうするかという設定。

表のようなパラメータが用意されている。

BORDER_DEFAULT画像境界で反射。
BORDER_CONSTANTある一定値を使用。
BORDER_REPLICATE境界の値を使用。
BORDER_REFLECTBORDER_DEFAULT 同様
BORDER_REFLECT_101BORDER_DEFAULT 同様
BORDER_REFLECT101BORDER_DEFAULT 同様
BORDER_TRANSPARENT元画像を変更しない
BORDER_WRAP画像自身を繰り返し
BORDER_ISOLATED何もしない。

終わりに

Filter2D はいろんなフィルタ(平滑化, エッジ検出など)の基本となっている関数で、係数などが決まっている時は他の関数使ったほうがやりやすい。
フィルタの中身を勉強するにはよいかな。