给图像添加Logo

介绍

给图像加上logo,这里介绍两种融合方法方法

  • 传统方法直接替换
  • seamlessClone方法

传统方法直接替换

直接上代码

def add_logo(cv_logo_img, cv_src_img):
    rows, cols, channels = cv_logo_img.shape
    roi = cv_src_img[0:rows, 0:cols]
    
    img2gray = cv.cvtColor(cv_logo_img, cv.COLOR_BGR2GRAY)
    ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)

    mask_inv = cv.bitwise_not(mask)

    img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
    
    img2_fg = cv.bitwise_and(cv_logo_img, cv_logo_img, mask=mask)
    
    dst = cv.add(img1_bg, img2_fg)
    img1[0:rows, 0:cols] = dst
    cv.imshow('normal', img1)

cv_logo_img: 欲添加的logo图像
cv_src_img : 目标图像
利用这种方法,当背景和logo色彩差异较大时,会显得十分突兀,感觉添加的logo十分不自然,于是就引入了opencv自带的seamlessClone方法

seamlessClone方法

seamlessClone方法其实就是泊松图像融合方法
先上代码

def seamless_add_logo(cv_logo_img , cv_src_img):
    gray = cv.cvtColor(cv_logo_img , cv.COLOR_BGR2GRAY)
    _ , mask_gray = cv.threshold(gray, 10 , 255 , cv.THRESH_BINARY)
    
    output = cv.seamlessClone(cv_logo_img , cv_src_img , mask_gray , (40 , 40) , cv.NORMAL_CLONE)
    cv.imshow("seamless", output)

传统效果
给图像添加Logo_第1张图片
seamlessClone效果
给图像添加Logo_第2张图片

咋一看上述两张图好像是一张图,不禁怀疑是不是我上传错误,这是由于选的这张图片导致的,有兴趣的读者可以找两个色彩差异较大的图像测试,就能发现这两个方法产生的结果略有区别。

seamlessClone函数定义如下
cv2.seamlessClone(src, dst, mask, center, flags)

  • src 目标影像
  • dst 背景影像
  • mask 目标影像上的mask,表示对目标影像上哪些区域感兴趣
  • center 目标影像中心在背景图像上的坐标
  • flags 选择的融合方式,目前有NORMAL_CLONE、MIXED_CLONE和MONOCHROME_TRANSFER三种方法,有兴趣的可以分别试一试比较一下效果。

本人以后会在个人公众号上定期更新一些cv相关的内容,如有兴趣可以关注本人公众号
给图像添加Logo_第3张图片

你可能感兴趣的:(Opencv)