在 cv2 python 中克隆图像

Posted

技术标签:

【中文标题】在 cv2 python 中克隆图像【英文标题】:Clone an image in cv2 python 【发布时间】:2013-05-08 03:18:26 【问题描述】:

我是opencv的新手,这里有个问题,与cpp中的cv::clone()作用相同的python函数是什么? 我只是尝试通过

得到一个 rect
    rectImg = img[10:20, 10:20]

但是当我在上面画一条线时,我发现这条线同时出现在 img 和 rectImage 上,那么,我该如何完成呢?

【问题讨论】:

【参考方案1】:

使用 python 3 和 opencv-python 4.4.0 版,以下代码应该可以工作:

img_src = cv2.imread('image.png')
img_clone = img_src.copy()

【讨论】:

这实际上是一个答案还是一个问题? “我尝试使用...” 一个答案其实是@Ruli【参考方案2】:

第一个答案是正确的,但您说您使用的是 cv2,它本质上使用 numpy 数组。因此,要制作一个完全不同的“myImage”副本:

newImage = myImage.copy()

以上就够了。无需导入 numpy。

【讨论】:

【参考方案3】:

我最喜欢的方法是使用没有边框的 cv2.copyMakeBorder,就像这样。

copy = cv2.copyMakeBorder(original,0,0,0,0,cv2.BORDER_REPLICATE)

【讨论】:

copyMakeBorder 变体相对于常规的“复制”有什么好处?是否试图避免源代码中出现 nparrays(Python-OpenCV 矩阵是什么)的概念?【参考方案4】:

您可以简单地使用 Python 标准库。对原图做一个浅拷贝,如下:

import copy

original_img = cv2.imread("foo.jpg")
clone_img = copy.copy(original_img)

【讨论】:

浅拷贝是有害的(RAM 所有权不明确,访问性能不明确等)。【参考方案5】:

如果你使用cv2,正确的方法是在Numpy中使用.copy()方法。它将创建您需要的数组的副本。否则它将只生成该对象的视图。

例如:

In [1]: import numpy as np

In [2]: x = np.arange(10*10).reshape((10,10))

In [4]: y = x[3:7,3:7].copy()

In [6]: y[2,2] = 1000

In [8]: 1000 in x
Out[8]: False     # see, 1000 in y doesn't change values in x, parent array.

【讨论】:

它们只是 0-100 范围内的数字。只需在每一步之后打印xy。然后你就会明白了。

以上是关于在 cv2 python 中克隆图像的主要内容,如果未能解决你的问题,请参考以下文章

Jquery 使克隆图像可拖动和调整大小

OpenCV3 新特性 - 图像无缝克隆函数演示

无法使用 jquery clone 克隆地图的图像图块

如何使用 jQuery 删除克隆的图像?

图像处理图像融合Seamless cloning泊松克隆-Siggraph 2004

angularjs如何使用.push克隆具有相同位置的图像?