python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > NumPy ROI区域操作

NumPy ROI区域操作的详细教程

作者:qq_16313575

本文介绍了OpenCV中ROI的概念及其在图像处理中的应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

对应图像:

img[ y1:y2 , x1:x2 ]

一、入门:最简单的 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区域操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文