图像教程

关于使用matplotlib绘制图像的简短教程。

启动命令

首先,让我们开始IPython。它是对标准Python提示符的最优秀的增强,它与Matplotlib的结合尤其紧密。可以直接在shell上启动IPython,也可以使用Jupyter笔记本(其中IPython作为运行的内核)。

随着IPython的启动,我们现在需要连接到一个GUI事件循环。这将告诉IPython在何处(以及如何)显示绘图。要连接到GUI循环,请执行 %Matlab 在你的ipython提示下变魔术。有更多的细节说明这到底是在干什么 IPython's documentation on GUI event loops .

如果您使用的是Jupyter Notebook,也可以使用相同的命令,但是人们通常使用%matplotlib魔术的特定参数:

In [1]: %matplotlib inline

这将打开内嵌打印,打印图形将显示在笔记本中。这对交互性有重要影响。对于内联打印,输出打印的单元格下方单元格中的命令不会影响打印。例如,无法从创建绘图的单元格下方的单元格更改颜色映射。但是,对于其他后端,例如打开单独窗口的qt5,在创建绘图的那些后面的单元格将更改绘图-它是内存中的活动对象。

本教程将使用Matplotlib的命令式打印接口pyplot。此接口保持全局状态,对于快速轻松地试验各种绘图设置非常有用。另一种选择是面向对象接口,它也非常强大,通常更适合大型应用程序开发。如果您想了解面向对象的接口,我们的 Usage guide . 现在,让我们继续使用命令式方法:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

将图像数据导入numpy数组

Matplotlib依赖于 Pillow 用于加载图像数据的库。

下面是我们将要播放的图像:

../../_images/stinkbug.png

这是一个24位的r g b png图像(每一个r、g、b对应8位)。根据获取数据的位置,您最可能遇到的其他类型的图像是允许透明度的rgba图像,或单通道灰度(亮度)图像。您可以右键单击它,然后选择“将图像另存为”将其下载到您的计算机上,以完成本教程的其余部分。

我们开始…

img = mpimg.imread('../../doc/_static/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 ]
  [0.43529412 0.43529412 0.43529412]
  [0.43137255 0.43137255 0.43137255]
  ...
  [0.45490196 0.45490196 0.45490196]
  [0.4509804  0.4509804  0.4509804 ]
  [0.4509804  0.4509804  0.4509804 ]]

 [[0.44313726 0.44313726 0.44313726]
  [0.44313726 0.44313726 0.44313726]
  [0.4392157  0.4392157  0.4392157 ]
  ...
  [0.4509804  0.4509804  0.4509804 ]
  [0.44705883 0.44705883 0.44705883]
  [0.44705883 0.44705883 0.44705883]]

 [[0.44313726 0.44313726 0.44313726]
  [0.4509804  0.4509804  0.4509804 ]
  [0.4509804  0.4509804  0.4509804 ]
  ...
  [0.44705883 0.44705883 0.44705883]
  [0.44705883 0.44705883 0.44705883]
  [0.44313726 0.44313726 0.44313726]]]

注意这里的数据类型-float32。Matplotlib已将每个通道的8位数据重新调整为介于0.0和1.0之间的浮点数据。作为旁注,枕头可以使用的唯一数据类型是uint8。Matplotlib Plotting可以处理float32和uint8,但除png之外的任何格式的图像读/写都限于uint8数据。为什么是8位?大多数显示器只能显示每个通道8位的颜色渐变值。为什么它们只能渲染8位/通道?因为这是人眼所能看到的。更多信息(从摄影角度来看): Luminous Landscape bit depth tutorial .

每个内部列表表示一个像素。这里,对于RGB图像,有3个值。因为它是黑白图像,所以R、G和B都是相似的。一个RGBA(其中A是alpha或transparency),每个内部列表有4个值,而一个简单的亮度图像只有一个值(因此只是一个2-D数组,而不是3-D数组)。对于RGB和RGBA图像,Matplotlib支持float32和uint8数据类型。对于灰度,Matplotlib仅支持float32。如果数组数据不符合这些描述之一,则需要重新缩放它。

将numpy数组绘制为图像

所以,您的数据在一个numpy数组中(通过导入或生成它)。我们来渲染一下。在Matplotlib中,使用 imshow() 功能。在这里我们将抓取绘图对象。此对象提供了一种从提示操作绘图的简单方法。

images

您还可以绘制任何numpy数组。

伪彩色方案在图像绘图中的应用

伪彩色可以成为增强对比度和更容易可视化数据的有用工具。这在使用投影仪显示数据时尤其有用-它们的对比度通常很差。

