本章将把SciPy库中的一个示例图像Lena,加载到一个数组中。顺便说一下,本章不是要讨论图像处理,我们只是把图像数据用作输入。
Lena Soderberg是1972年出现在《花花公子》杂志上的一个人物。因为历史的原因,图像处理领域中会经常用到她的一幅肖像。请勿多虑,在工作中使用这个肖像是绝对安全的。
我们将用repeat
函数调整该图像的大小。该函数用来对一个数组进行repeat操作,其实际效果就是按一定比例调整图像大小。
准备工作
使用本攻略的前提条件是SciPy、Matplotlib和PIL都已安装好了。
具体步骤
- 加载图像Lena到数组中。
SciPy中有一个lena
函数,可以用该函数把图像Lena加载到NumPy数组中。
lena = scipy.misc.lena()
SciPy的0.10及之后的版本重构了部分代码,如果你用的是重构之前的旧版本,正确的代码是:
lena = scipy.lena()
- 检查数组的形状。
用numpy.testing包中的assert_equal
函数检查数组Lena
的形状,这是一个可选的完整性检查。
numpy.testing.assert_equal((LENA_X, LENA_Y), lena.shape)
- 调整数组Lena的大小。
用repeat
函数调整数组Lena
的大小。需要分别在x和y方向给出一个调整系数:
resized = lena.repeat(yfactor, axis=0).repeat(xfactor, axis=1)
- 绘制数组对应的图像。
我们将把原始图像Lena和调整大小后的图像,分别画到一个网格内的两个子图中。在第一个子图中绘制数组Lena
。
matplotlib.pyplot.subplot(211)
matplotlib.pyplot.imshow(lena)
Matplotlib中的subplot
函数用来创建子图。这个函数以一个3位的整数作为参数,最高位的数字代表行数,第二个数字代表列数,最后一个数字代表子图的位置索引(从1开始编号)。imshow
函数用来显示图像,show
函数用来显示最终的结果。
把大小调整后的数组绘制在第二个子图中,并显示最终的结果。该子图的位置索引是2。
matplotlib.pyplot.subplot(212)
matplotlib.pyplot.imshow(resized)
matplotlib.pyplot.show()
最终的结果如下图所示,第一个子图是原始图像,第二个子图是大小调整后的图像。
本攻略的完整代码如下。
import scipy.misc
import sys
import matplotlib.pyplot
import numpy.testing
# 这个脚本用来调整SciPy库中图像Lena的大小。
if(len(sys.argv) != 3):
print "Usage python %s yfactor xfactor" % (sys.argv[0])
sys.exit()
# 加载图像Lena到一个数组中
lena = scipy.misc.lena()
# 图像Lena的规格
LENA_X = 512
LENA_Y = 512
# 检查数组Lena的形状
numpy.testing.assert_equal((LENA_X, LENA_Y), lena.shape)
# 获取调整系数
yfactor = float(sys.argv[1])
xfactor = float(sys.argv[2])
# 调整数组Lena的大小
resized = lena.repeat(yfactor, axis=0).repeat(xfactor, axis=1)
# 检查大小调整后的数组的形状
numpy.testing.assert_equal((yfactor * LENA_Y, xfactor * LENA_Y), resized.shape)
# 绘制数组Lena
matplotlib.pyplot.subplot(211)
matplotlib.pyplot.imshow(lena)
# 绘制大小调整后的数组
matplotlib.pyplot.subplot(212)
matplotlib.pyplot.imshow(resized)
matplotlib.pyplot.show()
小结
repeat
函数对数组进行repeat操作。对于本例的情况,其结果是改变了原始图像的大小。Matplotlib中的subplot
函数用来创建子图,imshow
函数用来显示图像,show
函数用来显示最终的结果。