私はエッジ検出器について自分自身に教えています。OpenCVを使用してfilter2D
、に似た独自の勾配計算機を実装しようとしていcv2.Sobel()
ます。OpenCVへのPythonインターフェースで、cv2.filter2D()
ユーザーがカスタムフィルターを使用して画像を畳み込むことができます。OpenCVの命名法では、このフィルターは「カーネル」と呼ばれます。
MITの歩行者データセットからの画像(per00001.png)を使用すると、妥当な外観の出力が生成されることがわかります。(コードは下にあり、出力画像はここにあります。)cv2.Sobel()
#OpenCV's Sobel code (outputs nice-looking gradient)
import cv2, numpy
img = cv2.imread("./per00001.png")
gradientX = cv2.Sobel(img, -1, 1, 0)
compression_params = [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 9]
cv2.imwrite("gradientX.png", gradientX, compression_params)
↑良い
↓壊れた
自分のSobel()
ようなコード(以下)を実装しようとすると、真っ黒な画像が表示されます。horizontalSobelMtx
問題は、渡したカーネルパラメータ()のデータ型にあると推測していますcv2.filter2D()
。ただし、のカーネルデータ型に関するドキュメントは見つかりませんでしたcv2.filter2D()
。
#Custom Sobel code (outputs all-black image)
import cv2, numpy
img = cv2.imread("./per00001.png")
horizontalSobelMtx = [[-1,0,1],[-2,0,2],[-1,0,1]]
horizontalSobelMtx = numpy.asanyarray(horizontalSobelMtx) #guessing about appropriate datatype.
gradientX_customSobel = cv2.filter2D(img, -1, horizontalSobelMtx)
compression_params = [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 9]
cv2.imwrite("gradientX_customSobel.png", gradientX_customSobel, compression_params)
だから、ここに私の質問があります:
1)パラメータcv2.filter2D(..., kernel, ...)
にどのようなデータ型が必要ですか?kernel
2)kernel
ここでのデータ型に問題がない場合、カスタムSobelコードが空白の画像を出力する原因は何ですか?