前言
最近总结了下三种复制图像的方法,也是在业务上经常会用到的同时也是在面试过程中会被提问的问题,这三种方式分别是:
- =
- .copy()
下面通过一系列实验比对进行剖析这三种方式的差异
比对实验
实验之前:
准备好实验数据,我们准备待测图像test.jpg。这张图像是一张纯蓝色RGB图像,图像信息如下:
- 图像shape = (480, 640, 3)
- 图像占用内存 5431 Bit
实验一:计算耗时
调用time包进行计算从开始读取数据到复制完数据所消耗的时间,我们分别使用 方式1、2进行复制图像计算耗时:
“ = ” : 0.003245115280151367
“.copy()”: 0.005619525909423828
结论: t(=) < t(.copy())
实验代码:
import time import cv2 t1 = time.time() img1 = cv2.imread("test.jpg") img2 = img1 # img2 = img1.copy() t2 = time.time() t = t2 - t1 print(t) 复制代码
实验二:查看数据大小
使用sys
库获取对象的大小(以字节为单位),sys.getsizeof()进行获取对象的大小,这里大小是指加载的python对象(及其所有元数据)的大小:
“ = ” : 921736(此时复制图等于原图)
“.copy()”: 921736(此时复制图等于原图)
结论: t(=) = t(.copy())
实验代码:
import cv2 import sys img1 = cv2.imread("test.jpg") # img2 = img1 img2 = img1.copy() print(sys.getsizeof(img1)) print(sys.getsizeof(img2)) 复制代码
使用pympler
库,它提供了计算对象使用的RAM内存的工具,我们可以使用pympler
库进行查看运算这两种复制图像时所产生的RAM。
“ = ” : 921752(此时复制图等于原图)
“.copy()”: 921752(此时复制图等于原图)
结论: t(=) = t(.copy())
实验代码:
import cv2 from pympler import asizeof img1 = cv2.imread("test.jpg") img2 = img1 # img2 = img1.copy() print(asizeof.asizeof(img1)) print(asizeof.asizeof(img2)) 复制代码
存储复制图像
我们采用cv2.imwrite()把复制的图像进行存储,然后直接查看存储数据的属性得到其值进行比较。 “ = ” : 5431(此时复制图等于原图)
“.copy()”: 5431(此时复制图等于原图)
结论: t(=) = t(.copy())
实验代码:
import cv2 img1 = cv2.imread("1111.jpg") img2 = img1 # img2 = img1.copy() cv2.imwrite("savetest.jpg", img2) 复制代码
结论
从结果上来看,这两种复制图像并没有什么不同,在大多数情况下三可以通用的。如果业务逻辑上没有过多的重载的话可以使用=进行复制图像(节约时间);如果在业务逻辑上我们需要改变原图属性而复制的图像仅需保持与原图相同属性,则可以选择.copy()进行图像复制。
附图