使用Matplotlib打印图像(image)的简短教程。
启动命令行
首先启动IPython。相比于标准Python提示,它是一个非常出色的增强版,尤其适合作为Matplotlib的命令行。可以直接在shell(Python命令行)上启动IPython,也可以使用Jupyter Notebook(以IPython为运行内核)。
IPython启动后,还需要连接到GUI事件循环。这告诉IPython在哪里(以及如何)显示绘图。在IPython提示符下执行%matplotlib guiname(例如:tk),连接到GUI循环。在IPython关于GUI事件循环的文档中,有更多关于这一功能的详细信息:
https://ipython.readthedocs.io/en/stable/interactive/reference.html#gui-event-loop-support。
在Jupyter Notebook中,也可以使用相同的命令。人们通常使用特定参数inline(内联):
·
%matplotlib inline
这将打开内联(inline)绘图,绘制的图形将显示在笔记本中。这对互动性有重要影响。对于内联绘图,构建绘图命令后的命令不会影响已构建的绘图。例如,构建图形命令的后续命令无法更改色条。然而,对于其他后端,如Qt,打开一个单独的窗口,创建图形后的命令可以更改绘图——因为这图表是内存中的一个活动对象。
本教程使用Matplotlib的隐式绘图界面pyplot。此界面保持全局状态,对于快速轻松地尝试各种绘图设置非常有用。另一种方法是显式方法,它更适合大型应用程序开发。有关隐式接口和显式接口之间权衡的说明,请参阅Matplotlib应用程序接口(APIs);使用显式接口参阅快速入门指南。在这里,继续使用隐式方法:Matplotlib应用程序接口(APIs):
https://matplotlib.org/stable/users/explain/api_interfaces.html#api-interfaces
·
·
·
·
·
·
·
ipythonPython 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)]Type 'copyright', 'credits' or 'license' for more informationIPython 8.7.0 -- An enhanced Interactive Python. Type '?' for help.%matplotlib tkimport matplotlib.pyplot as pltimport matplotlib.image as mpimg
将图像数据导入Numpy数组
Matplotlib依赖Pillow库加载图像数据。
下面是我们要播放的图像:
这是一个24位RGB PNG图像(R、G、B各8位)。这与你获取图片的来源有关,也许是其他类型的图像,比如RGBA图像(允许透明度)或单通道灰度(亮度)图像。请下载stinkbug.png到计算机上,作为本教程的处理例图。stinkbug.png:
https://raw.githubusercontent.com/matplotlib/matplotlib/main/doc/_static/stinkbug.png
现在开始历程:
·
·
·
·
·
·
ipython%matplotlib tkimport matplotlib.pyplot as pltimport matplotlib.image as mpimgimg = mpimg.imread('D:/5xstar/work/stinkbug.png')print(img)
输出:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
[[[0.40784314 0.40784314 0.40784314] [0.40784314 0.40784314 0.40784314] [0.40784314 0.40784314 0.40784314] ... [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098]]
[[0.4117647 0.4117647 0.4117647 ] [0.4117647 0.4117647 0.4117647 ] [0.4117647 0.4117647 0.4117647 ] ... [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098] [0.42745098 0.42745098 0.42745098]]
[[0.41960785 0.41960785 0.41960785] [0.41568628 0.41568628 0.41568628] [0.41568628 0.41568628 0.41568628] ... [0.43137255 0.43137255 0.43137255] [0.43137255 0.43137255 0.43137255] [0.43137255 0.43137255 0.43137255]]
...
[[0.4392157 0.4392157 0.4392157 ]
注意,里面的数据类型是32位浮点数(float32)。Matplotlib已将每个通道的8位(bit)数重新缩放为0.0到1.0之间的浮点数。顺便说一句,Pillow可以使用的唯一数据类型是uint8。Matplotlib绘图可以处理float32和uint8,但读/写除了PNG外的其他格式的图像仅限于uint8。为什么是8位(bit)?因为大多数显示器只能渲染每通道8位的颜色渐变。为什么它们只能渲染8位每通道呢?因为这是人眼睛所能分别的。要了解更多(从摄影角度):发光景观位深度教程:
https://luminous-landscape.com/bit-depth/。
每个内部列表代表一个像素。这里,对于RGB图像,有3个值。由于是黑白图像,R、G和B都很相似。RGBA(其中A是alpha或透明度)每个内部列表有4个值,而一个简单的亮度图像只有一个值(因此它只是一个2-D数组,而不是3-D数组)。对于RGB和RGBA图像,Matplotlib支持float32和uint8数据类型。对于灰度,Matplotlib仅支持float32。如果阵列数据不符合这些描述之一,则需要重新调整。
将numpy数组绘制为图像
这样,先把图像数据保存在numpy数组中(通过导入或生成),然后再渲染它。在Matplotlib中,是使用imshow()函数来执行的。这样,我们就获得了绘图对象。通过此对象,在提示符下,也能简单操作绘图。imshow():
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html#matplotlib.pyplot.imshow
·
·
·
·
·
·
ipython%matplotlib tkimport matplotlib.pyplot as pltimport matplotlib.image as mpimgimg = mpimg.imread('D:/5xstar/work/stinkbug.png')imgplot = plt.imshow(img)
还可以绘制任何numpy数组。
·
·
·
·
·
·
ipython%matplotlib tkimport matplotlib.pyplot as pltimport matplotlib.image as mpimgimg = mpimg.imread('D:/5xstar/work/test.png')imgplot = plt.imshow(img)