用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码

懒得打字了,直接上资料的图吧!
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
要注意,上面叙述中利用Numpy的索引提取ROI区域的叙述是有严重问题的,具体问题是对x1、x2、y1、y2所代表的值叙述错误。
x1:x2表示的是ROI区域在原图中的行范围,所以应该是y坐标值,x1:x2代表的区间是左闭右开的,即[x1,x2)。
y1:y2表示的是ROI区域在原图中的列范围,所以应该是x坐标值,y1:y2代表的区间同样也是左闭右开区间,即[y1,y2)

另外,由以上叙述可知,我们在对图像数据进行拷贝时一定要注意是深拷贝还是浅拷贝。深拷贝不是共用存储区,而浅拷贝是共用存储区。

接下来上示例代码:

示例一:通过“=”实现浅拷贝

import numpy as np

A1 = np.zeros((7, 7), dtype='uint8')
# 通过“=”实现浅拷贝
B1 = A1
B1[3, 3] = 1

运行结果如下:
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
从以上代码和运行结果可知,B1是A1的浅拷贝,修改B1的值后,A1中相应位置的值也被改变了。

示例二:通过“=”和索引实现浅拷贝

import numpy as np

A1 = np.zeros((7, 7), dtype='uint8')
# 通过“=”和索引实现浅拷贝
B2 = A1[0:4, 0:3]
B2[1, 1] = 1

运行结果如下:
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码

示例三:通过函数copy()实现深拷贝

import numpy as np

A1 = np.zeros((7, 7), dtype='uint8')

# 通过“=”和索引实现浅拷贝
B1 = A1[0:4, 0:3]

# 通过函数copy()实现深拷贝
C1 = B1.copy()

C1[1, 1] = 1

运行结果如下图所示:
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码

示例四:将矩阵的感兴趣区域替换为另一矩阵的值(深拷贝)

代码如下:

import numpy as np
A1 = np.zeros((7, 7), dtype='uint8')
B1 = np.ones((3, 3), dtype='uint8')
A1[1:4, 1:4] = B1

运行结果如下:
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
上面的结果看不出是深拷贝还是浅拷贝,我们加一条语句就知道了:

import numpy as np
A1 = np.zeros((7, 7), dtype='uint8')
B1 = np.ones((3, 3), dtype='uint8')
A1[1:4, 1:4] = B1

B1[1, 1] = 0

运行结果如下:
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
用Python-OpenCV提取图像中的感兴趣区域、以及图像的深拷贝和浅拷贝问题、附示例代码
从上面的运行结果可知,语句:

A1[1:4, 1:4] = B1

只是把A1中的子区域的值替换为矩阵B1中的值,而并不是把A1中的子区域的存储空间和B1共享。

延伸阅读:Python的Numpy库的ndarray对象(矩阵)初始化、属性调整、属性获取、基本操作示例代码积累

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年6月9日
下一篇 2022年6月9日

相关推荐