plt.imshow()显示灰度图异常的问题及通道概念解析

文章目录

  • 问题发现
  • RGB显示的对比
  • 灰度图显示的对比
  • 知识补充
  • 通道和颜色分量的概念
  • 解决疑问
  • 问题二
  • 问题一
  • 问题解决
  • 结束
  • 问题发现

    近期使用pycharm完成作业的过程中发现,pycharm对jupyter的支持不是很好,尤其是在灰度图的展现上做得不是很好。试图对比一下pycharm和vscode显示结果的差别找出问题所在。

    from matplotlib import pyplot as plt
    from PIL import Image
    image=Image.open("milk.jpg",mode='r')
    image.thumbnail((500,200))
    image
    

    RGB显示的对比

  • Pycharm

  • vscode

  • 明显vscode是没问题的,而pycharm这边有一点小问题。

    灰度图显示的对比

    image=Image.open("milk.jpg",mode='r')
    image.thumbnail((500,200))
    plt.imshow(image.convert("L"))
    


    看起来图片显示的都不是我们想要的“灰”度图

    知识补充

    通道和颜色分量的概念

    什么是通道?

    在网上一番搜索,得出结论一,通道是显示图片的,不是描述图片的,颜色分量才是描述图片的
    什么意思呢?以上面牛奶的图片为例。
    我们先将牛奶转换为数组,易知形状是 宽x高x3,3就是颜色分量的个数,即RGB。

    import numpy as np
    img_array=np.array(image)
    

    接下来,一个有趣的操作,就是将RGB分量中的R和B分量交换位置。

    img_array[:,:,0],img_array[:,:,2]=img_array[:,:,2],img_array[:,:,0]
    Image.fromarray(img_array)
    

    我们对一杯原味的牛奶加工得到了一杯草莓味的牛奶。

    这其实很值得思考,为什么只有背景的颜色变了,而牛奶却还是白色的?这是问题一。
    我们来看看下面这张图,它是三个颜色分量的灰度显示图。
    什么叫三个颜色分量的灰度显示图?(问题二)别急,我们慢慢来看
    三个分量的显示
    我们从这三张图中发现第一张图的背景格外地黑,对应到灰度图中,就是背景像素的值特别小。
    有了这些图片的印象,介绍第二个结论,只有将颜色分量放入对应颜色的通道,才会显示正常的颜色

    解决疑问

    问题二

    什么叫三个颜色分量的灰度显示图?

    RGB颜色分量并非只能放进RGB颜色通道,由于取值范围是[0,256),与灰度图分量值范围一致,所以当任意一个分量放入灰度图通道时,都会显示出灰度图。而原分量的大小就会决定转化为灰度图后图像的明和暗。

    问题一

    为什么只有背景的颜色变了,而牛奶却还是白色的?

    有了问题二的解答,这个问题一下就简单了。再观察一下分量的灰度图。
    三个分量的显示
    我们发现对应R和B的分量,背景的亮度差异远比牛奶的亮度差异明显。交换后,原先的R分量放进了B通道,原先的B分量放进了R通道。背景显示时R通道的值变大,故背景便变成了红色成分居多的粉色了,而牛奶不显示时同颜色通道的值几乎不变,也就没有什么区别。

    问题解决

    回到最初的问题,plt.imshow()无法显示“灰”度图,答案就是因为显示时的颜色通道不是灰色通道,而是其他的通道。

    plt.imshow(image.convert("L"),cmap="gray")
    

    利用imshow()的参数cmap即可使“灰”度图灰起来。

    结束

    若有纰漏不严谨之处,望指出纠正。

    物联沃分享整理
    物联沃-IOTWORD物联网 » plt.imshow()显示灰度图异常的问题及通道概念解析

    发表评论