平滑化フィルタの端点の扱いについて

※この記事は解答を提示するものではありません

CV100本ノックのQ11平滑化フィルタをやってる際に端点の扱いが気になったので調べた。

平滑化フィルタはフィルタ内の画素を平均するのだが、ゼロパディングをしてフィルタをかけると画像の端点は計算の中に0が含まれ、厳密に平均とは言えなくなる。

軽く調べてみたのだが、これは気にされてる問題ではないらしく、当該100本ノックの解答としても何も気にせずゼロパディングしている。(もちろん、何の根拠にもならないが)

端の1ピクセルの計算が少し違うことは大ごとではないのだろうか。下のヤモリの画像に実際にゼロパディングして3x3の平滑化フィルタをかけた結果は以下のようになる。

f:id:timtoronto634:20200604121506p:plain
元画像(左)とゼロパディングしてkernel_size=3の平滑化フィルタをかけた画像(右)の比較

言われれば淵が少し黒い気もしなくはないが、言われなければ違和感はない。

パディングしたピクセルを計算に含まないようにして平滑化フィルタを実装した結果を以下に示す(例えば角の点は4ピクセルの平均)。

f:id:timtoronto634:20200604114918p:plain
元画像(左)とkernel_size=3の平滑化フィルタをかけた画像(右)の比較

淵の黒さはなくなっているが、端点であるかの判断を行う計算をするくらいならいっそ無視してしまうのも理解できる。

きになるならreflection paddingすれば影響はかなり軽くなるし、 フィルタサイズが大きくなればパディングしたピクセルが計算に及ぼす影響はさらに小さくなるし、気にしすぎだったと納得しておく。

調べてる途中でMATLABの実装がでてきたが、ここではフィルタが端点にかかる場合にはそこを計算から除外している。ただし、Because of the way smooth handles endpoints, the result differs from the result returned by the filter function. とあるように、端点の扱いについては厳密さ次第という感じもある。 Smooth response data - MATLAB smooth - MathWorks