OpenCVfilter2dは間違った結果を出します

ジェスパー

現在、自分で作成したラプラシアンカーネルで画像をフィルタリングしようとしています。ただし、このカーネルで入力画像をフィルタリングすると、SciPyでの実装と比較して予期しない結果が生じます。

私が構築したラプラシアンカーネルは、次の画像で確認する必要があります

1D 2D

画像をフィルタリングするためのコード:

im = cv2.imread("test.png",0)
im = im.astype(np.float32)

def lkern(t=1.):
    ax = np.arange(np.round(-5*np.sqrt(t),0),np.round(5*np.sqrt(t),0)+1)
    xx, yy = np.meshgrid(ax, ax)

    kernel = -1/(np.sqrt(2*np.pi*t)*t)*np.exp(-(xx**2+yy**2)/(2*t))+
        (xx**2+yy**2)/(np.sqrt(2*np.pi*t)*t**2)*np.exp(-(xx**2+yy**2)/(2*t))


    return kernel.astype(np.float)

t = 25**2/2
l = lkern(t)

L = cv2.filter2D(im/255,-1,l)

plt.figure()
plt.imshow(L,cmap="gray")
plt.show()

その結果、

解像度

SciPyと比較するとndimage.gaussian_laplace、結果は次のようになっているはずです。

scipy

これは非常に異なり、これを適切に行う方法がわかりません。

クリス・ルエンゴ

The code in the OP seems to take the equation for a 1D Laplace of Gaussian and use that to construct a 2D radially symmetric function. That is, along any of the diameters of the kernel the function looks like a 1D Laplace of Gaussian. This is not the correct way to create a 2D Laplace of Gaussian.

The Laplace of Gaussian is defined as the sum of the second order derivative of the Gaussian kernel along each of the axes. That is,

LoG = d²/dx² G + d²/dy² G

With G the Gaussian kernel.

With Numpy, you can construct this kernel as follows. I'm using the separability of the Gaussian to reduce the computational complexity.

s = 5;
x = np.arange(np.floor(-4*s),np.ceil(4*s)+1)
g = 1/(np.sqrt(2*np.pi)*s)*np.exp(-x**2/(2*s**2))
d2g = (x**2 - s**2)/(s**4) * g
log = g * d2g[:,None] + g[:,None] * d2g

Tricks here: g and d2g are 1D functions. g[:,None] turns the 1D function on its side, so that the multiplication causes broadcasting, leading to a 2D output.

I have written the kernel this way, rather than expressing the full 2D equation in one go, because this leads to large efficiencies in your code: The convolution of an image f with the kernel log can be written as:

conv(f, log) = conv(f, g * d2g[:,None] + g[:,None] * d2g)
             = conv(conv(f, g), d2g[:,None]) + conv(conv(f, g[:,None]), d2g)

That is, instead of one convolution with a large 2D kernel, we compute 4 convolutions with relatively small 1D kernels. Note that the actual order here does not matter:

  • One applies a 1D kernel g and on the result a 1D kernel d2g along the other axis. These two operations can be reversed.
  • Then one repeats this process changing the axes along which each of the operations is applied.
  • Finally one adds the two results.

cv2.filter2D私が書いconv場所で使用しても問題ありconvません畳み込み関数を示すだけfilter2Dですが、カーネルがすべて対称であるため、のような相関関数は問題ありません。)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MySQL移動平均は間違った結果を出します

分類Dev

Math.cos()は間違った結果を出します

分類Dev

TOSVersionは間違った結果を出します

分類Dev

Math.powは間違った結果を出します

分類Dev

base64は間違った結果を出します

分類Dev

MySQLクエリは間違った結果を出します

分類Dev

php max()関数は間違った結果を出します

分類Dev

Java Stream.sorted()は間違った結果を出します

分類Dev

Scipyは行列乗算に対して間違った結果を出します

分類Dev

date-fns-timezone間違った結果を出しますか?

分類Dev

PythonのLinearRegressionが間違った結果を出しますか?

分類Dev

opencvpythonの輪郭近似は毎回間違った結果を出します

分類Dev

pandas str.contains()は間違った結果を出しますか?

分類Dev

GROUP BYMONTHは間違った結果をもたらします

分類Dev

Timedelta操作は間違った結果をもたらします

分類Dev

File.isFileは()間違った結果を返しますか?

分類Dev

listviewonClickは間違った結果を返します

分類Dev

DATEのOracleSQL比較は間違った結果を返します

分類Dev

集計+平均は間違った結果を返します

分類Dev

set_unionを2回呼び出すと、間違った結果になりました

分類Dev

Eigen LLTモジュールが間違った結果を出しますか?

分類Dev

Hibernateは間違った結果セットを返し、間違ったクエリを生成します

分類Dev

hql 'または'を使用した間違った結果

分類Dev

scipy.integrate.quadは広い範囲で間違った結果を出します

分類Dev

私のUDPチェックサム計算は毎回間違った結果を出します

分類Dev

Pythonはtimedeltaデータの.seconds属性で間違った結果を出します

分類Dev

pairwise.wilcox.testは(私が思うに)間違った結果を出します

分類Dev

Swift-二次方程式ソルバーは間違った結果を出しますか?

分類Dev

LOCALDATEマイナス期間は、間違った結果を取得します

Related 関連記事

  1. 1

    MySQL移動平均は間違った結果を出します

  2. 2

    Math.cos()は間違った結果を出します

  3. 3

    TOSVersionは間違った結果を出します

  4. 4

    Math.powは間違った結果を出します

  5. 5

    base64は間違った結果を出します

  6. 6

    MySQLクエリは間違った結果を出します

  7. 7

    php max()関数は間違った結果を出します

  8. 8

    Java Stream.sorted()は間違った結果を出します

  9. 9

    Scipyは行列乗算に対して間違った結果を出します

  10. 10

    date-fns-timezone間違った結果を出しますか?

  11. 11

    PythonのLinearRegressionが間違った結果を出しますか?

  12. 12

    opencvpythonの輪郭近似は毎回間違った結果を出します

  13. 13

    pandas str.contains()は間違った結果を出しますか?

  14. 14

    GROUP BYMONTHは間違った結果をもたらします

  15. 15

    Timedelta操作は間違った結果をもたらします

  16. 16

    File.isFileは()間違った結果を返しますか?

  17. 17

    listviewonClickは間違った結果を返します

  18. 18

    DATEのOracleSQL比較は間違った結果を返します

  19. 19

    集計+平均は間違った結果を返します

  20. 20

    set_unionを2回呼び出すと、間違った結果になりました

  21. 21

    Eigen LLTモジュールが間違った結果を出しますか?

  22. 22

    Hibernateは間違った結果セットを返し、間違ったクエリを生成します

  23. 23

    hql 'または'を使用した間違った結果

  24. 24

    scipy.integrate.quadは広い範囲で間違った結果を出します

  25. 25

    私のUDPチェックサム計算は毎回間違った結果を出します

  26. 26

    Pythonはtimedeltaデータの.seconds属性で間違った結果を出します

  27. 27

    pairwise.wilcox.testは(私が思うに)間違った結果を出します

  28. 28

    Swift-二次方程式ソルバーは間違った結果を出しますか?

  29. 29

    LOCALDATEマイナス期間は、間違った結果を取得します

ホットタグ

アーカイブ