近期使用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
明显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")
若有纰漏不严谨之处,望指出纠正。