【OpenCV 例程300篇】08. 图像的复制(np.copy)

专栏地址:『youcans 的 OpenCV 例程 300 篇』


【OpenCV 例程300篇】08. 图像的复制(np.copy)


使用 Numpy 的 np.copy() 函数可以进行图像的复制,不能通过直接赋值进行图像的复制。

函数说明:

arr = numpy.copy(img) # 返回一个复制的图像

参数说明:

  • img:ndarray 多维数组,表示一个灰度或彩色图像

注意事项:

  1. Python 中的 “复制” 有无拷贝、浅拷贝和深拷贝之分,无拷贝相当于引用,浅拷贝只是对原变量内存地址的拷贝,深拷贝是对原变量(ndarray数组)的所有数据的拷贝。
  2. Numpy 直接赋值是无拷贝,np.copy() 方法是深拷贝,切片操作是特殊的浅拷贝。
  3. 直接赋值得到的新图像相当于引用,改变新图像的值时原图像的值也发生改变;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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youcans_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值