【OpenCV 实战】图像基础操作与算术运算:从像素访问到图像混合

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 色彩空间转换

常用的色彩空间变换方法:

  • APIcv.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)+γ

  • APIcv.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入门教程


感谢阅读!如果这篇文章对你有帮助,欢迎点赞、收藏并关注我,我们下期再见!

相关推荐
百家方案18 小时前
2026年AI+智慧景区全场景应用解决方案白皮书 - 全1648页下载
人工智能·智慧文旅·智慧景区
intcube18 小时前
让数据说话,让决策有据——构建闭环的数据驱动运营体系
大数据·人工智能·全面预算管理·财务规划
甄心爱学习18 小时前
【最优化】1-6章习题
人工智能·算法
code_pgf18 小时前
基于transformer的clip和blip之间的关系、原理、方法实现和直观可视化
人工智能·深度学习·transformer
PD我是你的真爱粉18 小时前
向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算
数据库·人工智能·算法
蕤葳-18 小时前
AI证书在面试中的价值分析
人工智能
SuperEugene18 小时前
Python 异步 async/await:为什么 AI 框架大量使用?| 基础篇
开发语言·人工智能·python
QYR_1118 小时前
预计2032年全球智能换电站市场销售额将突破62.88亿美元
人工智能·市场调研
我不是小upper18 小时前
相关≠因果!机器学习中皮尔逊相关检验的完整流程
人工智能·算法·机器学习
云烟成雨TD18 小时前
Spring AI 1.x 系列【28】基于内存和 MySQL 的多轮对话实现案例
java·人工智能·spring