05-Matplotlib中图像的尺寸和分辨率
上一篇详细讨论了显示器的尺寸、分辨率,PPI,DPI的概念,在这个基础上,我们讨论图像的尺寸和分辨率就要容易得多了,如果你还没有阅读上一篇,而对这些概念又不是非常、非常地清晰,建议你先阅读上一篇。
先问一个小问题:
matplotlib 绘图,使用下面的命令创建的figure尺寸和分辨率是多少:
import matplotlib.pyplot as plt
figa = plt.figure()
如果你不能立即回答出来,你可能需要重新检视一遍自己学习matplotlib的方法。
图像image和图形graphic
前面有约:用图像image表示位图、栅格图形;用graphic表示矢量图形。
将一个区域(常见的为矩形,后面就以矩形为例)划分为若干个小格子(栅格),每个格子只能用一种颜色填充,将所有格子填上各种颜色,用这种方式表达的图像就是栅格图像Image。
即使整个图像只有一根直线,这根直线也是用一个一个的小格子排列而成的。
(图一)
如果你需要文章中用到的一些素材,如图片、代码、数据集等,请移步QQ群“Python草堂”群号:457079928 下载。
在PS中打开上图,放大到1600%:
(图二)
这就能直观地理解栅格图像的含义了。
graphic,矢量图形,则是用数据语言描述的图形,比如,直线只需要给出两个端点;圆只需要给出圆心和半径即可。
matplotlib在绘制时,绘制的是矢量图形。在存储、交换、使用时大多数又是栅格图像了!
图像大小
在PS里查看图像大小:
发现PS有两种表示图像大小的方式:
- 像素大小: 宽度,250 像素;高度344 像素
- 文档大小:宽度,2.12 厘米;高度2.91厘米;分辨率R(resolution)
,300 像素/英寸
注意,这里的文档大小,其实就是图像的物理尺寸,如果我们按照100%的比例打印这幅图像,打印出来的照片区域就是 2.12厘米*2.91厘米。
这两种尺寸的关系如下:
在上一篇中讲过,像素 pixels 严格来说是显示分辨率。
在计算机屏幕上,1 px,传递到我们眼睛,给出的直观大小是可变的,这就是图像的缩放。
图一中我们的眼睛无法区分出 1 px的格子,当放大到1600%时,我们的眼睛能清晰地区分出 1 px的单元格。
请注意: 这时候,图一的实际尺寸、图像分辨率并没有变化;我们改变的是它的显示分辨率。
图像分辨率和显示分辨率
为什么说是改变了图像的显示分辨率呢?
我的电脑显示屏幕的当前显示分辨率已设置好,是1920px*1080px,96DPI,也就是说每英寸长度上能显示96个px。
请问:图一在PS中以100%的比例显示时,占据我的屏幕的物理空间是多大?
图一的尺寸如下:
- 像素大小: 宽度,250 像素;高度344 像素
- 文档大小:宽度,2.12 厘米;高度2.91厘米;分辨率R(resolution) ,300 像素/英寸
我们先来做一个推算:
可以计算出该图像在我的屏幕上应该占据:
宽6.625厘米,高9.09厘米的屏幕空间。
原图像的物理尺寸是:2.12厘米*2.91厘米,100%比例显示时真会占据这么大的空间吗?
回到PS中,按照100%比例显示图一,设置PS的标尺单位为毫米,并显示网格线。
我用尺子测量了一下图一100%比例显示时,在我的屏幕上占据的空间就是:6.6厘米*9.1厘米。
再问:在我的屏幕上,如果图一占据的屏幕物理空间和图一的物理尺寸一样,即2.12厘米*2.91厘米,显示的缩放比例应该是多少?
有兴趣的,请在评论里写上你的答案。
总结:
- image的物理尺寸,就是你以100%的比例打印图像时,打印出的照片的物理尺寸。
- image的尺寸有两种表示方式:像素,inches(或厘米、毫米等长度单位);
- 用像素表示的图像尺寸结合DPI可以计算出图像的物理尺寸;
- image有图像分辨率(设定后是固定的)和显示分辨之分;
- image在屏幕上的放大和缩小,改变的是图像的显示分辨率;image的实际分辨并没有改变;
- image是将图像区域划分为方格矩阵,每个方格填充各种色彩来表达图像的。
栅格矩阵表达图像的方式,让用Numpy的ndarray来存储、交换、重现、变换image成为很自然的事。