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


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

相关推荐
sitellla4 分钟前
LocalAI:本地运行多模态 AI,它全包了
人工智能·其他
明哥聊AI6 分钟前
2026 AI Agent开发完全指南:从MCP协议到多Agent协作系统
人工智能
qiten_0077 分钟前
Selective PEFT:BitFit方法深度解析与实践
人工智能·深度学习
秋名山码民9 分钟前
拙见科技(陕西)——动态本体驱动的 超图Agentic RAG:拙见AI 面向 AI营销的企业认知系统
人工智能·科技
民乐团扒谱机11 分钟前
【微实验】从迷雾中看清世界:卡尔曼滤波的数学诗意与MATLAB实践
人工智能·算法·matlab·卡尔曼滤波·kalman
2zcode11 分钟前
基于MATLAB图像处理的细胞检测与计数分析系统设计与实现
图像处理·人工智能·matlab
字节跳动视频云技术团队20 分钟前
进球、切片、全网爆:如何打造一座跑赢热搜的赛事“AI短视频工厂”?
人工智能·音视频开发·直播
格林威23 分钟前
网口相机 vs USB相机:区别与适用场景(选型不再纠结)
人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉·工业相机
HackTwoHub29 分钟前
某单位 CMS 完整渗透链、SQL 注入→后台拿权→绕过宝塔 Waf 上线 shell
数据库·人工智能·sql·安全·网络安全·系统安全·安全架构
字节跳动视频云技术团队32 分钟前
拒绝被剧透!解密大型赛事直播背后的超低延迟黑科技
人工智能·音视频开发·直播