1 说明:
=====
1.1 对照片进行背景颜色替换,用处比较多。目前用python和opencv来看看。
1.2 纯python和opencv代码来试试看,一起探索和思考,提高自己的思维能力。
参考文章1:
https://blog.csdn.net/weixin_45192980/article/details/107724733?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.add_param_isCf
2 bluetored:蓝底变红底
===================
2.1 图片:上图来自今日头条图库:蓝底原图:1111.jpeg
2.2 bluetored.py代码:
import cv2import numpy as np#读取蓝底原图img=cv2.imread('/home/xgj/Desktop/pic-bg/1111.jpeg')#缩放rows,cols,channels = img.shapeimg=cv2.resize(img,None,fx=0.5,fy=0.5)rows,cols,channels = img.shapecv2.imshow('img',img) #显示蓝底原图#转换hsvhsv=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) #显示mask掩膜图#腐蚀膨胀erode=cv2.erode(mask,None,iterations=1)cv2.imshow('erode',erode) #显示erode图dilate=cv2.dilate(erode,None,iterations=1)cv2.imshow('dilate',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) #显示背景颜色为红色的修改后的图片cv2.waitKey(0)cv2.destroyAllWindows()
2.3 效果图:
3 whitetored:白底变红底
====================
3.1 图片:来自今日头条图库
3.2 效果图:
3.3 whitetored.py代码:
import cv2import numpy as np#白底原图读取img=cv2.imread('/home/xgj/Desktop/pic-bg/2222.jpeg')#缩放rows,cols,channels = img.shapeimg=cv2.resize(img,None,fx=0.5,fy=0.5)rows,cols,channels = img.shapecv2.imshow('img',img)#转换hsvhsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)lower_white = np.array([0, 0, 200]) #白底upper_white = np.array([180, 40, 255]) #白底#掩膜mask = cv2.inRange(hsv, lower_white, upper_white)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通道,背景颜色为红底 #img[i,j]=(255,0,0) #背景颜色为蓝底,假如白底变蓝底,附加cv2.imshow('res',img)cv2.waitKey(0)cv2.destroyAllWindows()
参考文章2:
https://blog.csdn.net/shenglong456/article/details/71174175?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf
4 greentocolor:绿色背景变色
=======================
4.1 图片:来自今日头条图库
4.2 代码:
import cv2import numpy#绿色背景照片img=cv2.imread('/home/xgj/Desktop/pic-bg/mask/ls.jpeg',1) # opencv 将BGR 转换成 HSVimgHSV=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #遍历for i in range(img.shape[0]): for j in range(img.shape[1]):#判断是否绿色 50和75参数可以改变 应该不是最好 if imgHSV[i,j,0]<75 and imgHSV[i,j,0]>50: #难点:判断背景颜色 #下面是可变背景颜色,附带几种,color #img[i,j]=[255,255,255] #变白色 #img[i,j]=[0,0,255] #变红色 img[i,j]=[255,0,0] #变蓝色cv2.namedWindow('Image',cv2.WINDOW_NORMAL)cv2.imshow('Image',img)cv2.waitKey(0)cv2.destoryAllWindows()
4.3 效果图:
===以上都是单一背景颜色的改变===
5 复杂背景的改色或改背景图片:
=========================
5.1 图片:来自今日头条图库
5.2 先抠图,代码如下:交互式抠图
import numpy as npimport cv2#定义全局变量n = 0 #定义鼠标按下的次数ix = 0 # x,y 坐标的临时存储iy = 0rect = (0,0,0,0) #前景区域#鼠标回调函数def draw_rectangle(event,x,y,flags,param): global n,ix,iy,rect if event==cv2.EVENT_LBUTTONDOWN : if n == 0: #首次按下保存坐标值 n+=1 ix,iy = x,y else: #第二次按下显示矩形 n+=1 rect = (ix,iy,(x-ix),(y-iy))#前景区域 #读取图像img = cv2.imread('/home/xgj/Desktop/pic-bg/ppp/bw1.jpeg')mask = np.zeros(img.shape[:2],np.uint8)bgdModel = np.zeros((1,65),np.float64)fgdModel = np.zeros((1,65),np.float64)#选择区域 左上到右下矩形cv2.namedWindow("img")cv2.setMouseCallback("img",draw_rectangle)#绑定鼠标while(n != 2): cv2.imshow("img",img) cv2.waitKey(2)#前景提取cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')img = img*mask2[:,:,np.newaxis]#显示图像cv2.imshow("img",img)#保存,抠图后的图片cv2.imwrite('/home/xgj/Desktop/pic-bg/ppp/bw2.jpeg',img)cv2.waitKey()cv2.destroyAllWindows()
5.3 操作如下图:
5.4 更换背景图片:
=============
5.4.1 参考文章3:
https://blog.csdn.net/haofan_/article/details/76687238
5.4.2 代码:
import cv2import numpy as np#人物图img=cv2.imread('/home/xgj/Desktop/pic-bg/ppp/bw2.jpeg') #需要更改成的背景图片img_back=cv2.imread('/home/xgj/Desktop/pic-bg/ppp/back.jpeg')#日常缩放rows,cols,channels = img_back.shapeimg_back=cv2.resize(img_back,None,fx=0.7,fy=0.7)cv2.imshow('img_back',img_back)#原人物图片缩放40%img=cv2.resize(img,None,fx=0.4,fy=0.4)cv2.imshow('img',img)rows,cols,channels = img.shape #rows,cols最后一定要是前景图片的,后面遍历图片需要用到#转换hsvhsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#获取masklower_black = np.array([0, 0, 0])upper_black = np.array([180, 255, 46])mask = cv2.inRange(hsv, lower_black, upper_black)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]#在新背景图片中的位置center=[int(img.shape[0]/2),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.imwrite('/home/xgj/Desktop/pic-bg/ppp/bw3back.png',img_back) #保存合成图cv2.waitKey(0)cv2.destroyAllWindows()
5.4.3 操作效果图:
===自己整理并分享出来===
喜欢的人,请点赞,关注、评论、转发和收藏。