Opencv中的copyTo()函数在opencv-Python中的实现
copyTo() 函数有两种方式
- 第一种:src_Image.copyTo(dst_Image),表示将原图复制到目标图中。
- 第二种:src_Image.copyTo(dst_Image, mask),表示得到一个附加掩膜mask的目标图。
第一种方法比较简单,这列主要讲解第二种方法。
src_Image.copyTo(dst_Image, mask)
-
大致过程是说:将src_Image图 对照着mask图复制到dst_Image图,最后得到dst_Image图。
-
参数说明(原图需要和模板图有相同的大小,即高度,宽度,通道数都要相同,RGB图和GRAY图均可,只要他们相同大小,python中可用src_Image.shape查看图像大小)
- src_Image:原图
- dst_Image:结果图
- mask:掩图
copyTo()的实现原理:
- 在位置(x,y)时,如果mask的像素值不等于0,则dst(x,y) = src(x,y);
如果mask的像素值等于0,则dst(x,y) = 0 - 即在(x,y)处,当mask的像素值是0时,dst对应的像素就为0;当mask的像素值不是0时,dst对应的像素值为scr的像素值(下图方便理解)
代码实现
# 讲一下大致思路
import cv2
import numpy as np
scr_Image = cv2.imread("原图")
mask = cv2.imread("掩图")
# 原图的高度和宽度
height = scr_Image.shape[0]
width = scr_Image.shape[1]
# 生成和原图一样高度和宽度的矩形(全为0)
dst_Image = np.zeros((height, width), np.uint8)
# 以下是copyTo的算法原理:
# 先遍历每行每列(如果不是灰度图还需遍历通道,可以事先把mask图转为灰度图)
for row in range(mask.shape[0]):
for col in range(mask.shape[1]):
# 如果掩图的像素不等于0,则dst(x,y) = scr(x,y)
if mask[row, col] != 0:
# dst_image和scr_Image一定要高宽通道数都相同,否则会报错
dst_Image[row, col] = scr_Image[row, col]
# 如果掩图的像素等于0,则dst(x,y) = 0
elif mask[row, col] == 0:
dst_Image[row, col] = 0
cv2.imshow("结果图", dst_Image)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果做的时候遇到如下的error,可能是图片的高宽通道数不一致,可以通过print(image.shape)来检查。
—ValueError: setting an array element with a sequence.