4

Pythonで3Dソーベルフィルターを計算しようとしています。私は以下の2D画像のためのかなり良いコードを持っています。

ところで。私の元の画像はuint8タイプです。

    preSobel = preSobel.astype('int32')
    dx = ndimage.sobel(preSobel, 0)  # horizontal derivative
    dy = ndimage.sobel(preSobel, 1)  # vertical derivative
    mag = numpy.hypot(dx, dy)  # magnitude
    mag *= 255.0 / numpy.max(mag)  # normalize (Q&D)
    img[i,:,:]=mag

しかし、2dを計算するためのwikiページの私の理解から、私はhypot:confusedではなく1dsobelの結果を乗算する必要がありました

とにかく、3dに移動するには、各軸で1d sobelを計算してからすべてを乗算する必要があると思いますが、よくわかりません... 3d sobelをより速く計算するライブラリはありますか?

4

1 に答える 1

5

まず、ウィキペディアのリンクを参照してください。乗算は、最終結果ではなく、ソーベル畳み込みカーネルを構築する方法を指しています。

2D ソーベル フィルターの場合、x 方向の導関数を取得するカーネルと、Y 方向の導関数を取得する別のカーネルが必要です。 ここに画像の説明を入力

これは基本的に 2 つのコマンドが行うことなので、numpy を使用している場合は、これらのカーネルを自分で構築する必要はありません。

dx = ndimage.sobel(preSobel, 0)  # horizontal derivative
dy = ndimage.sobel(preSobel, 1)  # vertical derivative

3D の場合、dx、dy、dz 用の 3 つのカーネルで 3 つの操作が必要です。リンクされた wiki セクションでは、コンポーネントを掛け合わせてカーネルを構築する方法を説明しています。たとえば、dZ の完成したソーベル カーネルは、次のような 3x3x3 行列です。

ここに画像の説明を入力

マグニチュードを取得するには、その後、2 乗導関数 (斜辺) の平方根を取得する必要があります。

私は numpy を持っていませんが、ドキュメントからわかる限り、ndimage sobel コマンドは任意の数の次元を処理できるため、カーネルは既に提供されています。

dx = ndimage.sobel(your3Dmatrix, 0)  # x derivative
dy = ndimage.sobel(your3Dmatrix, 1)  # y derivative
dz = ndimage.sobel(your3Dmatrix, 2)  # z derivative

現在、 hypotenuse コマンドはおそらく 2 つのパラメーターしかとらないため、効率的に mag = sqrt(dx dx + dy dy + dz*dz)を計算する別の方法を見つける必要があります。しかし、NumPy にはそのために必要なものがすべて揃っているはずです。


アップデート

実際、とにかく大きさだけに興味がある場合は、numpy にこのための完全な関数があります

 mag = generic_gradient_magnitude(your3Dmatrix, sobel)
于 2012-06-29T20:11:46.900 に答える