第3章: 图像增强与色彩处理
在本章中,我们将探讨如何使用 Pillow 进行图像的增强和色彩处理。图像增强操作包括亮度、对比度、锐化等调整,而色彩处理涉及灰度转换、色调调整、通道操作等。
1.1 图像亮度调整
Pillow 提供了 ImageEnhance
模块,用于调节图像的亮度、对比度、颜色和锐度。亮度调整通过 ImageEnhance.Brightness
实现。
调整亮度
使用 Brightness
类创建增强对象,并调用 enhance()
方法传入亮度系数:
- 系数为
1.0
表示原始亮度; - 大于
1.0
会增加亮度; - 小于
1.0
会降低亮度。
from PIL import Image, ImageEnhance# 打开图像
image = Image.open("example.jpg")# 创建亮度增强对象
enhancer = ImageEnhance.Brightness(image)# 调整亮度
brighter_image = enhancer.enhance(1.5) # 增加亮度
brighter_image.show()darker_image = enhancer.enhance(0.5) # 降低亮度
darker_image.show()
案例:批量调整文件夹内所有图像的亮度
import osinput_folder = "images/"
output_folder = "brightened_images/"
brightness_factor = 1.3if not os.path.exists(output_folder):os.makedirs(output_folder)for filename in os.listdir(input_folder):if filename.endswith(".jpg") or filename.endswith(".png"):image = Image.open(os.path.join(input_folder, filename))# 增加亮度enhancer = ImageEnhance.Brightness(image)brightened_image = enhancer.enhance(brightness_factor)# 保存调整后的图像brightened_image.save(os.path.join(output_folder, filename))print(f"{filename} 亮度调整完成")
1.2 图像对比度调整
对比度调整可以增加图像的明暗差异,使图像显得更加清晰。使用 ImageEnhance.Contrast
类实现对比度增强。
调整对比度
对比度增强与亮度增强的操作类似:
- 系数为
1.0
表示原始对比度; - 大于
1.0
会增加对比度; - 小于
1.0
会降低对比度。
# 创建对比度增强对象
enhancer = ImageEnhance.Contrast(image)# 增加对比度
high_contrast_image = enhancer.enhance(1.5)
high_contrast_image.show()# 降低对比度
low_contrast_image = enhancer.enhance(0.8)
low_contrast_image.show()
1.3 图像颜色增强
颜色增强可以调整图像的色彩饱和度,从而改变图像的色彩效果。使用 ImageEnhance.Color
类实现。
调整色彩
- 系数为
1.0
表示原始色彩; - 大于
1.0
会增加饱和度; - 小于
1.0
会降低饱和度,趋向于黑白。
# 创建颜色增强对象
enhancer = ImageEnhance.Color(image)# 增加色彩饱和度
high_color_image = enhancer.enhance(1.8)
high_color_image.show()# 降低色彩饱和度
low_color_image = enhancer.enhance(0.3)
low_color_image.show()
1.4 图像锐化
图像锐化可以增加图像边缘的清晰度,使细节更加突出。使用 ImageEnhance.Sharpness
类来实现图像锐化。
调整锐度
- 系数为
1.0
表示原始锐度; - 大于
1.0
会增加锐度; - 小于
1.0
会使图像变得模糊。
# 创建锐化增强对象
enhancer = ImageEnhance.Sharpness(image)# 增加锐度
sharp_image = enhancer.enhance(2.0)
sharp_image.show()# 降低锐度
blurred_image = enhancer.enhance(0.5)
blurred_image.show()
1.5 灰度处理
将彩色图像转换为灰度图像,可以使图像失去色彩信息,仅保留亮度信息。灰度处理通常用于机器学习预处理和图像分析。
使用 convert()
方法转换为灰度图像
将图像模式设置为 L
,可以将彩色图像转换为灰度图像。
# 转换为灰度图像
gray_image = image.convert("L")
gray_image.show()
案例:批量将文件夹内所有图像转换为灰度图像
input_folder = "images/"
output_folder = "gray_images/"if not os.path.exists(output_folder):os.makedirs(output_folder)for filename in os.listdir(input_folder):if filename.endswith(".jpg") or filename.endswith(".png"):image = Image.open(os.path.join(input_folder, filename))# 转换为灰度图像gray_image = image.convert("L")# 保存灰度图像gray_image.save(os.path.join(output_folder, filename))print(f"{filename} 转换为灰度图像完成")
1.6 色彩通道操作
Pillow 提供了对图像中各个颜色通道(红色、绿色、蓝色)进行独立操作的功能。通过 split()
方法,可以分离图像的 RGB 通道,并对每个通道进行单独处理。
分离与合并通道
使用 split()
方法将图像分离为三个独立的通道,分别对应 R、G、B。然后可以对单个通道进行处理,并通过 merge()
方法将其重新合并为一张图像。
# 分离通道
r, g, b = image.split()# 对红色通道进行处理(如提高亮度)
r = r.point(lambda i: i * 1.2)# 合并通道
enhanced_image = Image.merge("RGB", (r, g, b))
enhanced_image.show()
案例:将图像的红色通道增强,使整体色调偏红
r, g, b = image.split()# 增强红色通道
r = r.point(lambda i: i * 1.5)# 合并图像
red_enhanced_image = Image.merge("RGB", (r, g, b))
red_enhanced_image.show()
1.7 色彩反转与阈值处理
色彩反转和阈值处理是常见的色彩操作。色彩反转可以生成负片效果,而阈值处理则可以生成黑白效果。
色彩反转
使用 ImageOps.invert()
可以对图像的每个像素进行反转操作。需要将图像转换为 RGB 模式才能应用此操作。
from PIL import ImageOps# 转换为 RGB 模式
rgb_image = image.convert("RGB")# 反转色彩
inverted_image = ImageOps.invert(rgb_image)
inverted_image.show()
阈值处理
阈值处理可以将图像转换为黑白图像,根据指定的阈值决定像素是变为黑色还是白色。
# 转换为灰度图像
gray_image = image.convert("L")# 应用阈值处理
threshold = 128
binary_image = gray_image.point(lambda x: 255 if x > threshold else 0, "1")
binary_image.show()
案例:批量对文件夹内的所有灰度图像应用阈值处理
input_folder = "gray_images/"
output_folder = "binary_images/"
threshold = 128if not os.path.exists(output_folder):os.makedirs(output_folder)for filename in os.listdir(input_folder):if filename.endswith(".jpg") or filename.endswith(".png"):gray_image = Image.open(os.path.join(input_folder, filename)).convert("L")# 应用阈值处理binary_image = gray_image.point(lambda x: 255 if x > threshold else 0, "1")# 保存二值化图像binary_image.save(os.path.join(output_folder, filename))print(f"{filename} 阈值处理完成")