专栏地址:『youcans 的 OpenCV 例程 300 篇』
【OpenCV 例程300篇】08. 图像的复制(np.copy)
使用 Numpy 的 np.copy() 函数可以进行图像的复制,不能通过直接赋值进行图像的复制。
函数说明:
arr = numpy.copy(img) # 返回一个复制的图像
参数说明:
- img:ndarray 多维数组,表示一个灰度或彩色图像
注意事项:
- Python 中的 “复制” 有无拷贝、浅拷贝和深拷贝之分,无拷贝相当于引用,浅拷贝只是对原变量内存地址的拷贝,深拷贝是对原变量(ndarray数组)的所有数据的拷贝。
- Numpy 直接赋值是无拷贝,np.copy() 方法是深拷贝,切片操作是特殊的浅拷贝。
- 直接赋值得到的新图像相当于引用,改变新图像的值时原图像的值也发生改变;np.copy() 方法复制图像(ndarray数组)得到的新图像才是深拷贝,改变复制图像的形状或数值,原来图像并不会发生改变。
基本例程:
# 1.15 图像的复制
img1 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 读取彩色图像(BGR)
img2 = img1.copy()
print("img2=img1.copy(), img2 is img1?", img2 is img1)
for col in range(100):
for row in range(100):
img2[col, row, :] = 0
img3 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 读取彩色图像(BGR)
img4 = img3
print("img4=img3, img4 is img3?", img4 is img3)
for col in range(100):
for row in range(100):
img4[col, row, :] = 0
cv2.imshow("Demo1", img1) # 在窗口显示图像
cv2.imshow("Demo2", img2) # 在窗口显示图像
cv2.imshow("Demo3", img3) # 在窗口显示图像
cv2.imshow("Demo4", img4) # 在窗口显示图像
key = cv2.waitKey(0) # 等待按键命令
本例程中,img4=img3 直接赋值,改变 img4 的数值后 img3 的数值也被改变了;img2 = img1.copy(),改变 img2 的数值后 img1 并未发生改变。
本例程的运行结果如下,使用 np.copy() 方法得到的新图像才是深拷贝。
img2=img1.copy(), img2 is img1? False
img4=img3, img4 is img3? True
(本节完)
【第1章:图像的基本操作】
06. 像素的编辑(img.itemset)
07. 图像的创建(np.zeros)
08. 图像的复制(np.copy)
09. 图像的裁剪(cv2.selectROI)
10. 图像的拼接(np.hstack)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125112487)
Copyright 2022 youcans, XUPT
Crated:2021-11-18