本教程将使用matplotlib
的命令式绘图接口pyplot
。 该接口维护全局状态,并且可用于简单快速地尝试各种绘图设置。 另一种是面向对象的接口,这也非常强大,一般更适合大型应用程序的开发。 如果你想了解面向对象接口,使用上的常见问题是一个用于起步的不错的页面。
1. 将图像数据导入到 NumPy 数组
加载图像数据由 Pillow 库提供支持。 本来,matplotlib
只支持 PNG 图像。 如果本机读取失败,下面显示的命令会回退到 Pillow。
此示例中使用的图像是 JPG 文件,但是请记住你自己的数据的 Pillow 要求。
下面是我们要摆弄的图片:
现在我们开始加载和打印图片信息:
import matplotlib.image as mpimg
img = mpimg.imread('images/mitaomao.jpg')
print(img)
输出:
[[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
...
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[255 255 255]
[255 255 255]
[255 255 255]]]
2. 将 NumPy 数组绘制为图像
所以,你将数据保存在一个nump
数组(通过导入它,或生成它)。 让我们渲染它吧。 在 Matplotlib 中,这是使用imshow()
函数执行的。 这里我们将抓取plot
对象。 这个对象提供了一个简单的方法来从提示符处理绘图。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('images/mitaomao.jpg')
imgplot = plt.imshow(img)
plt.show()
注意:更改你自己图片的放置路径。
你也可以绘制任何 NumPy 数组。
3. 颜色刻度参考
了解颜色代表什么值对我们很有帮助。 我们可以通过添加颜色条来做到这一点。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('images/mitaomao.jpg')
imgplot = plt.imshow(img)
plt.colorbar()
plt.show()
4. 数组插值方案
插值根据不同的数学方案计算像素『应有』的颜色或值。 发生这种情况的一个常见的场景是调整图像的大小。 像素的数量会发生变化,但你想要相同的信息。 由于像素是离散的,因此存在缺失的空间。 插值就是填补这个空间的方式。 这就是当你放大图像时,你的图像有时会出来看起来像素化的原因。 当原始图像和扩展图像之间的差异较大时,效果更加明显。 让我们加载我们的图像并缩小它。 我们实际上正在丢弃像素,只保留少数几个像素。 现在,当我们绘制它时,数据被放大为你屏幕的大小。 由于旧的像素不再存在,计算机必须绘制像素来填充那个空间。
我们将使用用来加载图像的 Pillow 库来调整图像大小。
import matplotlib.pyplot as plt
from PIL import Image
img = Image.open('images/mitaomao.jpg')
img.thumbnail((64, 64), Image.ANTIALIAS) # resizes image in-place
imgplot = plt.imshow(img)
plt.show()
这里我们使用默认插值,双线性,因为我们没有向imshow()
提供任何插值参数。
让我们试试一些其它的东西:
imgplot = plt.imshow(img, interpolation="bicubic")
双立方插值通常用于放大照片 - 人们倾向于模糊而不是过度像素化。