コンボリューション行列の仕組みを教えてください。
-
19-09-2019 - |
質問
私は、これはプログラミングに非常に関連していないけど、私はコンボリューション行列は、PHPのGDの機能のためにどのように動作するかを知っておく必要があります。私はGoogleで多くのことを検索しましたが、それをうまく説明して何かを見つけることができません。
解決
私は、ここでは、コンボリューションフィルタの背後にある理論の負荷に行ってきました。
<のhref = "https://stackoverflow.com/questions/1696113/how-do-i-gaussian-blur-an-image-without-using-any-in-built-gaussian-functions/1696200#私は、内蔵ガウス関数を使用せずに画像をぼかすガウスはどうすればよい1696200" >?の
他のヒント
動作は重みが行列によって与えられるその周囲画素の加重平均と各画素を置き換えます。ここでは例のコンボリューション行列があります:
1 1 1
1 1 1
1 1 1
これがないと、その画素を中心とする3×3ブロックの平均値と各ピクセルを置き換えるあります。ここでは別のです。
0 0 0
0 1 0
0 0 0
この行列は何もしません、それはあなたの元バックを与えます。
重みがあまりにも、否定することができます。この行列は、次の画素への画素の平均値を減算します:
0 -1 0
-1 4 -1
0 -1 0
コンボリューション行列を使用すると、効果をぼかしとシャープに微調整でくださいすることができます。あなたは、チューニングの方向性と、それは十分な大きさだ場合、コンボリューション行列を使用して、フィルタの周波数応答をすることができます。しかし、それは通常、間に合わせのn-ボケとシャープのために使われてます。
私はPHPのために特別にわからないが、一般的に畳み込み行列は、画像処理の効果の特定の種類を実装するために使用されます。
GD HTTP上でPHPマニュアルから取られた簡単な例:// WWW .php.net /マニュアル/ EN / function.imageconvolution.phpする
ます:あなたが持っているとしましょう。このようなマトリックスます:
$M = array(array( 2, 0, 0),
array( 0, -1, 0),
array( 0, 0, -1));
は、画像への畳み込み行列を適用すると、その画像内の(x、y)に位置する画素毎に、出力に対応する画素となる
$I = $in_image;
$out_image[x,y] = $I[x-1,y-1]*$M[0][0] + $I[x,y-1]*$M[0][1] + $I[x+1,y-1]*$M[0][2]
+ $I[x-1,y] *$M[1][0] + $I[x,y] *$M[1][1] + $I[x+1,y] *$M[1][2]
+ $I[x-1,y+1]*$M[2][0] + $I[x,y+1]*$M[2][1] + $I[x+1,y+1]*$M[2][2];
言い換えれば、畳み込み行列は、ソース画素とその周囲画素の線形結合として、各結果のピクセルを計算するために使用されます。
除数パラメータが何かによって、全体の結果を分割するために使用される(これは通常、マトリックスのすべての値の和である)およびオフセットされ、最終的な出力値に定数項を追加するために使用されます。