本文实例为大家分享了Opencv实现抠图替换背景图的具体代码,供大家参考,具体内容如下
下面简单图片演示一下:
提取mask:
===>
替换背景:
+ =
python的opencv代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# coding=utf-8
import cv2
import numpy as np
img = cv2.imread( 'lp.jpg' )
img_back = cv2.imread( 'back.jpg' )
#日常缩放
rows,cols,channels = img_back.shape
img_back = cv2.resize(img_back, None ,fx = 0.7 ,fy = 0.7 )
cv2.imshow( 'img_back' ,img_back)
rows,cols,channels = img.shape
img = cv2.resize(img, None ,fx = 0.4 ,fy = 0.4 )
cv2.imshow( 'img' ,img)
rows,cols,channels = img.shape #rows,cols最后一定要是前景图片的,后面遍历图片需要用到
#转换hsv
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#获取mask
lower_blue = np.array([ 78 , 43 , 46 ])
upper_blue = np.array([ 110 , 255 , 255 ])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow( 'Mask' , mask)
#腐蚀膨胀
erode = cv2.erode(mask, None ,iterations = 1 )
cv2.imshow( 'erode' ,erode)
dilate = cv2.dilate(erode, None ,iterations = 1 )
cv2.imshow( 'dilate' ,dilate)
#遍历替换
center = [ 50 , 50 ] #在新背景图片中的位置
for i in range (rows):
for j in range (cols):
if dilate[i,j] = = 0 : #0代表黑色的点
img_back[center[ 0 ] + i,center[ 1 ] + j] = img[i,j] #此处替换颜色,为BGR通道
cv2.imshow( 'res' ,img_back)
cv2.waitKey( 0 )
cv2.destroyAllWindows()
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u014365862/article/details/78863756