当前位置: 首页 > news >正文

OpenCV(十):NumPy中的ROI

感兴趣区域(Region of Interest, ROI)是一个核心概念,它允许我们专注于图像的特定子集进行分析或操作。在 Python 环境下,由于 OpenCV 将图像表示为NumPy 数组(numpy.ndarray,ROI 的实现和操作完全依赖于 NumPy 强大的切片和索引机制。

基本定义

ROI 是通过指定图像的行(高度)和列(宽度)范围来确定的。

坐标约定

OpenCV/NumPy 中图像的坐标系统遵循以下约定:

  • 原点: (0,0) 位于图像的左上角
  • 轴向:
    • **行(Row)**对应 Y 轴,向下递增(控制图像高度)。
    • **列(Column)**对应 X 轴,向右递增(控制图像宽度)。
  • 索引顺序: 在 NumPy 切片中,顺序始终是 Row→Column(即 Y→X)。

切片语法

使用标准的 NumPy 切片语法定义 ROI:

在这里插入图片描述

这里的范围是前闭后开区间:

  • ystart 到 yend−1 行。
  • xstart 到 xend−1 列。

示例: 要提取左上角点 (100,50),右下角点 (300,250) 的区域:

# 左上角 (x=100, y=50),右下角 (x=300, y=250)
x1, y1 = 100, 50
x2, y2 = 300, 250roi = image[y1:y2, x1:x2]

视图与副本

这是使用 NumPy 切片定义 ROI 时最重要的概念,直接影响数据处理的安全性和效率。

视图(View)—— 默认行为

默认情况下,通过切片操作获得的 roi 变量,并不是原始图像的一个独立副本,而是一个指向原始图像内存区域的视图(View)或引用

  • 优势: 极高的性能和内存效率,因为没有发生数据复制。
  • 后果:roi 数组的任何修改(例如改变像素值),都会同步反映到原始图像 image 的相应区域。

用途: 当需要直接在图像的特定区域上进行原地修改时,使用视图非常方便。

副本(Copy)—— 安全操作

如果希望对 ROI 进行修改,但同时保留原始图像不变,就必须显式地创建一个副本:

roi_copy = image[y1:y2, x1:x2].copy()

此时,对 roi_copy 的任何操作都不会影响原始图像 image

ROI 的操作与应用

区域赋值与修改

可以直接对 ROI 进行赋值操作,实现局部修改。这比循环遍历像素要快得多,因为它利用了 NumPy 的底层优化。

  • 设置颜色: image[y1:y2, x1:x2] = [B, G, R]

  • 粘贴图像: 将一个 ROI 区域复制并粘贴到另一个区域,实现对象克隆或移动:

    ball_roi = image[280:340, 330:390] # 提取球的 ROI
    image[273:333, 100:160] = ball_roi # 将球粘贴到新位置
    

性能优化与聚焦处理

在许多计算机视觉任务中(如人脸识别、目标跟踪),通常只需要处理图像的一个小区域。使用 ROI 可以极大地提高性能:

  • 减少计算量: 算法只需在较小的 ROI 矩阵上运行,而不是整个图像。
  • 提高准确性: 将算法聚焦在特定对象或特征上,避免背景干扰。

OpenCV 的辅助函数:cv2.selectROI()

弹出一个窗口,允许用户通过鼠标拖动选择一个矩形区域。

函数定义

retval = cv2.selectROI(windowName, img, showCrosshair=None, fromCenter=None)

参数说明:

  • windowName: (可选)显示图像的窗口名称。如果未指定,它会创建一个默认窗口。
  • img: 要选择 ROI 的原始图像(NumPy 数组)。
  • showCrosshair: (可选,默认为 True)如果为 True,在选择矩形中心显示十字线。
  • fromCenter: (可选,默认为 False)如果为 True,用户从中心点拖动来绘制矩形;如果为 False,用户从左上角拖动到右下角绘制矩形。

返回值 retval:

  • 成功选择: 返回一个包含矩形边界框信息的元组: (x, y, w, h)
    • x, y: ROI 矩形左上角的坐标(列索引,行索引)。
    • w: 宽度 (Width)。
    • h: 高度 (Height)。
  • 未选择或取消: 如果用户按 c 键或窗口关闭,返回值可能是一个包含四个零的元组 (0, 0, 0, 0)

示例

加载一个图像,使用 cv2.selectROI() 让用户选择一个区域,然后使用 NumPy 切片将该区域裁剪并显示出来。

import cv2
import numpy as np# 1. 准备图像 (使用纯色矩阵模拟加载图像)
# 实际应用中,请替换为 cv2.imread('your_image_path.jpg')
try:# 尝试加载一个不存在的文件,如果失败,则创建一个示例图像img = cv2.imread('test_image.jpg')if img is None:raise FileNotFoundError
except FileNotFoundError:print("未找到 'test_image.jpg',已创建示例图像。")# 创建一个 400x600 的蓝色图像作为示例img = np.zeros((400, 600, 3), dtype=np.uint8)img[:, :] = (255, 100, 0) # 设置为浅蓝色# 在图像中央画一个绿色矩形img[150:250, 250:350] = (0, 255, 0)# 设置窗口名称
WINDOW_NAME = "Select ROI - Press ENTER or SPACE to confirm"# 2. 调用 cv2.selectROI()
# 显示窗口并等待用户选择一个矩形区域
# 提示: 在选择完成后,请按 ENTER 或 SPACE 键确认。按 C 键取消。
roi_rect = cv2.selectROI(WINDOW_NAME, img, showCrosshair=True, fromCenter=False
)# 关闭 selectROI 窗口
cv2.destroyWindow(WINDOW_NAME)# 3. 解析返回值并裁剪图像# roi_rect 是 (x, y, w, h)
x, y, w, h = roi_rectprint(f"ROI 矩形坐标 (x, y, w, h): {roi_rect}")if w > 0 and h > 0:# 使用 NumPy 切片裁剪图像。# 注意:NumPy 切片的顺序是 [y_start:y_end, x_start:x_end]# y_start = y; y_end = y + h# x_start = x; x_end = x + wcropped_img = img[int(y):int(y+h), int(x):int(x+w)]# 4. 显示裁剪结果cv2.imshow("Cropped ROI Image", cropped_img)cv2.waitKey(0)
else:print("未选择有效的 ROI 区域或用户已取消。")cv2.destroyAllWindows()
http://www.dtcms.com/a/478473.html

相关文章:

  • Qt插件机制实现动态组件加载详解
  • 重大更新!基于VMD+Transformer-BiLSTM-CrossAttention 故障分类模型
  • YOLO系列——基于Ultralytics YOLOv11模型在C++ OpenCV DNN模块进行模型加载与推理(附源码)
  • 有哪些做统计销量的网站设计了网站
  • 做微信公众号的网站有哪些外贸网站建设团队
  • 广东省省考备考(第一百二十二天10.13)——资料分析、言语(强化训练)
  • MySQL中like模糊查询如何优化
  • 400G QSFP112 FR4光模块:高速数据中心互联的核心力量
  • 旅行商问题(TSP)(1)(Route.py)(TSP 问题中的点与路径核心类)
  • 学习笔记--文件上传
  • Leetcode 26
  • 淘宝领券网站怎么做上海工程咨询行业协会
  • 泰国网站域名wordpress建网站的优点
  • 解锁 JavaScript 字符串补全魔法:padStart()与 padEnd()
  • Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
  • TDengine 数学函数 DEGRESS 用户手册
  • 源码:Oracle AWR报告之Top 10 Foreground Events by Total Wait Time
  • 告别繁琐坐标,让公式“说人话”:Excel结构化引用完全指南
  • 【AI论文】CoDA:面向协作数据可视化的智能体系统
  • 从AAAI2025中挑选出对目标检测有帮助的文献——第六期
  • 【深度学习】反向传播
  • 网站开发交接新闻源发稿平台
  • 滴答时钟延时
  • 【C++篇】:ServiceBus RPC 分布式服务总线框架项目
  • 后训练——Post-training技术介绍
  • 获取KeyStore的sha256
  • Linux (5)| 入门进阶:Linux 权限管理的基础规则与实践
  • 常见压缩包格式详解:区别及在不同系统中的解压方式
  • 【数学 进制 数位DP】P9362 [ICPC 2022 Xi‘an R] Find Maximum|普及+
  • .net过滤器和缓存