05-Matplotlib中图像的尺寸和分辨率

上一篇详细讨论了显示器的尺寸、分辨率,PPI,DPI的概念,在这个基础上,我们讨论图像的尺寸和分辨率就要容易得多了,如果你还没有阅读上一篇,而对这些概念又不是非常、非常地清晰,建议你先阅读上一篇。

先问一个小问题:

matplotlib 绘图,使用下面的命令创建的figure尺寸和分辨率是多少:

import matplotlib.pyplot as plt
figa = plt.figure()

如果你不能立即回答出来,你可能需要重新检视一遍自己学习matplotlib的方法。

图像image和图形graphic

前面有约:用图像image表示位图、栅格图形;用graphic表示矢量图形。

将一个区域(常见的为矩形,后面就以矩形为例)划分为若干个小格子(栅格),每个格子只能用一种颜色填充,将所有格子填上各种颜色,用这种方式表达的图像就是栅格图像Image。

即使整个图像只有一根直线,这根直线也是用一个一个的小格子排列而成的。

python 用matplotlib修改图像中间像素 matplotlib 图像大小_栅格


(图一)

如果你需要文章中用到的一些素材,如图片、代码、数据集等,请移步QQ群“Python草堂”群号:457079928 下载。

在PS中打开上图,放大到1600%:

python 用matplotlib修改图像中间像素 matplotlib 图像大小_数据集_02


(图二)

这就能直观地理解栅格图像的含义了。

graphic,矢量图形,则是用数据语言描述的图形,比如,直线只需要给出两个端点;圆只需要给出圆心和半径即可。

matplotlib在绘制时,绘制的是矢量图形。在存储、交换、使用时大多数又是栅格图像了!

图像大小

在PS里查看图像大小:

python 用matplotlib修改图像中间像素 matplotlib 图像大小_矢量图_03


发现PS有两种表示图像大小的方式:

  • 像素大小: 宽度,250 像素;高度344 像素
  • 文档大小:宽度,2.12 厘米;高度2.91厘米;分辨率R(resolution)
    ,300 像素/英寸

注意,这里的文档大小,其实就是图像的物理尺寸,如果我们按照100%的比例打印这幅图像,打印出来的照片区域就是 2.12厘米*2.91厘米。

这两种尺寸的关系如下:

python 用matplotlib修改图像中间像素 matplotlib 图像大小_矢量图_04


在上一篇中讲过,像素 pixels 严格来说是显示分辨率。

在计算机屏幕上,1 px,传递到我们眼睛,给出的直观大小是可变的,这就是图像的缩放。

图一中我们的眼睛无法区分出 1 px的格子,当放大到1600%时,我们的眼睛能清晰地区分出 1 px的单元格。

请注意: 这时候,图一的实际尺寸、图像分辨率并没有变化;我们改变的是它的显示分辨率。

图像分辨率和显示分辨率

为什么说是改变了图像的显示分辨率呢?

我的电脑显示屏幕的当前显示分辨率已设置好,是1920px*1080px,96DPI,也就是说每英寸长度上能显示96个px。

请问:图一在PS中以100%的比例显示时,占据我的屏幕的物理空间是多大?

图一的尺寸如下:

  • 像素大小: 宽度,250 像素;高度344 像素
  • 文档大小:宽度,2.12 厘米;高度2.91厘米;分辨率R(resolution) ,300 像素/英寸

我们先来做一个推算:

python 用matplotlib修改图像中间像素 matplotlib 图像大小_数据集_05


可以计算出该图像在我的屏幕上应该占据:

python 用matplotlib修改图像中间像素 matplotlib 图像大小_矢量图_06


宽6.625厘米,高9.09厘米的屏幕空间。

原图像的物理尺寸是:2.12厘米*2.91厘米,100%比例显示时真会占据这么大的空间吗?

回到PS中,按照100%比例显示图一,设置PS的标尺单位为毫米,并显示网格线。

python 用matplotlib修改图像中间像素 matplotlib 图像大小_栅格_07


我用尺子测量了一下图一100%比例显示时,在我的屏幕上占据的空间就是:6.6厘米*9.1厘米。

再问:在我的屏幕上,如果图一占据的屏幕物理空间和图一的物理尺寸一样,即2.12厘米*2.91厘米,显示的缩放比例应该是多少?

有兴趣的,请在评论里写上你的答案。

总结:

  1. image的物理尺寸,就是你以100%的比例打印图像时,打印出的照片的物理尺寸。
  2. image的尺寸有两种表示方式:像素,inches(或厘米、毫米等长度单位);
  3. 用像素表示的图像尺寸结合DPI可以计算出图像的物理尺寸;
  4. image有图像分辨率(设定后是固定的)和显示分辨之分;
  5. image在屏幕上的放大和缩小,改变的是图像的显示分辨率;image的实际分辨并没有改变;
  6. image是将图像区域划分为方格矩阵,每个方格填充各种色彩来表达图像的。

栅格矩阵表达图像的方式,让用Numpy的ndarray来存储、交换、重现、变换image成为很自然的事。