參考文檔
https://docs.opencv.org/master/d0/d86/tutorial_py_image_arithmetics.html
說明:
在添加logo之前,首先要對logo進行處理,把不需要的透明的背景轉變爲純黑色(0,0,0),便於後期的處理。
函數詳解
cv2.add()
就是直接把兩張圖片的像素值相加:dst=img1+img2
顯然,黑色的背景並不會改變原圖的形狀,但logo和背景圖重合的部分則會改變顏色。
cv2.addWeighted():
按照兩幅圖的權重進行疊加:dst=α⋅img1+β⋅img2+γ
和上面的效果會有些類似。
cv2.bitWise_and/or/xor/not()
這是將透明背景扣掉的蒙版處理方法,首先把logo轉化爲一個灰度圖,然後設定閾值將其轉化爲一個黑白蒙版,把背景去掉(注意:閾值的選取最好不要影響logo內部的圖像,不然會出現噪點),各函數的表象如下:
蒙版效果:
蒙版區域互換的效果:
把背景圖中rio區域內不覆蓋logo的地方找出來:
把背景透明的logo蒙版出來
兩者疊加:
就可以得到背景透明的logo疊加處理了。
還有一種方法就是把logo圖片的背景和logo區別開來,只要是不同的色彩即可,然後採用遍歷的方法,凡是背景色彩的像素都用roi的像素,是logo前景的色彩就用logo的,這樣混合之後在賦值會原圖片,就可以完美實現logo的背景透明瞭。
可以參考一下我的代碼:
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()