OpenCV学习笔记(六)——感兴趣区域ROI(浅拷贝与深拷贝的区别)


有时我们只对一张图像中的部分区域感兴趣,而原图像又比较大,如果带着非感兴趣区域一起处理会占用大量的内存,因次我们希望从原图像中截取部分图像后再进行处理。我们将这个区域称为感兴趣区域(Region Of Interest, ROI),Python中的ROI可以通过NumPy中的索引实现。但是通过索引获取ROI的方式为浅拷贝。下文将分别介绍浅拷贝和深拷贝的方式以及其区别。

1 浅拷贝

ROI = img[x1: x2, y1: y2]

其中各参数的含义如下:
ROI:提取的感兴趣区域的结果
img:待提取的感兴趣区域所在的图像
x1:感兴趣区域在原图像中左上角的x坐标
x2:感兴趣区域在原图像中右下角的x坐标
y1:感兴趣区域在原图像中左上角的y坐标
y2:感兴趣区域在原图像中右下角的y坐标

通过这种提取ROI区域的方式为浅拷贝。浅拷贝只是建立了一个访问图像数据的变量。通过这种方式访问的是原图像,如果改变了感兴趣区域的数据,原图像也会发生改变。

通过“=”进行赋值的方式都是浅拷贝,在实际应用中要尽量避免直接在原图像上进行操作。

2 深拷贝

深拷贝在创建变量的同时会在内存中分配新的地址,用于存储数据,因此通过原变量访问的数据地址和通过新变量访问的数据地址不相同,即使改变了其中一个,另一个也不会改变。深拷贝可以通过copy()函数实现。

a = b.copy()

其中各参数的含义如下:
a:拷贝结果
b:原拷贝区域。

示例代码

import cv2 as cv
import sys


if __name__ == '__main__':
    # 读取图像并判断是否读取成功
    img = cv.imread('../images/sky.jpg')
    BDD = cv.imread('../images/BDD.jpg')
    if img is None or BDD is None:
        print('Failed to read sky.jpg or BDD.jpg.')
        sys.exit()
    mask = cv.resize(BDD, (20, 20))
    # 深拷贝
    img1 = img.copy()
    # 浅拷贝
    img2 = img
    # 截取图像的ROI区域
    ROI = img[30: 150, 30: 150]
    # 深拷贝
    ROI_copy = ROI.copy()
    # 浅拷贝
    ROI1 = ROI
    img[100: 120, 100: 120] = mask
    # 展示结果
    cv.imshow('img + BDD1', img1)
    cv.imshow('img + BDD2', img2)
    cv.imshow('ROI copy1', ROI_copy)
    cv.imshow('ROI copy2', ROI1)

    # 在图像中绘制圆形
    img = cv.circle(img, (100, 100), 10, (0, 0, 255), -1)
    # 展示结果
    cv.imshow('img + circle1', img1)
    cv.imshow('img + circle2', img2)
    cv.imshow('ROI circle1', ROI_copy)
    cv.imshow('ROI circle2', ROI1)
    cv.waitKey(0)
    cv.destroyAllWindows()

代码运行结果如下图所示。
在这里插入图片描述
下一篇将会介绍OpenCV中窗口交互操作。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值