在了解了数字图像如何通过像素、色彩空间和坐标系统构建之后,我们现在转向一项主要实践任务:将图像数据从文件导入到程序中,并将修改后的图像保存回文件。大多数计算机视觉任务都以加载图像开始,并以保存处理后的图像或从中提取信息结束。我们将使用Python中流行的OpenCV库来执行这些操作。请确保您的开发环境中已安装OpenCV。通常,您会在Python脚本中这样导入它:import cv2 import numpy as np # OpenCV图像是NumPy数组,因此我们经常需要NumPy从文件读取图像OpenCV中用于加载图像的主要函数是cv2.imread()。它的基本用法很简单:您提供图像文件的路径即可。# 示例:加载同目录下的'photo.jpg'图像 image_path = 'photo.jpg' img = cv2.imread(image_path) # 检查图像是否成功加载是一个好习惯 if img is None: print(f"错误:无法读取位于{image_path}的图像文件") else: print("图像加载成功!") # 您现在可以处理'img'变量了 # 例如,打印其尺寸(高、宽、通道数) print(f"图像尺寸: {img.shape}")理解cv2.imread():filename (字符串): 第一个参数是图像文件的路径(例如,'images/cat.png','/home/user/data/input.bmp')。此路径可以是相对路径或绝对路径。flags (整数, 可选): 第二个参数指定图像应如何读取。它控制加载图像的色彩格式。一些常用的标志是:cv2.IMREAD_COLOR (或 1): 以BGR(蓝、绿、红)色彩格式加载图像。如果您不指定标志,这是默认标志。任何透明度信息(alpha通道)都将被忽略。cv2.IMREAD_GRAYSCALE (或 0): 以灰度加载图像。每个像素将具有一个单一的强度值。cv2.IMREAD_UNCHANGED (或 -1): 按原样加载图像,如果存在,则包含任何alpha通道(用于透明度)。这对于支持透明度的PNG等格式非常有用。# 加载灰度图像 img_gray = cv2.imread('photo.jpg', cv2.IMREAD_GRAYSCALE) if img_gray is not None: print(f"灰度图像尺寸: {img_gray.shape}") # 通常会显示(高, 宽) # 加载可能带alpha通道的图像 img_rgba = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED) if img_rgba is not None: print(f"图像尺寸(带alpha通道?): {img_rgba.shape}") # 可能会显示(高, 宽, 4)返回值: 如果图像成功加载,cv2.imread()会返回一个包含像素数据的NumPy数组。此数组的结构取决于所使用的标志:对于cv2.IMREAD_COLOR,它通常是一个形状为(高, 宽, 3)的3D数组,代表BGR通道。对于cv2.IMREAD_GRAYSCALE,它是一个形状为(高, 宽)的2D数组。对于cv2.IMREAD_UNCHANGED,它可以是2D或3D数组,如果图像具有透明度,则可能包含4个通道(例如,BGRA)。重要提示: 如果OpenCV无法读取文件(例如,文件不存在、已损坏或权限不正确),cv2.imread()将返回None。请务必检查返回值,以避免后续代码中出现错误。将图像写入文件在处理图像后(我们将在后续章节中介绍),您通常需要保存结果。OpenCV中用于此目的的函数是cv2.imwrite()。# 假设'processed_img'是一个包含图像数据的NumPy数组 output_path = 'processed_photo.png' success = cv2.imwrite(output_path, processed_img) if success: print(f"图像已成功保存到{output_path}") else: print(f"错误:无法将图像保存到{output_path}") # 您也可以保存我们之前加载的灰度图像 if img_gray is not None: cv2.imwrite('photo_grayscale.jpg', img_gray)理解cv2.imwrite():filename (字符串): 第一个参数是输出图像所需的路径和文件名。文件格式由您提供的扩展名(例如,.jpg、.png、.bmp、.tif)决定。OpenCV会根据此扩展名对图像进行适当编码。img (NumPy数组): 第二个参数是您要保存的图像数据(NumPy数组)。params (可选): 您可以提供可选参数来控制保存过程,例如JPEG文件的压缩质量。这更进阶,对于基本任务通常不需要。返回值: 如果图像成功保存,该函数返回True,否则返回False(例如,路径无效、权限不正确、文件扩展名不受支持)。文件格式和注意事项:JPEG (.jpg, .jpeg): 一种有损压缩格式。适用于照片,文件大小较小,但会丢失一些图像细节。保存时通常可以指定质量参数(0-100)。PNG (.png): 一种无损压缩格式。保留所有图像细节并支持透明度(alpha通道)。通常比JPEG文件更大,特别是对于摄影图像。BMP (.bmp): 未压缩格式。文件大,但确保无数据丢失。TIFF (.tif, .tiff): 灵活的格式,可以是有损或无损,支持多层。常用于科学成像。格式的选择取决于您的需要:对于关注文件大小的普通照片,使用JPEG;当需要完美细节或透明度时,使用PNG;对于特定的归档或科学目的,使用BMP或TIFF。通过掌握cv2.imread()和cv2.imwrite(),您将能够与图像文件交互,将表示为NumPy数组的像素数据加载到程序中进行分析和处理,并保存结果以供后续使用或显示。这构成了几乎所有计算机视觉工作流程的输入/输出根本部分。下一节将提供实践机会,以了解这些函数和加载图像的属性。