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

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

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


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

相关推荐
匠测AI说11 分钟前
AI for Testing 提效实战 · 执行自动化(五):这次该跑哪些用例,让 AI 圈回归范围
人工智能·测试
PingCAP1 小时前
从一句需求到一套可追溯机制:我们这样推进电子病历改造
人工智能·agent·工作流引擎
PingCAP1 小时前
平凯星辰刘松:稳定交付严肃任务正成为企业级智能体的重要考验
人工智能·agent·工作流引擎
米小虾2 小时前
模型即 Agent?那 Harness 还有用吗
人工智能·agent
米小虾2 小时前
Harness 五要素:从"能跑"到"可靠"
人工智能·agent
孟健2 小时前
LLM API 安全防线:从 OpenCode 盗刷事件到 LiteLLM 多模型容灾实操
人工智能·后端·架构
程序员cxuan2 小时前
我用 WorkBuddy + ima 把公众号文章做成了知识库。
人工智能·后端·程序员
Code_Artist2 小时前
AI 终于学会写正确的汉字了?GPT Image 2.0 到底做对了什么?
人工智能·chatgpt·openai
程序员cxuan3 小时前
玩了一天 REA,我号快没了
人工智能·后端·程序员