本文实例为大家分享了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