我正在尝试使用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显示了不同的输出(与预期的输出匹配)。
答案 0 :(得分:1)
这是一个著名的主题-在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类型并正确镜像