趋近智
生成合成图像时会使用Python和几个标准库。NumPy用于数值运算,是处理像素数据所必需的。Pillow(Python图像库PIL的一个分支)用于图像处理任务,例如创建、保存和修改图像。
在开始生成图像之前,您需要确保已安装所需的工具。如果您的Python已配置好,通常可以使用Python的包安装器pip来安装这些库。打开您的终端或命令行界面并运行:
pip install numpy Pillow
此命令会下载并安装NumPy和Pillow,使它们可以在您的Python脚本中使用。
图像,特别是数字图像,本质上是像素网格。我们可以使用多维数组表示这些网格。对于彩色图像,这通常是一个三维数组:(height, width, color_channels)。颜色通道通常代表红、绿、蓝(RGB)值,每个通道的取值范围通常为0到255。
我们来创建一个小而简单的图像:一个100x100像素的黑色背景,中央有一个50x50的红色正方形。
import numpy as np
from PIL import Image
# 定义图像尺寸
height = 100
width = 100
channels = 3 # RGB
# 使用NumPy全零数组创建黑色背景
# 数据类型'uint8'是8位像素值(0-255)的标准类型
image_array = np.zeros((height, width, channels), dtype=np.uint8)
# 定义红色正方形的坐标
# 左上角 (y1, x1) 和右下角 (y2, x2)
y1, x1 = 25, 25
y2, x2 = 75, 75
# 定义红色 (R=255, G=0, B=0)
red_color = [255, 0, 0]
# 用红色填充正方形区域
# 切片格式为 [起始行:结束行, 起始列:结束列]
image_array[y1:y2, x1:x2] = red_color
# 将NumPy数组转换为Pillow图像对象
img = Image.fromarray(image_array, 'RGB')
# 将图像保存到文件
img.save('simple_square.png')
# 可选:显示图像(行为可能取决于您的环境)
# img.show()
print("已生成图像 'simple_square.png'")
运行此脚本后,您会在同一目录下找到一个名为 simple_square.png 的文件。它将包含我们定义的带有红色正方形的黑色图像。这显示了编程如何直接控制像素值以生成特定的视觉模式。
添加随机噪声是图像处理中的常用技术,通常用于模拟传感器缺陷或作为数据增强的基本形式。我们来使用刚刚创建的红色正方形图像,并添加一些简单的“椒盐”噪声。这种噪声会随机引入白色(盐)和黑色(椒)像素。
import numpy as np
from PIL import Image
import random
# 加载之前创建的图像
try:
img = Image.open('simple_square.png')
image_array = np.array(img)
except FileNotFoundError:
print("错误:未找到 'simple_square.png'。请先运行示例1。")
exit()
# 定义噪声量(受影响像素的比例)
noise_amount = 0.05 # 影响5%的像素
# 获取图像尺寸
height, width, channels = image_array.shape
# 创建一个副本进行修改
noisy_image_array = image_array.copy()
# 添加盐噪声(白色像素)
num_salt = int(noise_amount * height * width * 0.5)
for _ in range(num_salt):
# 选择一个随机像素位置
y = random.randint(0, height - 1)
x = random.randint(0, width - 1)
# 将像素设为白色
noisy_image_array[y, x] = [255, 255, 255]
# 添加椒噪声(黑色像素)
num_pepper = int(noise_amount * height * width * 0.5)
for _ in range(num_pepper):
# 选择一个随机像素位置
y = random.randint(0, height - 1)
x = random.randint(0, width - 1)
# 将像素设为黑色
noisy_image_array[y, x] = [0, 0, 0]
# 将修改后的NumPy数组转换回Pillow图像对象
noisy_img = Image.fromarray(noisy_image_array, 'RGB')
# 保存带噪声的图像
noisy_img.save('noisy_square.png')
# noisy_img.show()
print("已生成带噪声的图像 'noisy_square.png'")
此脚本加载 simple_square.png,根据 noise_amount 计算要更改的像素数量,然后随机选择像素,一半设为白色,一半设为黑色。结果保存为 noisy_square.png,显示原始图像上布满了随机点。这模拟了一个简单的损坏过程,并生成了原始图像的一个略有不同的版本。
图像增强是指对现有图像应用变换,以创建略有修改的版本。这会增加数据集的多样性。虽然有时用于真实数据,但相同的技术也可以生成合成变体。我们来旋转一下原始的正方形图像。
import numpy as np
from PIL import Image
# 加载原始图像
try:
img = Image.open('simple_square.png')
except FileNotFoundError:
print("错误:未找到 'simple_square.png'。请先运行示例1。")
exit()
# 定义旋转角度
angle = 45 # 度
# 使用Pillow的rotate函数旋转图像
# 'expand=True' 允许图像画布扩展以适应旋转后的图像
rotated_img = img.rotate(angle, expand=True)
# 保存旋转后的图像
rotated_img.save('rotated_square.png')
# rotated_img.show()
print("已生成旋转后的图像 'rotated_square.png'")
这里,我们使用了Pillow的内置 rotate 方法。expand=True 参数很有用,因为将正方形图像旋转45度会使其变得更宽更高;expand=True 会调整图像边界,避免裁剪角部。输出文件 rotated_square.png 显示了我们的红色正方形倾斜了45度。
在此次实践中,您使用基本技术生成了简单的合成图像:
这些方法是根本性的。创建看起来真正逼真和多样的图像通常需要更复杂的方法,例如前面提到的渲染技术或高级机器学习模型,如生成对抗网络(GAN)或扩散模型,这些模型超出了本入门课程的范围。然而,了解这些基本组成部分,为理解合成图像生成的过程和挑战提供了一个好的起点。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造