伪彩色只与单通道、灰度、亮度图像有关。我们目前有一个RGB图像。由于R、G和B都是相似的(请参见上面或您的数据),我们只需选择一个数据通道:

lum_img = img[:, :, 0]

# This is array slicing.  You can read more in the `Numpy tutorial
# <https://docs.scipy.org/doc/numpy/user/quickstart.html>`_.

plt.imshow(lum_img)
images

出:

<matplotlib.image.AxesImage object at 0x7faa0d1ac978>

现在,对于亮度(2d,无颜色)图像,将应用默认的颜色映射(又称查找表,lut)。默认值称为viridis。还有很多其他选择。

plt.imshow(lum_img, cmap="hot")
images

出:

<matplotlib.image.AxesImage object at 0x7fa9bdd07780>

请注意,还可以使用 set_cmap() 方法:

images

注解

但是,请记住,在具有内联后端的Jupyter笔记本中,不能对已经呈现的绘图进行更改。如果在一个单元格中创建imgplot,则不能在后面的单元格中对其调用set_cmap(),并期望前面的绘图发生更改。确保在一个单元格中同时输入这些命令。plt命令不会改变先前单元格的绘图。

还有许多其他的配色方案可用。见 list and images of the colormaps .

色阶参考

了解一种颜色所代表的价值是很有帮助的。我们可以通过在您的图形中添加颜色条来实现:

images

出:

<matplotlib.colorbar.Colorbar object at 0x7fa9c9ef20f0>

检查特定数据范围

有时,您希望增强图像中的对比度,或者在特定区域扩大对比度,同时牺牲颜色变化不大或不重要的细节。找到有趣区域的一个好工具是柱状图。为了创建图像数据的柱状图,我们使用 hist() 功能。

plt.hist(lum_img.ravel(), bins=256, range=(0.0, 1.0), fc='k', ec='k')
images

出:

