詳細にコードを見てみる:
kernel = np.zeros((2*radius+1, 2*radius+1))
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
最初のライン:いずれかの側の中心点と
kernel = np.zeros((2*radius+1, 2*radius+1))
がゼロの2次元配列を作成し、「半径」ポイント。半径= 2の場合は、あなたが得るでしょう:
# __r__ +1 __r__
[ 0, 0, 0, 0, 0, ] #\
[ 0, 0, 0, 0, 0, ] #_} r
[ 0, 0, 0, 0, 0, ] # +1
[ 0, 0, 0, 0, 0, ] #\
[ 0, 0, 0, 0, 0, ] #_} r
次に、あなたはnumpy.ogrid
によって作成されたオープンメッシュグリッドから2つの配列を取得します。メッシュグリッドは、そのセルの位置で特定のセルのx座標またはy座標を保持する「並列」配列または行列を格納することを含むnumpyの「トリック」です。
例えば、y
-meshグリッドは次のようになります。
[ 0, 0, 0, 0, 0, ]
[ 1, 1, 1, 1, 1, ]
[ 2, 2, 2, 2, 2, ]
[ 3, 3, 3, 3, 3, ]
[ 4, 4, 4, 4, 4, ]
そしてx
-meshグリッドは次のようになります。あなたがそれらを見れば
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
[ 0, 1, 2, 3, 4, ]
、あなたを」 Y_grid[x][y] == y
とX_grid[x][y] == x
は非常に便利なので、それをサポートするnumpy関数が複数あることに気づくでしょう。 ;-)
オープンメッシュグリッドは、「1次元」のみを有することを除いて、閉じたものと似ています。つまり、(例えば)5x5アレイのペアの代わりに、1x5アレイと5x1アレイが得られます。それはogrid
の機能です - 開いている2つのグリッドを返します。値は(除外された半径+ 1を意味する)Pythonのルールによれば、+ 1を半径と-radiusからのものである:
y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
そこでYは、例えばから格納numpyのアレイある-2..2 (両端を含む)であり、xは-2.2(両端を含む)の配列である。次のステップでは、ブール値マスクを作成します。つまり、ブール値でいっぱいの配列です。ご存じのように、numpy配列で操作すると、別のnumpy配列が得られます。そう定数式で二つの配列が関与する別の配列を生成する:
mask = x**2 + y**2 <= radius**2
マスクの値は、一つの色が「真」であり、他の色が「Falseの2色ビットマップ、になるだろう。 "ビットマップには、円またはディスクが描かれます。 (<=
の関係のため、xとyには0..4ではなく-2..2が含まれていることに注意してください。)
最後に、あなたはマスクが「真」であるときは常にものにゼロを設定し、ゼロのkernel
配列()上のオーバーレイとしてマスキングアレイを用いてintにBoolean型から変換する:
kernel[mask] = 1
この時点で、カーネルは次のようになります:
# __r__ +1 __r__
[ 0, 0, 1, 0, 0, ] #\
[ 0, 1, 1, 1, 0, ] #_} r
[ 1, 1, 1, 1, 1, ] # +1
[ 0, 1, 1, 1, 0, ] #\
[ 0, 0, 1, 0, 0, ] #_} r
マスクは画像内で変更されない領域を識別すると言います。しかし、画像を変更するフィルターのポイントではありませんか?それとも、元の画像そのものではなく、画像のコピーであると言っていますか?それはフィルタによって変更されていますか? – Jim421616
マスクは画像内で変更されない領域を識別します。それを保護するために顔のマスクのように、マスクは元のデータが変更されるのを「保護」しています。これにより、画像の他の部分はフィルタリングされたままになります。イメージのマスクされた部分は、 'kernel' meshgridに1の座標で示されます。露出部分は0の座標を持ちます。 –
ああ、私は0と1をマスキングしていました!私の間違い。ありがとう:) – Jim421616