前言:
Python实战篇重在实战,今天,我们就来编写一份用于一寸照换背景的代码 ,最后的成果就是放入一张蓝色背景的一寸照,手动选择替换后的背景为红色或者绿色(其他颜色需要自己适配),然后运行代码,最终在本地生成一张一寸照,效果还不错哦!
一寸照换背景
一、实战简介
本次实战主要用到了两个python包(opencv,numpy),事先小编为了简便,只设计了蓝色背景转其他背景的代码适配,代码的主要思想是提取当前一寸照图片的hsv,将其设置为蓝色空间范围,然后通过阈值化操作,将大于阈值的像素都转换为目标像素,不是阈值的像素则不处理,Python语法中主要使用了for循环。
二、代码实践 注释
代码语言:javascript复制# coding:utf-8
import cv2
import numpy as np
# opencv读取照片
img=cv2.imread('./002.jpg')
#缩放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5) #原图片路径
rows,cols,channels = img.shape
cv2.imshow('img',img) # 显示照片
# #转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([90,70,70]) #里面三个数值可以控制好处理出来的效果和噪点
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)
#遍历替换 该步骤就是最终操作了 遇到背景的像素就替换
for i in range(rows):
for j in range(cols):
if dilate[i,j]==255:
img[i,j]=(0,0,255) #此处替换颜色,为BGR通道
cv2.imshow('res',img)
三、效果展示
原图:
效果图:
结语:
今天的代码总体来说不是很难,主要是设计到了opencv读取像素的操作,对于opencv大家可能不太熟悉,后期我们会专门开设opencv数字图像处理的专栏,对图像处理进行好好的安排,今天的一寸照换背景就相当于opencv的实战了,改进的地方还有很多,比如代码中的膨胀腐蚀操作和各种背景互换,因为今天的代码只能蓝色背景换成其他颜色,其他的需要小伙伴们自行实践哦。
编辑:玥怡居士|审核:小圈圈居士