如何使用Python进行基本的图像处理

图像处理是计算机视觉和机器学习领域的一项基础技能,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_widthnew_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个独立的区域用于绘制不同的图像。返回的figFigure对象,代表整个画布,而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()

结果

在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值