(array([2.000e+00, 2.000e+00, 3.000e+00, 3.000e+00, 2.000e+00, 2.000e+00,
       3.000e+00, 1.000e+00, 7.000e+00, 9.000e+00, 7.000e+00, 2.000e+00,
       7.000e+00, 1.000e+01, 1.100e+01, 1.500e+01, 1.400e+01, 2.700e+01,
       2.100e+01, 2.400e+01, 1.400e+01, 3.100e+01, 2.900e+01, 2.800e+01,
       2.400e+01, 2.400e+01, 4.000e+01, 2.600e+01, 5.200e+01, 3.900e+01,
       5.700e+01, 4.600e+01, 8.400e+01, 7.600e+01, 8.900e+01, 8.000e+01,
       1.060e+02, 1.130e+02, 1.120e+02, 9.000e+01, 1.160e+02, 1.090e+02,
       1.270e+02, 1.350e+02, 9.800e+01, 1.310e+02, 1.230e+02, 1.110e+02,
       1.230e+02, 1.160e+02, 1.010e+02, 1.170e+02, 1.000e+02, 1.010e+02,
       9.000e+01, 1.060e+02, 1.260e+02, 1.040e+02, 1.070e+02, 1.110e+02,
       1.380e+02, 1.000e+02, 1.340e+02, 1.210e+02, 1.400e+02, 1.320e+02,
       1.390e+02, 1.160e+02, 1.330e+02, 1.180e+02, 1.080e+02, 1.170e+02,
       1.280e+02, 1.200e+02, 1.210e+02, 1.100e+02, 1.160e+02, 1.180e+02,
       9.700e+01, 9.700e+01, 1.140e+02, 1.070e+02, 1.170e+02, 8.700e+01,
       1.070e+02, 9.800e+01, 1.040e+02, 1.120e+02, 1.110e+02, 1.180e+02,
       1.240e+02, 1.340e+02, 1.200e+02, 1.410e+02, 1.520e+02, 1.360e+02,
       1.610e+02, 1.380e+02, 1.620e+02, 1.570e+02, 1.350e+02, 1.470e+02,
       1.690e+02, 1.710e+02, 1.820e+02, 1.980e+02, 1.970e+02, 2.060e+02,
       2.160e+02, 2.460e+02, 2.210e+02, 2.520e+02, 2.890e+02, 3.450e+02,
       3.620e+02, 3.760e+02, 4.480e+02, 4.630e+02, 5.170e+02, 6.000e+02,
       6.200e+02, 6.410e+02, 7.440e+02, 7.120e+02, 8.330e+02, 9.290e+02,
       1.061e+03, 1.280e+03, 1.340e+03, 1.638e+03, 1.740e+03, 1.953e+03,
       2.151e+03, 2.290e+03, 2.440e+03, 2.758e+03, 2.896e+03, 3.384e+03,
       4.332e+03, 5.584e+03, 6.197e+03, 6.422e+03, 6.404e+03, 7.181e+03,
       8.196e+03, 7.968e+03, 7.474e+03, 7.926e+03, 8.460e+03, 8.091e+03,
       9.148e+03, 8.563e+03, 6.747e+03, 6.074e+03, 6.328e+03, 5.291e+03,
       6.472e+03, 6.268e+03, 2.864e+03, 3.760e+02, 1.620e+02, 1.180e+02,
       1.270e+02, 9.500e+01, 7.600e+01, 8.200e+01, 6.200e+01, 6.700e+01,
       5.600e+01, 5.900e+01, 4.000e+01, 4.200e+01, 3.000e+01, 3.400e+01,
       3.200e+01, 4.300e+01, 4.200e+01, 2.300e+01, 2.800e+01, 1.900e+01,
       2.200e+01, 1.600e+01, 1.200e+01, 1.800e+01, 9.000e+00, 1.000e+01,
       1.700e+01, 5.000e+00, 2.100e+01, 1.300e+01, 8.000e+00, 1.200e+01,
       1.000e+01, 8.000e+00, 8.000e+00, 5.000e+00, 1.300e+01, 6.000e+00,
       3.000e+00, 7.000e+00, 6.000e+00, 2.000e+00, 1.000e+00, 5.000e+00,
       3.000e+00, 3.000e+00, 1.000e+00, 1.000e+00, 1.000e+00, 5.000e+00,
       0.000e+00, 1.000e+00, 3.000e+00, 0.000e+00, 1.000e+00, 1.000e+00,
       2.000e+00, 1.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00]), array([0.        , 0.00390625, 0.0078125 , 0.01171875, 0.015625  ,
       0.01953125, 0.0234375 , 0.02734375, 0.03125   , 0.03515625,
       0.0390625 , 0.04296875, 0.046875  , 0.05078125, 0.0546875 ,
       0.05859375, 0.0625    , 0.06640625, 0.0703125 , 0.07421875,
       0.078125  , 0.08203125, 0.0859375 , 0.08984375, 0.09375   ,
       0.09765625, 0.1015625 , 0.10546875, 0.109375  , 0.11328125,
       0.1171875 , 0.12109375, 0.125     , 0.12890625, 0.1328125 ,
       0.13671875, 0.140625  , 0.14453125, 0.1484375 , 0.15234375,
       0.15625   , 0.16015625, 0.1640625 , 0.16796875, 0.171875  ,
       0.17578125, 0.1796875 , 0.18359375, 0.1875    , 0.19140625,
       0.1953125 , 0.19921875, 0.203125  , 0.20703125, 0.2109375 ,
       0.21484375, 0.21875   , 0.22265625, 0.2265625 , 0.23046875,
       0.234375  , 0.23828125, 0.2421875 , 0.24609375, 0.25      ,
       0.25390625, 0.2578125 , 0.26171875, 0.265625  , 0.26953125,
       0.2734375 , 0.27734375, 0.28125   , 0.28515625, 0.2890625 ,
       0.29296875, 0.296875  , 0.30078125, 0.3046875 , 0.30859375,
       0.3125    , 0.31640625, 0.3203125 , 0.32421875, 0.328125  ,
       0.33203125, 0.3359375 , 0.33984375, 0.34375   , 0.34765625,
       0.3515625 , 0.35546875, 0.359375  , 0.36328125, 0.3671875 ,
       0.37109375, 0.375     , 0.37890625, 0.3828125 , 0.38671875,
       0.390625  , 0.39453125, 0.3984375 , 0.40234375, 0.40625   ,
       0.41015625, 0.4140625 , 0.41796875, 0.421875  , 0.42578125,
       0.4296875 , 0.43359375, 0.4375    , 0.44140625, 0.4453125 ,
       0.44921875, 0.453125  , 0.45703125, 0.4609375 , 0.46484375,
       0.46875   , 0.47265625, 0.4765625 , 0.48046875, 0.484375  ,
       0.48828125, 0.4921875 , 0.49609375, 0.5       , 0.50390625,
       0.5078125 , 0.51171875, 0.515625  , 0.51953125, 0.5234375 ,
       0.52734375, 0.53125   , 0.53515625, 0.5390625 , 0.54296875,
       0.546875  , 0.55078125, 0.5546875 , 0.55859375, 0.5625    ,
       0.56640625, 0.5703125 , 0.57421875, 0.578125  , 0.58203125,
       0.5859375 , 0.58984375, 0.59375   , 0.59765625, 0.6015625 ,
       0.60546875, 0.609375  , 0.61328125, 0.6171875 , 0.62109375,
       0.625     , 0.62890625, 0.6328125 , 0.63671875, 0.640625  ,
       0.64453125, 0.6484375 , 0.65234375, 0.65625   , 0.66015625,
       0.6640625 , 0.66796875, 0.671875  , 0.67578125, 0.6796875 ,
       0.68359375, 0.6875    , 0.69140625, 0.6953125 , 0.69921875,
       0.703125  , 0.70703125, 0.7109375 , 0.71484375, 0.71875   ,
       0.72265625, 0.7265625 , 0.73046875, 0.734375  , 0.73828125,
       0.7421875 , 0.74609375, 0.75      , 0.75390625, 0.7578125 ,
       0.76171875, 0.765625  , 0.76953125, 0.7734375 , 0.77734375,
       0.78125   , 0.78515625, 0.7890625 , 0.79296875, 0.796875  ,
       0.80078125, 0.8046875 , 0.80859375, 0.8125    , 0.81640625,
       0.8203125 , 0.82421875, 0.828125  , 0.83203125, 0.8359375 ,
       0.83984375, 0.84375   , 0.84765625, 0.8515625 , 0.85546875,
       0.859375  , 0.86328125, 0.8671875 , 0.87109375, 0.875     ,
       0.87890625, 0.8828125 , 0.88671875, 0.890625  , 0.89453125,
       0.8984375 , 0.90234375, 0.90625   , 0.91015625, 0.9140625 ,
       0.91796875, 0.921875  , 0.92578125, 0.9296875 , 0.93359375,
       0.9375    , 0.94140625, 0.9453125 , 0.94921875, 0.953125  ,
       0.95703125, 0.9609375 , 0.96484375, 0.96875   , 0.97265625,
       0.9765625 , 0.98046875, 0.984375  , 0.98828125, 0.9921875 ,
       0.99609375, 1.        ], dtype=float32), <BarContainer object of 256 artists>)

