2017. 8. 21.
石立 喬
Visual C#とWin2DによるUWPでの画像処理(3)
――― ConvolveMatrixEffectクラスで、平滑化、鮮鋭化、エッジ検出を行う ―――
Win2Dの画像処理用クラスのうち、周辺ピクセルとのコンボリューション(畳み込み演算)を行うConvolveMatrixEffectクラスを用いて、平滑化、鮮鋭化、エッジ検出を行った。カーネルと呼ばれるマトリックスを直接指定することにより、GaussianBlurEffect、SharpenEffect、EdgeDetectionEffectの各専用クラスと同様な効果が得られる。原理が分かり易く、数値的に効果を調整できる。
コンボリューションによる画像処理
コンボリューション(convolution、畳み込み演算)とは、注目するピクセルとその周辺ピクセルに対して、カーネル(kernel、核)と呼ばれるマトリックスとの間で積和演算を行って処理後のピクセル値を求めるもので、応用例としては、平滑化、鮮鋭化、エッジ検出などがある。この詳細は、すでに「Visual C++ 2010 Expressを用いた易しい画像処理(5)-コンボリューションを用いた画像の平滑化、鮮鋭化、エッジ検出ー」で説明してある。
ここでは、Win2DのConvolveMatrixEffectクラスが、この目的で用意されているので、その使用方法を紹介する。
◎ConvolveMatrixEffectクラス
Kernelと呼ぶ二次元のマトリックス(デフォルトは3x3)を与えて積和演算を行う。主なプロパティは、
BorderMode ----- 出力を原画像のサイズに合わせるHard、周辺を含めるSoftがあり、デフォルトはSoft
ClampOutput ---- 出力を0~1の範囲に抑えるtrue、制限しないfalse、デフォルトはfalse
Divisor --------- カーネル演算後にこの値で割る、float型
KernelHight ------カーネルの高さ、デフォルトは3、int型
KernelMatrix ----- 一次元配列化した二次元カーネルマトリックス、float型
KernelWidth ------ カーネルの幅、デフォルトは3、int型
PreserveAlpha ---- アルファ(A、不透明度)を除いてRGBのみをカーネル演算するtrue、除かないfalse、デフォルトはfalse
Source --------- IGraphicsEffectSource型
ConvolveMatrixEffectクラスのKernelMatrixプロパティである一次元配列(二次元配列を一次元化したもの)を変えることにより色々な画像処理ができる。
PreserveAlphaプロパティは、カーネルによる積和演算をさせないために使用する。カーネルの各要素の合計が1の時は、アルファに影響を与えないので、デフォルトのままでも良いが、異なる場合、例えば0、これをtrueに設定しないと、不透明度がゼロになり、画像が消えてしまう。
プログラム
図1は、Canvas上に描画される各Effectクラスをグローバルに宣言する部分とタイトルの設定などで、従来と特に変わらない。図2は原画像の読込みと平滑化のためのconvEffect1の設定で、実際は、平滑化と言うよりは平均化である。ガウスぼかし(GaussianBlur)に比べてカーネルの設定が簡単であるが、ボケの度合いがやや強く、ボケ味が汚いとの意見もある。BorderModeをHardにして、周辺部のボケを防止している。
図3は鮮鋭化のためのconvEffect2の設定で、アンシャープ(unsharp、シャープで無くした画像との差分を強調する原理による、文末の参考資料を参照されたい)カーネルを使用している。
図4はエッジ検出で、水平方向の正エッジ(暗→明)、負エッジ(明→暗)、垂直方向の正および負エッジをSobelタイプのカーネルの1
/ 2(検出感度を抑制するため)で求め、それらをCompositeEffectクラスを用いて加算し(単純な加算ではなく、Unionと呼ばれる結合)、最終的に反転している。
◎CompositeEffectクラス
複数の画像を加算するのに使用する。主なプロパティは、
Mode ------ CanvasComposite列挙子で、数多くあるうち、Addを使う
Sources ---- IList<IGraphicsEffectSource>インターフェイスのうち、ここで使うのはAdd(IGraphicsEffectSource)メソッド
図5はCanvasに画像処理結果を表示するためのメソッドで、文字列を表示させるためのFontSizeの設定とDrawTextメソッドが含まれている。
図1 グローバルクラスの宣言とタイトルの設定など
図2 原画像の読込みと平滑化のためのconvEffect1の設定
図3 鮮鋭化のためのconvEffect2の設定


図4 エッジ検出のための一連の処理(方向別、極性別の検出、加算、反転)
図5 画像と文字列の表示
得られた結果
図6と図7は得られた結果である。各専用Effectクラスを用いた場合と差はない(設定値により効果の強弱は調節できる)。
図6 前稿で使用した原画像による結果
図7 別の原画像でも確認した結果
参考文献
石立 喬、「コンボリューションを用いた画像の平滑化、鮮鋭化、エッジ検出」http://codezine.jp/article/deatail/129
「Visual C++の勉強部屋」(目次)へ