目录
1 浅拷贝2 深拷贝示例代码有时我们只对一张图像中的部分区域感兴趣,而原图像又比较大,如果带着非感兴趣区域一起处理会占用大量的内存,因次我们希望从原图像中截取部分图像后再进行处理。我们将这个区域称为感兴趣区域(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 cvimport sysif __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 = ROIimg[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中窗口交互操作。