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.