在Python中,matplotlib是一个被广泛使用的数据可视化库。本文将展示如何利用这个库来显示、修改和保存图像。将特别关注'matplotlib'库中的'image'模块,因为它简化了图像处理的工作。可以对图像进行多种操作,比如改变颜色、调整大小、裁剪图像等,并且可以将修改后的图像保存为一个新的图像文件。
本文将涵盖以下主题:
将从导入所需的库开始。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
将使用matplotlib库的'image'子模块,它支持加载、缩放和显示图像等基本操作。为了方便,将它别名为'mpimg'。还将使用pyplot子模块,因为它支持不同类型的绘图。
要启用内联绘图,请使用以下代码。
%matplotlib inline
这个魔术命令会在编写绘图命令的单元格下方显示图表。
在显示图像之前,首先需要读取图像。图像由像素组成,每个像素是一个颜色点。在彩色图像中,每个像素由三种颜色组成,即红色、绿色和蓝色。当这三种颜色结合时,可以得到任何想要的颜色。
当图像存储在计算机中时,它是以数字数组的形式保存的。因此,每个像素可以取0到255之间的任何值,其中0代表最暗,255代表最亮。
对于灰度(黑白)图像,像素取0到1范围内的单个值。在灰度图像中,0代表黑色,1代表白色。范围内的其他值代表不同深浅的灰色。
将尝试绘制以下图像。这是一个32位的PNG图像,具有RGBA格式(每个通道8位,即每个像素32位)。它是一个4通道格式,其中R代表红色,G代表绿色,B代表蓝色,A代表alpha通道,描述颜色的不透明度。不透明度的范围是0.0到1.0,其中0代表完全透明,1代表完全不透明。
可以从以下链接下载此图像:
使用'imread'方法,将从给定的图像文件中读取图像到数组中。
img = mpimg.imread('Taj.png')
此函数返回一个多维NumPy数组。返回的NumPy数组的形状取决于图像的类型,即图像是灰度、RGB还是RGBA(带有alpha通道的RGB)。
print(img.shape)
每个像素由一个内部列表表示。由于有一个RGBA图像,因此每个内部列表中有4个值。第一个值代表红色通道的值,第二个值代表绿色通道的值,第三个值代表蓝色通道的值,第四个值代表alpha通道的不透明度。
列表中的数据类型是float32,因为matplotlib将每个通道的8位数据重新缩放到0.0和1.0之间的浮点数据。对于RGB和RGBA图像,matplotlib支持float32和uint8数据类型。对于灰度图像,matplotlib只支持float32。
由于已经将图像数据加载到NumPy数组中,可以使用'imshow()'函数来渲染它。将使用pyplot对象,因为它使得操作图表变得容易。可以绘制任何NumPy数组。数组可能包含RGB数据、RGBA数据或2D标量数据(对于灰度图像)。
imgplot = plt.imshow(img)
坐标轴有助于选择图像的一部分。可以使用它们作为切片图像的指南。对于给定的图像,如果想只显示泰姬陵而不显示图像的其他部分,那么可以利用坐标轴上显示的刻度和标签来决定要切片的图像部分。
selected_part = img[290:680 , 10:630 , :]
plt.imshow(selected_part)
可以看到图像已经被完美地切片,并且只显示了泰姬陵。
如果想要知道特定颜色代表的值,可以使用以下代码将颜色条添加到图像中:
imgplot = plt.imshow(img)
plt.colorbar()
可以看到颜色条被添加到图像的右侧,并且它显示了给定图像所有颜色的0到1范围内的值。
如果不希望在图像中显示编号的坐标轴,可以使用'axis'方法并将其参数值设置为'off'来去除坐标轴。
plt.axis("off")
plt.imshow(img)
执行代码后,可以看到上述图像中的坐标轴已经消失。
可以使用切片将RGB彩色图像的3D数组转换为灰度图像的2D数组,从而将彩色图像转换为灰度图像。
grayscale_img = img[:, :, 0]
plt.imshow(grayscale_img, cmap='gray')
将在以下代码中仅选择三个维度中的一个,并使用'gray'作为colormap参数,以使其成为灰度图像。
可以应用不同的伪彩色方案来增强图像数据的对比度。如果没有提供colormap值,将使用默认值'viridis'。让看看它如何影响图像。
plt.imshow(grayscale_img)
有许多colormap值可供选择并应用到图像中。有关colormap值的更多信息,可以访问:
让看看在应用'hot'的cmap值后图像如何变化。还将保存更改后的图像到文件中。如果没有提供文件的路径,它将被保存在当前工作目录中。
plt.imshow(grayscale_img, cmap='hot')
plt.savefig("New_Image.png")
执行上述代码后,一个名为‘New_Image.png’的新图像文件被创建并存储在当前工作目录中。
plt.hist(img.ravel())