OpenCV中的浅拷贝和深拷贝

news2024/9/25 15:27:31

文章目录

  • 前言
  • 一、浅拷贝
  • 二、深拷贝
  • 三、比较
  • 总结


前言

在数字图像处理中,针对读取到的一张图像,需要反复利用这张图像做各种的变换,以满足我们项目的需求。在这之前,最容易忽略的一点就是图像之间的拷贝问题,其中的浅拷贝和深拷贝不仅影响数据的存储方式,还直接关系到内存管理和数据修改的影响范围。

一、浅拷贝

浅拷贝是指创建一个新的对象,但这个新对象会引用原始对象中的数据(或指向原始数据的指针)。这意味着,如果原始数据发生变化,通过浅拷贝得到的数据也会发生变化,因为它们实际上指向的是同一块内存地址。

在OpenCV中,当使用赋值操作符(=)时,通常执行的是浅拷贝。

二、深拷贝

深拷贝则是创建一个全新的对象,并复制原始对象中的所有数据到新对象中。这样,原始对象和新对象拥有独立的内存地址和数据。因此,对原始对象的修改不会影响到通过深拷贝得到的新对象。

OpenCV的C++接口提供了clone()方法,但在Python中,可以直接使用NumPy的深拷贝机制。

三、比较

此处举一个简单的例子,当我们想在输入的图像中分别实现画矩形和画圆的操作时,首先我们定义两个函数用于绘制矩形和圆:

def draw_rectangle(image, top_left, bottom_right, color, thickness=2):
    """
    在图像上绘制矩形
    :param image: 要绘制的图像
    :param top_left: 矩形左上角的坐标 (x, y)
    :param bottom_right: 矩形右下角的坐标 (x, y)
    :param color: 矩形的颜色,格式为 (B, G, R)
    :param thickness: 矩形边框的厚度
    :return: 绘制了矩形的图像
    """
    cv2.rectangle(image, top_left, bottom_right, color, thickness)
    return image

def draw_circle(image, center, radius, color, thickness=2, fill=False):
    """
    在图像上绘制圆
    :param image: 要绘制的图像
    :param center: 圆的中心坐标 (x, y)
    :param radius: 圆的半径
    :param color: 圆的颜色,格式为 (B, G, R)
    :param thickness: 圆边框的厚度,如果fill=True,则此参数将被忽略
    :param fill: 是否填充圆
    :return: 绘制了圆的图像
    """
    if fill:
        cv2.circle(image, center, radius, color, -1)
    else:
        cv2.circle(image, center, radius, color, thickness)
    return image

我们均使用浅拷贝调用函数的时候,得到的结果不管是原图还是绘制之后的图像均被绘制了图像,这与我们的目的相反。

image = cv2.imread('D:/test.png')
# 绘制矩形
rect_img = image
rect_image = draw_rectangle(rect_img, (50, 50), (200, 200), (0, 0, 0), 3)
# 绘制圆
cir_img = image
circle_image = draw_circle(cir_img, (150, 150), 50, (255, 255, 255), 3, False)

在这里插入图片描述

我们均使用深拷贝调用函数的时候,得到的结果互不干扰

image = cv2.imread('D:/test.png')
# 绘制矩形
rect_img = image.copy()
rect_image = draw_rectangle(rect_img, (50, 50), (200, 200), (0, 0, 0), 3)
# 绘制圆
cir_img = image.copy()
circle_image = draw_circle(cir_img, (150, 150), 50, (255, 255, 255), 3, False)

在这里插入图片描述


总结

区分深拷贝和浅拷贝主要是为了理解数据是如何在内存中存储和管理的,以及如何在不同的对象或函数之间安全地传递数据。浅拷贝可能更节省内存(因为它不复制数据),但在某些情况下,如果原始数据被意外修改,可能会导致数据不一致的问题。深拷贝虽然会消耗更多的内存,但它提供了更高的数据安全性和独立性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript 报错】未捕获的类型错误:Uncaught TypeError

🔥 个人主页:空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…

Java高级重点知识点-25-Stream流、方法引用

文章目录 Stream流流式思想概述获取流常用方法 方法引用方法引用符通过对象名引用成员方法通过类名称引用静态方法通过super引用成员方法通过this引用成员方法类的构造器引用数组的构造器引用 Stream流 通过循环遍历来讲解流的优势; 要求:筛选所有姓张的…

游戏如何应对黑灰产工作室

游戏黑灰产工作室,是指以非法渠道、非法手段通过游戏进行牟利的团伙。使用脚本、外挂是黑灰产工作室的显著特征,其常见的牟利方式有:打金工作室、资源囤积号、初始号、自抽号、代练工作室以及营销欺诈等。 ▲ 常见的游戏黑灰产工作室牟利路径…

正向传播和反向传播

正向传播(Forward Propagation) 正向传播是指将输入数据通过神经网络,计算出预测值的过程。具体步骤如下: 输入层:接受输入数据。隐藏层:每个隐藏层中的神经元接收上一层的输出,进行加权求和&…

ENSP防火墙综合配置

