【OpenCV 入门到精通 05】核心操作与像素处理:ROI、运算与性能优化

【OpenCV 入门到精通 05】核心操作与像素处理:ROI、运算与性能优化

标签 :OpenCV ROI 图像运算 位运算 性能优化 NumPy

难度 :⭐⭐ | 阅读时长 :约 60 分钟 | 系列 :第 05/12 集

前置 :04 视频与绘图 | 下一集 :06 颜色与几何


写在前面

掌握像素级操作是图像处理的根基。本集对应官方 3_1 图像基本操作、3_2 图像运算、3_3 性能优化,涵盖 ROI、通道分离、算术/位运算和性能调优。


本集学习目标

  • 使用 ROI 裁剪和操作图像区域
  • 进行通道分离与合并
  • 掌握图像算术运算和位运算
  • 了解 OpenCV 性能优化技巧

文章目录

  • [【OpenCV 入门到精通 05】核心操作与像素处理:ROI、运算与性能优化](#【OpenCV 入门到精通 05】核心操作与像素处理:ROI、运算与性能优化)
    • 写在前面
    • 本集学习目标
    • [5.1 ROI 区域操作](#5.1 ROI 区域操作)
    • [5.2 通道分离与合并](#5.2 通道分离与合并)
    • [5.3 图像算术运算](#5.3 图像算术运算)
    • [5.4 位运算](#5.4 位运算)
    • [5.5 性能优化](#5.5 性能优化)
      • [1. 避免频繁 split/merge](#1. 避免频繁 split/merge)
      • [2. 使用 numpy 向量化](#2. 使用 numpy 向量化)
      • [3. 测量执行时间](#3. 测量执行时间)
      • [4. 使用合适数据类型](#4. 使用合适数据类型)
    • [5.6 踩坑指南](#5.6 踩坑指南)
    • [5.7 本集小结](#5.7 本集小结)

5.1 ROI 区域操作

ROI(Region of Interest)= 感兴趣区域。

python 复制代码
import cv2

img = cv2.imread("photo.jpg")
# 裁剪 ROI:注意 [y1:y2, x1:x2]
roi = img[100:300, 200:400]

# 修改 ROI 会影响原图(共享内存)
roi[:] = (0, 255, 0)

# 安全复制
roi_copy = img[100:300, 200:400].copy()

粘贴小图到大图

python 复制代码
img = cv2.imread("background.jpg")
logo = cv2.imread("logo.png")
lh, lw = logo.shape[:2]
img[50:50+lh, 100:100+lw] = logo

5.2 通道分离与合并

python 复制代码
b, g, r = cv2.split(img)
zeros = np.zeros(b.shape, dtype=np.uint8)

# 只显示红色通道
red_only = cv2.merge([zeros, zeros, r])

# 更快的方式
img[:,:,0] = 0  # 蓝色通道置零
img[:,:,1] = 0  # 绿色通道置零
操作 函数
分离 cv2.split(img) → B, G, R
合并 cv2.merge([b,g,r])
颜色转换 cv2.cvtColor(img, flag)

5.3 图像算术运算

python 复制代码
import cv2
import numpy as np

img1 = cv2.imread("a.jpg")
img2 = cv2.imread("b.jpg")

# 加法(饱和到 255)
result = cv2.add(img1, img2)

# 加权混合(透明度)
blended = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

# 标量运算
bright = cv2.add(img1, np.ones(img1.shape, dtype=np.uint8) * 50)
运算 OpenCV 函数 NumPy 区别
加法 cv2.add img1+img2 cv2 饱和截断,numpy 取模
减法 cv2.subtract img1-img2 同上
乘法 cv2.multiply img1*img2 同上
混合 cv2.addWeighted - 加权求和

⚠️ 图像运算要求两图 尺寸相同。


5.4 位运算

用于掩码操作、图像合成:

python 复制代码
# 创建掩码
mask = np.zeros(img.shape[:2], dtype=np.uint8)
cv2.rectangle(mask, (100,100), (300,300), 255, -1)

# 按位与:提取 ROI
roi = cv2.bitwise_and(img, img, mask=mask)

# 按位或:合并
combined = cv2.bitwise_or(img1, img2)

# 按位非:反转
inverted = cv2.bitwise_not(img)
运算 作用
bitwise_and 提取掩码区域
bitwise_or 合并图像
bitwise_xor 差异检测
bitwise_not 反转

5.5 性能优化

1. 避免频繁 split/merge

python 复制代码
# 慢
b, g, r = cv2.split(img)
b[:] = 0
img = cv2.merge([b, g, r])

# 快
img[:,:,0] = 0

2. 使用 numpy 向量化

python 复制代码
# 慢:逐像素循环
for i in range(h):
    for j in range(w):
        img[i,j] = img[i,j] * 1.5

# 快:向量化
img = np.clip(img.astype(np.float32) * 1.5, 0, 255).astype(np.uint8)

3. 测量执行时间

python 复制代码
import time

start = time.time()
# ... 你的代码 ...
print(f"耗时: {(time.time()-start)*1000:.2f} ms")

# OpenCV 内置
e1 = cv2.getTickCount()
# ... 代码 ...
e2 = cv2.getTickCount()
time_ms = (e2 - e1) / cv2.getTickFrequency() * 1000

4. 使用合适数据类型

场景 推荐 dtype
显示/存储 uint8
中间计算 float32 / float64
避免 频繁 uint8↔float 转换

5.6 踩坑指南

坑 解决
ROI 修改影响原图 用 .copy()
add 结果异常 用 cv2.add 而非 +
两图尺寸不同 先 resize 到相同尺寸
运算溢出 cv2 函数自动饱和到 0~255

5.7 本集小结

主题 核心
ROI img[y1:y2, x1:x2]
通道 split / merge / cvtColor
运算 add addWeighted subtract
位运算 bitwise_and/or/not + mask
性能 向量化、避免循环、测时间

← 第04集 第06集:颜色与几何 →

参考:3_1 图像基本操作 | 3_3 性能优化

相关推荐
cpolar技术支持3 分钟前
listen(5) 只排得住 5 个连接:第 6 个客户端卡在 connect 超时,进程活着端口却显示假活不放行
python·socket·tcp·cpolar·故障排查
严肃小白兔4 分钟前
第 04/24 期:深度学习中的损失函数及其数学解释
人工智能·深度学习
无责任此方_修行中7 分钟前
「不止技术」AIE 2026 会后感悟
人工智能·后端·ai编程
BYSJMG23 分钟前
计算机毕业设计选题推荐:【基于深度学习的车辆损坏严重程度评估方法研究】ResNet50 图像分类
人工智能·深度学习·目标检测·机器学习·计算机视觉·分类·课程设计
梯度下降者1 小时前
我校学子斩获 2025 全国高新技术竞赛 Python 赛道全国一等奖
python·教育·竞赛·信息技术·人才培养
小小张说故事1 小时前
Python 的 memoryview 为什么能零拷贝:拆开 buffer protocol、cast 和那道 BufferError
python
在所不辞兄1 小时前
为什么在电池供电场景下,不能采用固定电压频率策略,而需要动态调整以最大化 Race-to-Sleep 收益?
人工智能·深度学习·神经网络·机器学习
jianqiang.xue1 小时前
3倍向量算力:Arm给最小MCU装上本地AI
arm开发·人工智能·单片机
北京迅为1 小时前
案例分享 | RK182X算力卡:多路视频VLM监控,四路画面AI同时看懂,一句人话说清现场
linux·人工智能·嵌入式·rk3588·算力卡·rk182x