【问题标题】:OpenCV and Matplotlib show an image in differnt waysOpenCV 和 Matplotlib 以不同的方式显示图像
【发布时间】: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()

我得到的图片是:

method 1

method 2

method 3

我要得到的图像是方法3中得到的那个。

为什么图片以不同的方式显示? 我怎样才能像方法 3 的结果一样保存输出图像?

提前谢谢你!

【问题讨论】:

  • 请提供minimal reproducible example,即重现所述行为所需的完整代码和图像。你在处理float 类型的图片吗?
  • 我已经总结了代码以便更容易重现。我正在处理 uint8 类型的图像。谢谢!
  • 您的 sobelysobelyyfloat,因为您在此处明确设置:cv2.Sobel(gaussian,cv2.CV_64F,1,0,ksize=5) 具有相应范围内的任何负值和正值。 OpenCV 的 imshowimwrite 方法需要特定的类型和范围,例如uint8[0 ... 255] 范围内的值。 Matplotlib 的 imshow 能够适当地缩放任何范围。这是使用 OpenCV 和 Matplotlib 时常见的错误来源。缩放sobelyy 并适当设置其类型,您也将使用 OpenCV 获得所需的结果。

标签: python-3.x opencv matplotlib opencv3.0


【解决方案1】:

为什么图片的显示方式不同?

OpenCV 和 Matplotlib 使用不同的色彩空间来显示图像——这就是为什么即使它们实际上相同,它们看起来也不同的原因。

至于您的前 2 种方法,它们实际上应该看起来相同,并且在我尝试您的代码时它们确实如此。

我怎样才能像方法3的结果一样保存输出图像?

Matplotlib 有一个内置函数可以将绘制的图像写入磁盘,只需使用:

plt.savefig('your_filename.png')

【讨论】:

    猜你喜欢
    • 2022-08-14
    • 1970-01-01
    • 2020-03-29
    • 2015-10-05
    • 2017-08-30
    • 2020-04-17
    • 2017-07-27
    相关资源
    最近更新 更多