综合拓扑: 实验要求: 要求一 生产区的安全策略配置 办公区的安全策略 要求二 生产区的安全策略 游客和办公区的安全策略 因为ISP返回的数据包会被防火墙最后的默认安全策略给拒绝,所以,把要ISP返回的数据给允许通过 要求三 增加…

Lingo学习(三)——工厂合并、运算符、内置函数

一、工厂合并 (一) 工厂合并——生产二维矩阵 【引入】 sets: factory /1..6/ : a; plant /1..8/ : d; Cooperation(factory,p lant) : c, x; endsets 以上程序可…

Go语言入门之Map详解

Go语言入门之Map详解 1.基础定义 map是一个无序的,k-v键值对格式的集合 (1)特点 类型特点:map为引用类型,所以在函数中更新value值会永久改变顺序特点:map的遍历是无序的,因为底层是哈希表&am…

按下快门前的算法——对焦

对焦算法可以分为测距式,相位式,反差式。 其中测距式是通过激光,(TOF,Time of Flight)等主动式地得知物距,然后对焦。更常用的是后两者。 反差式CDAF(Contrast Detection Auto Foc…

微调及代码

一、微调:迁移学习(transfer learning)将从源数据集学到的知识迁移到目标数据集。 二、步骤 1、在源数据集(例如ImageNet数据集)上预训练神经网络模型,即源模型。 2、创建一个新的神经网络模型&#xff…

【Python实战因果推断】31_双重差分2

目录 Canonical Difference-in-Differences Diff-in-Diff with Outcome Growth Canonical Difference-in-Differences 差分法的基本思想是,通过使用受治疗单位的基线,但应用对照单位的结果(增长)演变,来估算缺失的潜…

PostgreSQL 中如何处理数据的批量更新和事务日志管理?

文章目录 PostgreSQL 中数据的批量更新和事务日志管理 PostgreSQL 中数据的批量更新和事务日志管理 在数据库的世界里,数据的批量更新和事务日志管理就像是一场精心编排的舞蹈,需要精准的步伐和协调的动作。对于 PostgreSQL 而言,这两个方面…

LLM基础模型系列:Fine-Tuning总览

由于对大型语言模型,人工智能从业者经常被问到这样的问题:如何训练自己的数据?回答这个问题远非易事。生成式人工智能的最新进展是由具有许多参数的大规模模型驱动的,而训练这样的模型LLM需要昂贵的硬件(即许多具有大量…

常见 Web漏洞分析与防范研究

前言: 在当今数字化时代,Web应用程序扮演着重要的角色,为我们提供了各种在线服务和功能。然而,这些应用程序往往面临着各种潜在的安全威胁,这些威胁可能会导致敏感信息泄露、系统瘫痪以及其他不良后果。 SQL注入漏洞 …

自主研发接口测试框架

测试任务:将以前完成的所有的脚本统一改写为unitest框架方式 1、需求原型 1.1 框架目录结构 V1.0:一般的设计思路分为配置层、脚本层、数据层、结果层,如下图所示 V 2.0:加入驱动层testdriver 1.2 框架各层需要完成的工作 1、配…

【CT】LeetCode手撕—70. 爬楼梯

目录 题目1- 思路2- 实现⭐70. 爬楼梯——题解思路 3- ACM实现 题目 原题连接&#xff1a;70. 爬楼梯 1- 思路 思路 爬楼梯 ——> 动规五部曲 2- 实现 ⭐70. 爬楼梯——题解思路 class Solution {public int climbStairs(int n) {if(n<1){return 1;}// 1. 定义 dp 数…

html5——CSS基础选择器

目录 标签选择器 类选择器 id选择器 三种选择器优先级 标签指定式选择器 包含选择器 群组选择器 通配符选择器 Emmet语法&#xff08;扩展补充&#xff09; 标签选择器 HTML标签作为标签选择器的名称&#xff1a; <h1>…<h6>、<p>、<img/> 语…

数据平滑处理(部分)

一、 移动平均&#xff08;Moving Average&#xff09; 是一种最简单的数据平滑方法&#xff0c;用于平滑时间序列数据。它通过计算一定窗口内数据点的平均值来减少噪音&#xff0c;同时保留数据的趋势。移动平均包括简单移动平均&#xff08;SMA&#xff09;或指数加权移动平均…

初始网络知识

前言&#x1f440;~ 上一章我们介绍了使用java代码操作文件&#xff0c;今天我们来聊聊网络的一些基础知识点&#xff0c;以便后续更深入的了解网络 网络 局域网&#xff08;LAN&#xff09; 广域网&#xff08;WAN&#xff09; 路由器 交换机 网络通信基础 IP地址 端…

可观察性优势:掌握当代编程技术

反馈循环是我们开发人员工作的关键。它们为我们提供信息&#xff0c;并让我们从用户过去和现在的行为中学习。这意味着我们可以根据过去的反应进行主动开发。 TestComplete 是一款自动化UI测试工具&#xff0c;这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的…

“闭门造车”之多模态思路浅谈:自回归学习与生成

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 这篇文章我们继续来闭门造车&#xff0c;分享一下笔者最近对多模态学习的一些新理解。 在前文《“闭门造车”之多模态思路浅谈&#xff1a;无损》中&#xff0c;我们强调了无损输入对于理想的…