cv2 Sobel 显示与示例不同的图像

cv2 Sobel showing a different image than example

我正在尝试使用 cv2 文档来理解 Sobel 运算符 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_gradients/py_gradients.html

为了简单起见,我将示例缩减为基本内容。

img = cv2.imread("dave.jpg", cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)

问题出在给定的原始图像 (dave.jpg) 上,我的输出是

与示例相去甚远。这里会发生什么?

如果我复制粘贴示例,并使用 matplotlib 显示图像,则结果更接近文档中给出的结果。

编辑 - imwrite 显示了不同的输出(与预期输出匹配)。

这是著名的主题——在 OpenCV 上混合数据类型。

如果你看一下 OpenCV 教程中的 SobelDemo,你可以找到额外的功能:

//![convert]
// converting back to CV_8U
convertScaleAbs(grad_x, abs_grad_x);
convertScaleAbs(grad_y, abs_grad_y);
//![convert]

https://github.com/opencv/opencv/blob/master/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp#L57

如果您想使用 cv2.imshow,您可以尝试将您的图像转换为 CV_8U 类型(许多方法)或立即使用 CV_8U 如果它适合您的任务:

img = cv2.imread("dave.jpg", cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize=5)

P.S。 pyplot 支持 CV_64F 正确输入和成像