1. 学习目标
通过本章节的学习,你将能够:
- 熟练掌握图像的读取、显示与保存方法。
- 掌握在图像上绘制直线、圆、矩形及添加文字的技巧。
- 理解并实现像素级访问、图像属性获取及通道拆分合并。
- 掌握常用颜色空间(BGR、Gray、HSV)的转换。
- 深刻理解 OpenCV 加法运算与 Numpy 加法的区别,掌握图像混合技术。
2. 图像 IO 操作:读取、显示与保存
图像的 IO 操作是所有视觉任务的第一步。
| API 函数 | 功能描述 | 参数说明 |
|---|---|---|
| cv.imread() | 读取图像 | (路径, 读取方式):1为彩色,0为灰度 |
| cv.imshow() | 显示图像 | (窗口名, 图像对象) |
| cv.imwrite() | 保存图像 | (保存路径, 图像对象) |
注意 :OpenCV 默认读取的彩色图像通道顺序是 BGR ,而常见的显示库(如 Matplotlib)使用的是 RGB。
示例代码:读取与显示
python
import cv2 as cv
# 1. 读取图像 (1表示彩色模式)
img = cv.imread('lena.jpg', 1)
# 2. 显示图像
cv.imshow('Image Window', img)
# 3. 等待键盘输入并关闭窗口
cv.waitKey(0)
cv.destroyAllWindows()
# 4. 保存图像
cv.imwrite('my_save.png', img)
3. 绘制几何图形
在图像处理中,我们经常需要绘制标注框或文字。
| 绘制函数 | 核心参数 | 作用 |
|---|---|---|
| cv.line() | (img, start, end, color, thickness) |
绘制直线 |
| cv.circle() | (img, center, radius, color, thickness) |
绘制圆形 |
| cv.rectangle() | (img, upper_left, bottom_right, color, thickness) |
绘制矩形 |
| cv.putText() | (img, text, org, font, scale, color, thickness) |
添加文字 |
示例代码:绘制练习
python
import numpy as np
import cv2 as cv
# 创建一张黑色的空白图
img = np.zeros((512, 512, 3), np.uint8)
# 绘制一条蓝色的对角线
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
# 绘制一个绿色的矩形
cv.rectangle(img, (100, 100), (400, 400), (0, 255, 0), 3)
# 绘制一个红色的填充圆
cv.circle(img, (256, 256), 50, (0, 0, 255), -1)
# 添加白色的文字
cv.putText(img, 'OpenCV Drawing', (50, 450), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
cv.imshow('Drawing', img)
cv.waitKey(0)
4. 像素操作与图像属性
4.1 访问像素
我们可以像操作 Numpy 数组一样直接使用索引访问像素:
- 获取像素 :
px = img[100, 100](返回 BGR 三值) - 修改像素 :
img[100, 100] = [255, 255, 255]
python
px = img[100, 100] # 获取 (100, 100) 处的 BGR 值
img[100, 100] = [255, 255, 255] # 将该点修改为白色
4.2 图像属性
- img.shape:返回行数、列数、通道数。
- img.size:返回像素总数。
- img.dtype:返回图像数据类型(通常为 uint8)。
4.3 通道操作
- 拆分通道 :
b, g, r = cv.split(img) - 合并通道 :
img_merge = cv.merge((b, g, r))
4.4 色彩空间转换
常用的色彩空间变换方法:
- API :
cv.cvtColor(input_image, flag) - 常用标志 :
cv.COLOR_BGR2GRAY:BGR 转灰度图cv.COLOR_BGR2HSV:BGR 转 HSV 空间
python
# 拆分通道
b, g, r = cv.split(img)
# 合并通道
img_new = cv.merge((b, g, r))
# 色彩空间转换 (BGR 转 灰度)
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
5. 图像算术运算
5.1 图像加法:OpenCV vs Numpy
图像加法有两种常见方式,但它们的处理机制截然不同。
| 加法方式 | 运算逻辑 | 特点 | 示例 (250 + 10) |
|---|---|---|---|
| cv.add(x, y) | 饱和运算 | 结果超过 255 则固定为 255 | 255 |
| x + y (Numpy) | 模运算 | 结果超过 255 则对 256 取模 | 4 |
结论 :在处理图像亮度增强或叠加时,推荐使用 cv.add(),其视觉效果更自然。
python
import numpy as np
import cv2 as cv
x = np.uint8([250])
y = np.uint8([10])
print("OpenCV add:", cv.add(x, y)) # 输出 [[255]]
print("Numpy add:", x + y) # 输出 [4]
5.2 图像混合 (Image Blending)
图像混合实质上是带权重的加法,公式如下:
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) + γ g(x) = (1-\alpha)f_0(x) + \alpha f_1(x) + \gamma g(x)=(1−α)f0(x)+αf1(x)+γ
- API :
cv.addWeighted(img1, alpha, img2, beta, gamma) - 应用场景:实现图片的淡入淡出、透明度叠加等炫酷效果。
- 前提条件 :两幅图像的大小(Size)和类型(Type)必须完全一致。
python
import cv2 as cv
import matplotlib.pyplot as plt
# 读取两幅图像(需确保大小相同)
img1 = cv.imread('view.jpg')
img2 = cv.imread('rain.jpg')
# 图像混合:第一幅权重0.7,第二幅权重0.3,修正值0
res = cv.addWeighted(img1, 0.7, img2, 0.3, 0)
# 使用 matplotlib 显示结果 (需转换 BGR 为 RGB)
plt.imshow(res[:,:,::-1])
plt.title('Mixed Image')
plt.show()
6. 核心知识点总结
| 功能分类 | 常用 API | 关键点 |
|---|---|---|
| 基础 IO | imread, imshow |
注意 BGR 通道顺序 |
| 几何绘图 | line, rectangle, putText |
坐标格式为 (x, y) |
| 属性访问 | shape, split, merge |
获取尺寸与分拆通道 |
| 空间转换 | cvtColor |
BGR 转 Gray 或 HSV |
| 图像计算 | add, addWeighted |
OpenCV 加法是饱和运算 |
💡 温馨提示 :在使用
addWeighted混合图像前,如果两张图大小不一,请务必先使用cv.resize()将它们调整到相同的分辨率。
参考资料
黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程
感谢阅读!如果这篇文章对你有帮助,欢迎点赞、收藏并关注我,我们下期再见!