ROI = Region of Interest(感兴趣区域),在 OpenCV/图像处理中就是截取图片的一部分,numpy 数组的切片语法是核心!

先记住核心规则(最重要)

数组[ 起始行 : 结束行 , 起始列 : 结束列 ]

对应图像:

img[ y1:y2 , x1:x2 ]
  • 行 = 高度 = y 轴
  • 列 = 宽度 = x 轴

一、入门:最简单的 ROI 截取

import numpy as np
# 创建一个 6x6 测试数组(模拟图像)
img = np.arange(36).reshape(6,6)
print("原始数组:")
print(img)
# ====================
# 【入门1】截取固定区域 ROI
# ====================
# 截取 行1~行4,列2~列5
roi = img[1:5, 2:6]
print("\n截取 ROI(行1-4,列2-5):")
print(roi)

二、基础:彩色图像(3通道)ROI

# 创建 400x400 彩色图
img = np.zeros((400,400,3), dtype=np.uint8)
# ====================
# 截取 ROI:y1:y2, x1:x2
# ====================
roi = img[50:200, 100:300]  # 高50→200,宽100→300
print("ROI 形状:", roi.shape)  # (150行, 200列, 3通道)

三、进阶1:修改 ROI

ROI 是原图的视图,不是副本,改 ROI = 改原图!

import numpy as np
img = np.zeros((300,300,3), np.uint8)
# 截取ROI
roi = img[50:150, 50:250]
# 把ROI改成纯红色
roi[:,:] = [0,0,255]  # 全部赋值
# 查看原图 → 已经被修改!
print(img[50,50])  # [0,0,255]

四、进阶2:复制 ROI(独立副本,不影响原图)

# 方法1:.copy()
roi = img[50:150,50:150].copy()
# 方法2:np.copy()
roi = np.copy(img[50:150,50:150])
# 现在修改 roi 不会影响原图!
roi[:,:] = [0,255,0]

五、高阶1:ROI 叠加 / 粘贴

import numpy as np
# 创建大图 + 小图
img = np.zeros((400,400,3), np.uint8)
logo = np.ones((100,100,3), np.uint8) * 255  # 白色小图
# ====================
# 把小图粘贴到大图的 ROI 位置
# ====================
img[50:150, 50:150] = logo

六、高阶2:ROI 按条件提取(掩码提取)

img = np.random.randint(0,255,(200,200,3), np.uint8)
# 提取红色通道 > 100 的区域
mask = img[:,:,2] > 100
# 只保留满足条件的区域
roi = img[mask]

七、高阶3:ROI 边缘扩展(padding)

# 给ROI周围加10像素黑色边框
img = np.zeros((200,200,3), np.uint8)
roi = img[50:100,50:100]
# 上下左右各扩展10像素,填充黑色
roi_pad = np.pad(roi, ((10,10),(10,10),(0,0)), mode='constant')

八、高阶4:ROI 批量裁剪(循环批量截取)

img = np.zeros((500,500,3), np.uint8)
rois = []
# 循环截取多个ROI
for y in range(0,500,100):
for x in range(0,500,100):
roi = img[y:y+100, x:x+100]
rois.append(roi)

九、超实用:OpenCV 图像 ROI 完整示例

import cv2
import numpy as np
# 读取图片
img = cv2.imread("test.jpg")
height, width = img.shape[:2]
# ====================
# 1. 截取人脸区域(模拟)
# ====================
x1, y1 = 100, 80
x2, y2 = 300, 350
face_roi = img[y1:y2, x1:x2]
# ====================
# 2. 把ROI区域调亮
# ====================
face_roi = cv2.add(face_roi, 50)
# ====================
# 3. 粘贴回原图
# ====================
img[y1:y2, x1:x2] = face_roi
# 显示
cv2.imshow("ROI结果", img)
cv2.waitKey(0)

十、ROI 常见错误总结

  1. 越界报错
    img[500:600, 100:200]  # 图片只有400高,会报错
    
  2. 形状不匹配
    img[50:100,50:100] = roi  # roi必须是 50x50
    
  3. 修改ROI同步改原图
    → 必须用 .copy()

最终总结(最核心)

# 截取
roi = img[y1:y2, x1:x2]
# 独立副本
roi = img[...].copy()
# 粘贴
img[y1:y2, x1:x2] = roi
# 通道
roi = img[..., 2]  # 红色通道

到此这篇关于NumPy ROI区域操作的详细教程的文章就介绍到这了,更多相关NumPy ROI区域操作内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。