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
    plt.imshow()显示灰度图异常的问题及通道概念解析_第1张图片

  • vscode
    plt.imshow()显示灰度图异常的问题及通道概念解析_第2张图片

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

灰度图显示的对比

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

plt.imshow()显示灰度图异常的问题及通道概念解析_第3张图片
plt.imshow()显示灰度图异常的问题及通道概念解析_第4张图片

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

知识补充

通道和颜色分量的概念

什么是通道?

在网上一番搜索,得出结论一,通道是显示图片的,不是描述图片的,颜色分量才是描述图片的
什么意思呢?以上面牛奶的图片为例。
我们先将牛奶转换为数组,易知形状是 宽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)

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

解决疑问

问题二

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

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

问题一

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

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

问题解决

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

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

利用imshow()的参数cmap即可使“灰”度图灰起来。
plt.imshow()显示灰度图异常的问题及通道概念解析_第8张图片

结束

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

你可能感兴趣的:(python,pycharm)