效果演示:
带有绿幕的图片的狮子提取出来,放到另一种风景图片里!
1. 首先我们要先口出绿色绿幕,比如:
这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。
代码 :
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def showImg(img):img1 = cv.cvtColor(img, cv.COLOR_BGR2RGB)plt.imshow(img1)
img = cv.imread("img/lion.jpg", cv.IMREAD_COLOR)img_copy = img.copy()# 将BGR格式转为 HSV
hsv_img = cv.cvtColor(img_copy, cv.COLOR_BGR2HSV)lowerb_val = (35,43, 46)
upperb_val = (77, 255, 255)
# 查找颜色
mask_img = cv.inRange(hsv_img, lowerb_val, upperb_val)
showImg(mask_img)
说明:这里的颜色需要通过下面的列表,查找一下:
2. 通过轮廓反向获取狮子
代码:
img_copy[mask_img != 0] = (0,0,0)
showImg(img_copy)
说明: 这里的意思是说 获取不是黑色颜色的部分,并且其它背景为黑色。
3. 使两张图片融合
代码:
img_it = cv.imread("img/yunduo.png", cv.IMREAD_COLOR)height,width = img_it.shape[0:2]mask_rgb_img = cv.cvtColor(mask_img, cv.COLOR_BGR2RGB)srt_img = np.zeros_like(img_it)for row in range(height):for col in range(width):b,g,r = img_it[row,col]b1,g1,r1 = mask_rgb_img[row,col]b2,g2,r2 = img_copy[row,col]if b1 != 255 and g1 != 255 and r1 !=255:b = b2g = g2r = r2srt_img[row,col] = (b,g,r)fig = plt.figure(figsize=(20,17))
fig.add_subplot(1,3,1)
showImg(img)
fig.add_subplot(1,3,2)
showImg(img_copy)
fig.add_subplot(1,3,3)
showImg(srt_img)
说明:这里是分开了3原色,并且分开判断是否为255,不是255.者将这块区域替换成狮子的部分。