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


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

相关推荐
栈底拾遗15 分钟前
AtomGit:国内唯一开源 + AI 一体化自主基础设施
人工智能·开源
Akir.weiwen20 分钟前
AI 总把红色用错地方?你需要一张“颜色使用说明书“
人工智能·设计规范
mykj155144 分钟前
AI景区抓拍系统搭建让旅游多一层乐趣
人工智能·旅游·景区ai抓拍系统·ai抓拍小程序
donoot1 小时前
《大话文渊慧典》:外二篇-Tesseract+OpenCV自制OCR,我写了三百个if-else,最后代码成了玄学
人工智能·aigc·文渊慧典·大话系列
延凡科技1 小时前
延凡科技电力数字化平台技术解析:从电力交易到虚拟电厂的全链路架构实践
人工智能·科技·物联网·架构·虚拟电厂·电力平台
Staticy1 小时前
Claude Code 接国产模型不能识图?一个 MCP 让纯文本模型也能看图
人工智能·ai编程·全栈
极梦网络无忧1 小时前
real-ai-editor:一款轻量、智能的纯前端 AI 富文本与 Markdown 编辑器
前端·人工智能·编辑器
phltxy1 小时前
LangChain v1 Agent核心能力详解
大数据·人工智能·langchain
吴佳浩1 小时前
AI 核心技术解析|OPD:大模型开始复制的不再是知识,而是判断力
人工智能·深度学习·llm
数智化管理手记2 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