【问题标题】:Display red channel of image with NumPy and Matplotlib only仅使用 NumPy 和 Matplotlib 显示图像的红色通道
【发布时间】:2020-03-18 10:19:25
【问题描述】:

我正在尝试仅使用 Matplotlib.pyplot 和 NumPy 显示图像的红色通道。谁能解释一下,为什么我得到以下两个代码的不同图像?

代码 #1:

R = numpy.copy(img)           # copy image into new array
R[:,:,1]=0                    # set green channel to 0
R[:,:,2]=0                    # set blue channel to 0
matplotlib.pyplot.imshow(R)
matplotlib.plyplot.show()     # display new image

代码 #2:

R = numpy.zeros(img.shape)    # create array of 0-s with same dimensions as image
R[:,:,0]=img[:,:,0]           # copy red channel values into array of 0-s
matplotlib.pyplot.imshow(R)
matplotlib.plyplot.show()     # display new image

【问题讨论】:

    标签: python image numpy matplotlib matrix


    【解决方案1】:

    您没有在numpy.zeros() 调用中指定数据类型:

    numpy.zeros(img.shape)
    

    这样,R 的类型为 float64,并且其大部分值大于或等于 1,因此您会在绘图中看到“剪裁”。

    解决这个问题的最简单方法是设置正确的数据类型:

    numpy.zeros(img.shape, numpy.uint8)
    

    然后,两个版本产生相同的结果。

    第一个版本中的numpy.copy(img) 使用来自复制源的数据类型,因此R 从一开始就具有正确的数据类型numpy.uint8

    或者,您也可以修改您的matplotlib.pyplot.imshow() 调用:

    matplotlib.pyplot.imshow(R / 255)
    

    因此,R 中的所有值都正确映射到 [0.0 ... 1.0]

    希望有帮助!

    【讨论】:

      【解决方案2】:

      在第一个代码中,您可能使用的是 uint8 类型,而在第二个代码中,您正在转换为 float...matplotlib.pyplot.imshow() 显示不同类型的不同输出

      【讨论】:

        猜你喜欢
        • 2014-05-27
        • 2014-05-27
        • 2017-11-28
        • 2011-04-02
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-12-29
        • 2016-09-22
        相关资源
        最近更新 更多