图片LOGO去背景合成图
实际工作中经常遇到把LOGO合并到大图上面,因此通过模块opencv的学习把最终实现效果呈现给各位优秀的朋友,希望制作的过程与思路能够对大家学习可视化起到画龙点睛的作用。
***德天老师,祝大家学习愉快!***
背景图:
LOGO合成图:
代码块整理
import cv2
import numpy as np
img = cv2.imread('img1/jing.jpg')
img_big = cv2.imread('img1/mount_water.jpg')
h,w,_ = img.shape
roi = img_big[0:h,0:w]
#1 mask是轮廓线条为黑,背景为白
#2 mask是轮廓为白,背景为黑
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#logo转灰
ret,mask=cv2.threshold(gray,200,255,cv2.THRESH_BINARY) #通过低于200变黑,变成黑白mask类型
mask_inv=cv2.bitwise_not(mask) #反转黑白处理
#显示轮廓并镂空底图
mask_and = cv2.bitwise_and(roi,roi,mask=mask)
#无背景轮廓
mask_small = cv2.bitwise_and(img,img,mask=mask_inv)
#前后合并完成效果
dst = cv2.add(mask_and,mask_small)
img_big[0:h,0:w]=dst
#依次显示
cv2.imshow('mask',mask)
cv2.imshow('mask_inv',mask_inv)
cv2.imshow('mask_and',mask_and)
cv2.imshow('mask_small',mask_small)
cv2.imshow('mask_big',img_big)
cv2.waitKey()
cv2.destroyAllWindows()
图像合成分层分析:
1、获取roi,小图在大图上的映射区域
2、拿到白色背景,黑色轮廓的mask
3、拿到mask的黑白反转图mask_inv
4、通过数据运算bitwise_and,获取带有底图背景被镂空轮廓的图片
5、通过msk_inv结合运算bitwise_and,拿到仅显示轮廓的轮廓图mask_small
6、将4,5的背景图和轮廓图合并得到一块合成图大小与Logo图相当的除掉背景的合成图dst
7、将合并图dst,传递到背景图上roi位置
根据学习制作过程中出现的问题梳理总结。
理解 mask_and = cv2.bitwise_and(roi, roi, mask=mask) 图片如下:
第一个roi为输入的背景图映射图,第二个roi为使用bitwise_and运算显示的蓝天背景图,圆形圈起的图是mask_and结果图
理解mask_small = cv2.bitwise_small(img,img,mask=mask_inv)图片如下
鉴于涉及到问题较多,因此需要理解好每一步的图片代表含义。