opencv中的copyTo函数在opencv-Python中的实现

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的像素值(下图方便理解)
    opencv中的copyTo函数在opencv-Python中的实现_第1张图片

代码实现

# 讲一下大致思路
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.

你可能感兴趣的:(python遇见问题)