ROI = img[x1: x2, y1: y2]
其中各参数的含义如下:
ROI:提取的感兴趣区域的结果
img:待提取的感兴趣区域所在的图像
x1:感兴趣区域在原图像中左上角的x坐标
x2:感兴趣区域在原图像中右下角的x坐标
y1:感兴趣区域在原图像中左上角的y坐标
y2:感兴趣区域在原图像中右下角的y坐标
通过这种提取ROI区域的方式为浅拷贝。浅拷贝只是建立了一个访问图像数据的变量。通过这种方式访问的是原图像,如果改变了感兴趣区域的数据,原图像也会发生改变。
通过“=”进行赋值的方式都是浅拷贝,在实际应用中要尽量避免直接在原图像上进行操作。
深拷贝在创建变量的同时会在内存中分配新的地址,用于存储数据,因此通过原变量访问的数据地址和通过新变量访问的数据地址不相同,即使改变了其中一个,另一个也不会改变。深拷贝可以通过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()