图像处理是计算机视觉和机器学习领域的一项基础技能,Python凭借其丰富的库支持,成为这一领域的首选语言之一。本篇教学文章将通过一个简单的示例,介绍如何使用Python进行图像的基本操作,包括读取、颜色调整、尺寸调整和裁剪,并最终展示这些处理效果。我们将使用imageio
, numpy
, PIL
(Python Imaging Library的一个分支Pillow
)以及matplotlib
这几个库来完成任务。
准备工作
首先,确保你的环境中安装了必要的库。可以通过pip安装:
pip install imageio numpy pillow matplotlib
图像读取与基本信息获取
我们的示例将从读取一张名为panda.jpg
的图片开始。使用imageio.imread()
函数可以轻松实现这一点。
import imageio
# 读取图片
panda_jpg = imageio.imread("path_to_your_image/panda.jpg")
# 获取图片数据类型和尺寸
print("图片的数据类型:", panda_jpg.dtype)
print("(图片高度, 图片宽度, 通道数):", panda_jpg.shape)
图像颜色调整
接下来,我们将对图像的颜色进行调整,比如让图像变为偏红色调。这可以通过乘以一个颜色因子向量实现,然后转换数据类型保证值域正确。
import numpy as np
# 修改图片颜色
color_adjusted = (panda_jpg * [1, 0.5, 0.5] * 255).astype(np.uint8)
imageio.imwrite("panda_color_adjusted.jpg", color_adjusted)
这里,我们减半了绿色和蓝色通道的值,保留红色通道不变,从而使得图像整体偏向红色。
图像尺寸调整
调整图片大小是另一个常见需求,使用PIL.Image.resize()
方法可以方便地完成。
from PIL import Image
# 修改图片大小
resized_panda = np.array(Image.fromarray(panda_jpg).resize((new_width, new_height)))
resized_uint8 = resized_panda.astype(np.uint8)
imageio.imwrite("panda_resized.jpg", resized_uint8)
记得替换new_width
和new_height
为你想要的新尺寸。
图像裁剪
有时候我们只需要图像的一部分区域,这时就需要用到裁剪功能。
# 裁剪图片
cropped_panda = panda_jpg[y_start:y_end, x_start:x_end]
cropped_uint8 = cropped_panda.astype(np.uint8)
imageio.imwrite("panda_cropped.jpg", cropped_uint8)
确定好裁剪区域的坐标(x_start, y_start)
到(x_end, y_end)
即可。
展示处理结果
最后,我们可以使用matplotlib
来展示原始图像和处理后的图像,以便直观比较效果。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 显示图片
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
axs[0, 0].imshow(mpimg.imread("path_to_your_image/panda.jpg"))
axs[0, 0].set_title('Original')
axs[0, 0].axis('off')
axs[0, 1].imshow(mpimg.imread("panda_color_adjusted.jpg"))
axs[0, 1].set_title('Color Adjusted')
axs[0, 1].axis('off')
axs[1, 0].imshow(mpimg.imread("panda_resized.jpg"))
axs[1, 0].set_title('Resized')
axs[1, 0].axis('off')
axs[1, 1].imshow(mpimg.imread("panda_cropped.jpg"))
axs[1, 1].set_title('Cropped')
axs[1, 1].axis('off')
plt.tight_layout()
plt.show()
关于Axs
:
在matplotlib
库中,axs
通常是指一个Axes(单数形式为Ax)对象的数组,其中每个Axes对象代表图表中的一个子区或者说是绘图区域。当你需要在一个画布(Figure)上绘制多个图表或子图时,就会用到Axes对象。
plt.subplots(2, 2)
创建了一个2行2列的子图网格布局,这意味着整个画布将会被划分为4个独立的区域用于绘制不同的图像。返回的fig
是Figure
对象,代表整个画布,而axs
则是一个二维数组,包含了这四个子图的Axes
对象。数组的索引按照先行后列的顺序排列,例如axs[0, 0]
对应于第一行第一列的子图,axs[1, 1]
则对应第二行第二列的子图。
通过上述步骤,你不仅学会了如何使用Python进行基本的图像处理操作,还能直观地看到处理前后的对比效果,这对于深入学习图像处理技术是非常有帮助的。希望这篇教程能成为你探索计算机视觉世界的起点!
综合示例
import imageio.v2 as imageio
import numpy
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 读取图片
panda_jpg = imageio.imread("\\resource\\panda.jpg")
print("图片的数据类型:", panda_jpg.dtype) # 获取图片数据类型
img_shape = panda_jpg.shape # 获取图片大小
print("(图片大小,通道数):", img_shape)
# 修改图片颜色并保存为uint8类型
color_adjusted = (panda_jpg * [1, 0.5, 0.5]).astype(numpy.uint8)
imageio.imwrite("panda_mc.jpg", color_adjusted)
# 修改图片大小并转换为uint8类型后保存
resized_panda = numpy.array(Image.fromarray(panda_jpg).resize((120, 70)))
resized_uint8 = resized_panda.astype(numpy.uint8)
imageio.imwrite("panda_ms.jpg", resized_uint8)
# 裁剪图片并保存为uint8类型
cropped_panda = panda_jpg[50:130, 100:240]
cropped_uint8 = cropped_panda.astype(numpy.uint8)
imageio.imwrite("panda_mi.jpg", cropped_uint8)
plt.figure() # 设置figure的大小,可选
# 显示原图
plt.subplot(2, 2, 1)
panda_jpg1 = mpimg.imread("\\resourse\\panda.jpg")
plt.imshow(panda_jpg1)
plt.axis('off')
# 显示修改颜色后的图片
plt.subplot(2, 2, 2)
panda_jpg2 = mpimg.imread("panda_mc.jpg")
plt.imshow(panda_jpg2)
plt.axis('off')
# 显示修改尺寸后的图片
plt.subplot(2, 2, 3)
panda_jpg3 = mpimg.imread("panda_ms.jpg")
plt.imshow(panda_jpg3)
plt.axis('off')
# 显示裁剪后的图片
plt.subplot(2, 2, 4)
panda_jpg4 = mpimg.imread("panda_mi.jpg")
plt.imshow(panda_jpg4)
plt.axis('off')
plt.tight_layout() # 自动调整子图参数, 使之填充整个图像区域
plt.show()