Python OpenCV 教程:新手也能学会的图像处理
简介
OpenCV (Open Source Computer Vision Library) 是一个强大的开源计算机视觉库,广泛应用于图像和视频处理领域。它支持多种编程语言,其中 Python 因其简洁的语法和丰富的生态系统,成为使用 OpenCV 进行图像处理的首选。本教程将引导你从零开始,学习如何使用 Python 和 OpenCV 进行基本的图像处理操作。
1. 安装 OpenCV
在开始之前,你需要安装 OpenCV 库。通常,我们还会一起安装 NumPy,因为 OpenCV 将图像数据存储为 NumPy 数组。
打开你的终端或命令提示符,运行以下命令:
bash
pip install opencv-python numpy
2. 加载和显示图片
图像处理的第一步是加载图片并将其显示出来。OpenCV 提供了 cv2.imread() 函数用于加载图片,cv2.imshow() 用于在窗口中显示图片。cv2.waitKey() 用于等待按键事件,cv2.destroyAllWindows() 则用于关闭所有 OpenCV 窗口。
为了确保代码可以运行,我们先创建一个简单的图片文件 input_image.jpg 如果它不存在的话。
“`python
import cv2
import numpy as np
创建一个用于演示的虚拟图片,如果 ‘input_image.jpg’ 不存在
try:
img = cv2.imread(‘input_image.jpg’)
if img is None:
raise FileNotFoundError
except FileNotFoundError:
print(“input_image.jpg 未找到。正在创建一个虚拟图片用于演示。”)
dummy_image = np.zeros((300, 500, 3), dtype=np.uint8) # 创建一个黑色图片
# 在图片上添加文字
cv2.putText(dummy_image, “Hello OpenCV!”, (50, 150), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 3)
cv2.imwrite(‘input_image.jpg’, dummy_image)
img = cv2.imread(‘input_image.jpg’)
加载图片
确保 ‘input_image.jpg’ 与你的 Python 脚本在同一目录下,或者提供完整路径
image = cv2.imread(‘input_image.jpg’)
检查图片是否成功加载
if image is None:
print(“错误:无法加载图片。请检查 ‘input_image.jpg’ 的路径是否正确。”)
else:
# 显示原始图片
cv2.imshow(‘原始图片’, image)
cv2.waitKey(0) # 等待直到有键被按下
cv2.destroyAllWindows() # 关闭所有 OpenCV 窗口
“`
3. 图片基本属性
在 OpenCV 中,图片被视为 NumPy 数组。你可以通过 NumPy 数组的属性访问图片的高度、宽度、通道数、总像素数和数据类型。
“`python
if image is not None:
# 获取图片维度 (高度, 宽度, 通道数)
print(f”图片形状: {image.shape}”) # (height, width, channels)
print(f”图片高度: {image.shape[0]} 像素”)
print(f”图片宽度: {image.shape[1]} 像素”)
if len(image.shape) == 3:
print(f”通道数: {image.shape[2]}”) # 3 代表彩色图片 (BGR), 1 代表灰度图
else:
print(“图片是灰度图 (1 个通道)。”)
# 获取总像素数
print(f"总像素数: {image.size}")
# 获取图片数据类型
print(f"数据类型: {image.dtype}") # 例如,uint8 代表 8 位无符号整数
“`
4. 保存图片
你可以使用 cv2.imwrite() 函数将处理后的图片保存到磁盘。文件格式由你提供的文件名后缀决定(例如 .jpg, .png)。
python
if image is not None:
# 保存图片
cv2.imwrite('saved_image.jpg', image)
print("图片已保存为 'saved_image.jpg'")
5. 灰度转换
将彩色图片转换为灰度图是常见的预处理步骤。你可以使用 cv2.cvtColor() 函数和 cv2.COLOR_BGR2GRAY 标志来实现。
“`python
if image is not None:
# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('灰度图片', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('grayscale_image.jpg', gray_image)
print("灰度图片已保存为 'grayscale_image.jpg'")
“`
6. 图片缩放
图片缩放对于多种应用至关重要,例如减小文件大小或为机器学习模型准备图片。cv2.resize() 函数允许你改变图片的尺寸。
“`python
if image is not None:
# 将图片缩放到固定宽度和高度
new_width = 200
new_height = 150
resized_image = cv2.resize(image, (new_width, new_height))
cv2.imshow('缩放后的图片', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('resized_image.jpg', resized_image)
print("缩放后的图片已保存为 'resized_image.jpg'")
# 按比例缩放图片 (保持宽高比)
scale_factor = 0.5 # 缩小到原来的一半
scaled_image = cv2.resize(image, None, fx=scale_factor, fy=scale_factor)
cv2.imshow('比例缩放图片', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('scaled_image.jpg', scaled_image)
print("比例缩放图片已保存为 'scaled_image.jpg'")
“`
7. 图片裁剪
裁剪允许你从图片中提取特定感兴趣区域 (ROI)。在 OpenCV 中,这通常通过 NumPy 数组切片来实现。
“`python
if image is not None:
# 定义感兴趣区域 (ROI) 的坐标
# 语法: image[startY:endY, startX:endX]
start_row, end_row = 50, 200
start_col, end_col = 100, 400
cropped_image = image[start_row:end_row, start_col:end_col]
cv2.imshow('裁剪后的图片', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('cropped_image.jpg', cropped_image)
print("裁剪后的图片已保存为 'cropped_image.jpg'")
“`
8. 图片模糊 (平滑)
模糊处理用于通过平均相邻像素值来减少图片中的噪声和细节。OpenCV 提供了多种模糊技术,例如高斯模糊。
“`python
if image is not None:
# 应用高斯模糊
# 内核大小 (宽度, 高度) 必须是正奇数
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
cv2.imshow('模糊图片', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('blurred_image.jpg', blurred_image)
print("模糊图片已保存为 'blurred_image.jpg'")
“`
9. 边缘检测
边缘检测是一种识别图片中物体边界的技术。Canny 边缘检测器是一种流行且鲁棒的算法。
“`python
if image is not None:
# 首先转换为灰度图进行边缘检测
gray_for_edges = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用 Canny 边缘检测器
# 两个阈值 (100, 200) 用于滞后过程
edges = cv2.Canny(gray_for_edges, 100, 200)
cv2.imshow('边缘检测图片', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('edges_image.jpg', edges)
print("边缘检测图片已保存为 'edges_image.jpg'")
“`
总结
本教程涵盖了使用 Python 和 OpenCV 进行图像处理的基础知识,包括:
- 安装 OpenCV 和 NumPy。
- 加载和显示 图片。
- 获取图片基本属性 (如尺寸、通道、数据类型)。
- 保存 处理后的图片。
- 将彩色图片转换为灰度图。
- 缩放 图片。
- 裁剪 图片的特定区域。
- 应用高斯模糊以平滑图片。
- 使用 Canny 算法进行边缘检测。
这些基本操作是许多更高级计算机视觉任务的基础。通过不断练习和探索 OpenCV 提供的其他功能,你将能够处理更复杂的图像处理挑战。
—I have generated the article as requested.