OpenCV 图片复制 copyTo()和clone()

這邊介紹三種複製影像的方式,第一種為多載等號運算子,第二、三種分別為Mat的成員函式。

OpenCV等號多載Mat& Mat::operator=(const Mat& m)

  • m:輸入圖,左邊影像和右邊影像相同,不會另外複製一份資料。

OpenCV影像複製:Mat::copyTo(OutputArray& m) const

  • m:輸出圖,輸出圖會變成和呼叫影像一樣的長、寬、像素值。

OpenCV影像複製:Mat Mat::clone() const

  • 返回和呼叫影像相同的一份複製影像。

用等號運算子時,如上面的img1和img2,兩者共用一份數據,所以只要改變一個,另一個會隨之變更,而copyTo()和clone()為複製一份新的數據,所以不會互相影響,以下為使用方式:

Mat img1(240, 320, CV_8U, Scalar(100));
Mat img2, img3, img4;             
img2 = img1;         
img1.copyTo(img3);    
img4 = img1.clone();  
### 如何使用 OpenCV 进行图片的深度复制OpenCV 中,深度复制(deep copy)是指创建一个新的对象,该对象具有与原始对象相同的数据内容,但两者之间没有任何共享数据。这意味着修改副本中的像素值不会影响原始图像。 以下是几种实现深度复制的方法: #### 方法一:使用 `copy` 方法 通过调用图像矩阵的 `.copy()` 方法可以轻松完成深度复制。这种方法适用于 Python 接口下的 NumPy 数组表示形式的图像。 ```python import cv2 # 读取图像 image = cv2.imread('path_to_your_image.tiff') # 深度复制 deep_copy = image.copy() # 修改深拷贝的内容 deep_copy[0, 0] = [255, 0, 0] # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Deep Copy', deep_copy) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此方法确保了 `deep_copy` `image` 是两个完全独立的对象[^1]。 --- #### 方法二:使用 `np.copy` NumPy 提供了一个通用函数 `np.copy` 来执行数组的深度复制。对于 OpenCV 图像而言,这同样有效。 ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('path_to_your_image.tiff') # 使用 np.copy 执行深度复制 deep_copy2 = np.copy(image) # 修改深拷贝的内容 deep_copy2[0, 0] = [0, 255, 0] # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Deep Copy via np.copy', deep_copy2) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这里,`deep_copy2` 完全独立于 `image`,因此对其的操作不影响原始图像[^1]。 --- #### 方法三:C++ 中的 `Clone` 函数 如果使用的是 C++ 版本的 OpenCV,则可以通过 `Mat::clone()` 或者 `CopyTo` 方法来实现深度复制。 ##### 使用 `Clone` 方法 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { // 加载图像 Mat img1 = imread("image.jpg"); // 创建深拷贝 Mat img2 = img1.clone(); // 修改深拷贝 img2.at<Vec3b>(0, 0)[0] = 255; img2.at<Vec3b>(0, 0)[1] = 0; img2.at<Vec3b>(0, 0)[2] = 0; imshow("Original Image", img1); imshow("Cloned Image", img2); waitKey(0); return 0; } ``` 这段代码展示了如何利用 `clone` 方法生成一个不依赖原图的新图像对象[^2]。 ##### 使用 `CopyTo` 方法 另一种方式是借助 `CopyTo` 将源图像的内容复制到目标图像中。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { // 加载图像 Mat img1 = imread("image.jpg"); // 创建新图像用于存储复制的结果 Mat img2(img1.size(), img1.type()); // 复制操作 img1.copyTo(img2); imshow("Original Image", img1); imshow("Copied Image", img2); waitKey(0); return 0; } ``` 这种方式更加灵活,允许指定条件或者掩码来进行部分区域的复制[^2]。 --- #### 总结 无论是 Python 环境还是 C++ 环境下,都可以方便地实现图像的深度复制。Python 用户可以选择内置的 `.copy()` 方法或是 NumPy 的 `np.copy`;而 C++ 开发者则有多种工具可用,比如 `clone` `CopyTo`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落寞的雪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值