首页 > 解决方案 > cv2 Sobel 显示的图像与示例不同

问题描述

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

为了简单起见,我将示例缩减为要点,这就是。

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

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

戴夫的索贝尔

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

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

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

在此处输入图像描述

标签: cv2

解决方案


这是著名的主题——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)

PS pyplot 支持 CV_64F 类型并正确成像


推荐阅读