【发布时间】:2020-03-09 08:29:41
【问题描述】:
我正在尝试经过一些处理后绘制图像。我使用下面的三个选项获得了三个不同的图像。得到的图像是在道路车道图像上应用两次 Sobel 滤波器后得到的。
sample_image.jpg 下面的 Python 代码显示了三种绘图方法。
img = cv2.imread('sample_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gaussian = cv2.GaussianBlur(gray,(3,3),0)
sobely = cv2.Sobel(gaussian,cv2.CV_64F,1,0,ksize=5) # y
sobelyy = cv2.Sobel(sobely,cv2.CV_64F,1,0,ksize=5) # y
# method 1
cv2.imshow('sobelyy', sobelyy)
# method 2
cv2.imwrite('filtered_img1.JPG', sobelyy)
s_img = cv2.imread('filtered_img1.JPG')
cv2.imshow('s_img', s_img)
# method 3
plt.figure()
plt.imshow(sobelyy, cmap='gray')
plt.title('Filtered sobelyy image, B(x,y)'), plt.xticks([]), plt.yticks([])
plt.show()
我得到的图片是:
我要得到的图像是方法3中得到的那个。
为什么图片以不同的方式显示? 我怎样才能像方法 3 的结果一样保存输出图像?
提前谢谢你!
【问题讨论】:
-
请提供minimal reproducible example,即重现所述行为所需的完整代码和图像。你在处理
float类型的图片吗? -
我已经总结了代码以便更容易重现。我正在处理 uint8 类型的图像。谢谢!
-
您的
sobely和sobelyy是float,因为您在此处明确设置:cv2.Sobel(gaussian,cv2.CV_64F,1,0,ksize=5)具有相应范围内的任何负值和正值。 OpenCV 的imshow和imwrite方法需要特定的类型和范围,例如uint8和[0 ... 255]范围内的值。 Matplotlib 的imshow能够适当地缩放任何范围。这是使用 OpenCV 和 Matplotlib 时常见的错误来源。缩放sobelyy并适当设置其类型,您也将使用 OpenCV 获得所需的结果。
标签: python-3.x opencv matplotlib opencv3.0