opencv3.3.1+python3.6.3图像上添加背景透明logo

参考文档
https://docs.opencv.org/master/d0/d86/tutorial_py_image_arithmetics.html

说明
在添加logo之前,首先要对logo进行处理,把不需要的透明的背景转变为纯黑色(0,0,0),便于后期的处理。

函数详解

cv2.add()
就是直接把两张图片的像素值相加:dst=img1+img2
显然,黑色的背景并不会改变原图的形状,但logo和背景图重合的部分则会改变颜色。
opencv3.3.1+python3.6.3图像上添加背景透明logo_第1张图片

cv2.addWeighted():
按照两幅图的权重进行叠加:dst=α⋅img1+β⋅img2+γ
和上面的效果会有些类似。
opencv3.3.1+python3.6.3图像上添加背景透明logo_第2张图片

cv2.bitWise_and/or/xor/not()
这是将透明背景扣掉的蒙版处理方法,首先把logo转化为一个灰度图,然后设定阈值将其转化为一个黑白蒙版,把背景去掉(注意:阈值的选取最好不要影响logo内部的图像,不然会出现噪点),各函数的表象如下:
蒙版效果:
opencv3.3.1+python3.6.3图像上添加背景透明logo_第3张图片

蒙版区域互换的效果:

opencv3.3.1+python3.6.3图像上添加背景透明logo_第4张图片

把背景图中rio区域内不覆盖logo的地方找出来:
opencv3.3.1+python3.6.3图像上添加背景透明logo_第5张图片

把背景透明的logo蒙版出来
opencv3.3.1+python3.6.3图像上添加背景透明logo_第6张图片
两者叠加:
opencv3.3.1+python3.6.3图像上添加背景透明logo_第7张图片
就可以得到背景透明的logo叠加处理了。

还有一种方法就是把logo图片的背景和logo区别开来,只要是不同的色彩即可,然后采用遍历的方法,凡是背景色彩的像素都用roi的像素,是logo前景的色彩就用logo的,这样混合之后在赋值会原图片,就可以完美实现logo的背景透明了。
opencv3.3.1+python3.6.3图像上添加背景透明logo_第8张图片

可以参考一下我的代码:

import cv2
import numpy as np
import math

cv2.namedWindow("logo")  #定义一个窗口
frame=cv2.imread('girl.png') #捕获图像1
logo=cv2.imread('logo.jpg')
logo_gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
rows,cols,channels = logo.shape

dx,dy=120,150
roi=frame[dx:dx+cols,dy:dy+rows]
for i in range(cols):
    for j in range(rows):
        if (logo[i,j][0]+logo[i,j][1]+logo[i,j][2])<=20:roi[i,j]=roi[i,j]
        else:roi[i,j]=logo[i,j]
#roi=cv2.addWeighted(logo,0.5,roi,0.5,1)
#roi=cv2.add(logo,roi)
frame[dx:dx+cols,dy:dy+rows]=roi

cv2.imshow("logo",frame)#显示轮廓

cv2.waitKey(0)
cv2.destroyAllWindows()

你可能感兴趣的:(机器视觉算法与应用,python3.6,opencv3.3)