使用实验数据分析:“ = ” 和“.copy()” 的区别【python-opencv】

822 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

前言

  最近总结了下三种复制图像的方法,也是在业务上经常会用到的同时也是在面试过程中会被提问的问题,这三种方式分别是:

  1. =
  2. .copy()

下面通过一系列实验比对进行剖析这三种方式的差异

比对实验

实验之前:
准备好实验数据,我们准备待测图像test.jpg。这张图像是一张纯蓝色RGB图像,图像信息如下:

  1. 图像shape = (480, 640, 3)
  2. 图像占用内存 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()进行图像复制。

附图

1111.jpg