最常见的是,图像中“有趣的”部分位于峰值附近,您可以通过剪切峰值上方和/或下方的区域来获得额外的对比度。在我们的柱状图中,高端似乎没有太多有用的信息(图像中没有太多白色的东西)。让我们调整上限,以便有效地“放大”柱状图的一部分。我们通过将clim参数传递给imshow来实现这一点。您也可以通过拨打 set_clim() 方法,但在使用Jupyter笔记本时,请确保在与plot命令相同的单元格中执行此操作-它不会更改以前单元格中的绘图。

您可以在调用中指定clim plot .

imgplot = plt.imshow(lum_img, clim=(0.0, 0.7))
images

还可以使用返回的对象指定clim

fig = plt.figure()
ax = fig.add_subplot(1, 2, 1)
imgplot = plt.imshow(lum_img)
ax.set_title('Before')
plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
ax = fig.add_subplot(1, 2, 2)
imgplot = plt.imshow(lum_img)
imgplot.set_clim(0.0, 0.7)
ax.set_title('After')
plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
Before, After

出:

<matplotlib.colorbar.Colorbar object at 0x7faa0aaf0908>

阵列插值方案

插值根据不同的数学方案计算像素“应该”的颜色或值。一个常见的情况是当你调整图像的大小。像素数会改变,但您需要相同的信息。因为像素是离散的,所以有丢失的空间。插值就是你如何填充这个空间。这就是为什么你的图像有时会在放大时看起来像像素。当原始图像和扩展图像之间的差异较大时,效果更明显。让我们把图像缩小。我们有效地丢弃了像素,只保留少数选择。现在,当我们绘制它时,数据会放大到屏幕上的大小。旧的像素已经不存在了,计算机必须绘制像素来填充这个空间。

我们将使用我们用来加载图像的枕头库来调整图像的大小。

from PIL import Image

img = Image.open('../../doc/_static/stinkbug.png')
img.thumbnail((64, 64), Image.ANTIALIAS)  # resizes image in-place
imgplot = plt.imshow(img)
images

这里我们有默认的插值,双线性,因为我们没有给出 imshow() 任何插值参数。

我们试试其他的吧。这是“最近的”,没有插值。

imgplot = plt.imshow(img, interpolation="nearest")
images

双三次:

imgplot = plt.imshow(img, interpolation="bicubic")
images

双三次插值常用于放大照片-人们倾向于模糊而不是像素化。

脚本的总运行时间: (0分8.484秒)

关键词:matplotlib代码示例,codex,python plot,pyplot Gallery generated by Sphinx-Gallery