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


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

相关推荐
一切尽在,你来3 分钟前
1.1 AI大模型应用开发和Langchain的关系
人工智能·langchain
Coder_Boy_10 分钟前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
Light6024 分钟前
智链未来:彭山物流园区从物理基建到数据智能体的全维度构建方案
人工智能·系统架构·数字孪生·智慧物流·实施路径·彭山项目
AI资源库27 分钟前
GLM-4.7-Flash模型深入解析
人工智能·语言模型
一切尽在,你来1 小时前
1.2 LangChain 1.2.7 版本核心特性与升级点
人工智能·langchain
LYFlied1 小时前
AI大时代下前端跨端解决方案的现状与演进路径
前端·人工智能
深蓝电商API1 小时前
图片验证码识别:pytesseract+opencv入门
人工智能·opencv·计算机视觉·pytesseract
.Katherine௰1 小时前
AI数字人模拟面试机器人
人工智能
光影少年1 小时前
AI 前端 / 高级前端
前端·人工智能·状态模式
zhangshuang-peta1 小时前
OpenCode vs Claude Code vs OpenAI Codex:AI编程助手全面对比
人工智能·ai agent·mcp·peta