1说明: 1。1对照片进行背景颜色替换,用处比较多。目前用python和opencv来看看。 1。2纯python和opencv代码来试试看,一起探索和思考,提高自己的思维能力。 蓝底原图:1111。jpeg 参考文章1:https:blog。csdn。netweixin45192980articledetails107724733?utmmediumdistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai27。addparamisCfdepth1utmsourcedistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai27。addparamisCf 2bluetored:蓝底变红底 2。1图片:上图来自今日头条图库:蓝底原图:1111。jpeg 2。2bluetored。py代码:importcv2importnumpyasnp读取蓝底原图imgcv2。imread(homexgjDesktoppicbg1111。jpeg)缩放rows,cols,channelsimg。shapeimgcv2。resize(img,None,fx0。5,fy0。5)rows,cols,channelsimg。shapecv2。imshow(img,img)显示蓝底原图转换hsvhsvcv2。cvtColor(img,cv2。COLORBGR2HSV)lowerbluenp。array(〔90,70,70〕)提示蓝色底upperbluenp。array(〔110,255,255〕)提示蓝色底maskcv2。inRange(hsv,lowerblue,upperblue)cv2。imshow(Mask,mask)显示mask掩膜图腐蚀膨胀erodecv2。erode(mask,None,iterations1)cv2。imshow(erode,erode)显示erode图dilatecv2。dilate(erode,None,iterations1)cv2。imshow(dilate,dilate)显示dilate图遍历替换foriinrange(rows):forjinrange(cols):ifdilate〔i,j〕255:img〔i,j〕(0,0,255)此处替换颜色,为BGR通道cv2。imshow(res,img)显示背景颜色为红色的修改后的图片cv2。waitKey(0)cv2。destroyAllWindows() 2。3效果图: 3whitetored:白底变红底 3。1图片:来自今日头条图库 白底原图:2222。jpeg 3。2效果图: 有bug了 3。3whitetored。py代码:importcv2importnumpyasnp白底原图读取imgcv2。imread(homexgjDesktoppicbg2222。jpeg)缩放rows,cols,channelsimg。shapeimgcv2。resize(img,None,fx0。5,fy0。5)rows,cols,channelsimg。shapecv2。imshow(img,img)转换hsvhsvcv2。cvtColor(img,cv2。COLORBGR2HSV)lowerwhitenp。array(〔0,0,200〕)白底upperwhitenp。array(〔180,40,255〕)白底掩膜maskcv2。inRange(hsv,lowerwhite,upperwhite)cv2。imshow(Mask,mask)腐蚀膨胀erodecv2。erode(mask,None,iterations1)cv2。imshow(erode,erode)dilatecv2。dilate(erode,None,iterations1)cv2。imshow(dilate,dilate)遍历替换foriinrange(rows):forjinrange(cols):ifdilate〔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。netshenglong456articledetails71174175?utmmediumdistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai21。addparamisCfdepth1utmsourcedistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai21。addparamisCf 4greentocolor:绿色背景变色 4。1图片:来自今日头条图库 绿色背景图:ls。jpeg 4。2代码:importcv2importnumpy绿色背景照片imgcv2。imread(homexgjDesktoppicbgmaskls。jpeg,1)opencv将BGR转换成HSVimgHSVcv2。cvtColor(img,cv2。COLORBGR2HSV)遍历foriinrange(img。shape〔0〕):forjinrange(img。shape〔1〕):判断是否绿色50和75参数可以改变应该不是最好ifimgHSV〔i,j,0〕75andimgHSV〔i,j,0〕50:难点:判断背景颜色下面是可变背景颜色,附带几种,colorimg〔i,j〕〔255,255,255〕变白色img〔i,j〕〔0,0,255〕变红色img〔i,j〕〔255,0,0〕变蓝色cv2。namedWindow(Image,cv2。WINDOWNORMAL)cv2。imshow(Image,img)cv2。waitKey(0)cv2。destoryAllWindows() 4。3效果图: 小bug 以上都是单一背景颜色的改变 5复杂背景的改色或改背景图片: 5。1图片:来自今日头条图库 bw1。jpeg 5。2先抠图,代码如下:交互式抠图importnumpyasnpimportcv2定义全局变量n0定义鼠标按下的次数ix0x,y坐标的临时存储iy0rect(0,0,0,0)前景区域鼠标回调函数defdrawrectangle(event,x,y,flags,param):globaln,ix,iy,rectifeventcv2。EVENTLBUTTONDOWN:ifn0:首次按下保存坐标值n1ix,iyx,yelse:第二次按下显示矩形n1rect(ix,iy,(xix),(yiy))前景区域读取图像imgcv2。imread(homexgjDesktoppicbgpppbw1。jpeg)masknp。zeros(img。shape〔:2〕,np。uint8)bgdModelnp。zeros((1,65),np。float64)fgdModelnp。zeros((1,65),np。float64)选择区域左上到右下矩形cv2。namedWindow(img)cv2。setMouseCallback(img,drawrectangle)绑定鼠标while(n!2):cv2。imshow(img,img)cv2。waitKey(2)前景提取cv2。grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2。GCINITWITHRECT)mask2np。where((mask2)(mask0),0,1)。astype(uint8)imgimgmask2〔:,:,np。newaxis〕显示图像cv2。imshow(img,img)保存,抠图后的图片cv2。imwrite(homexgjDesktoppicbgpppbw2。jpeg,img)cv2。waitKey()cv2。destroyAllWindows() 5。3操作如下图: 上述得到的图:bw2。jpeg 需要设置背景图片:back。jpeg 5。4更换背景图片: 5。4。1参考文章3:https:blog。csdn。nethaofanarticledetails76687238 5。4。2代码:importcv2importnumpyasnp人物图imgcv2。imread(homexgjDesktoppicbgpppbw2。jpeg)需要更改成的背景图片imgbackcv2。imread(homexgjDesktoppicbgpppback。jpeg)日常缩放rows,cols,channelsimgback。shapeimgbackcv2。resize(imgback,None,fx0。7,fy0。7)cv2。imshow(imgback,imgback)原人物图片缩放40imgcv2。resize(img,None,fx0。4,fy0。4)cv2。imshow(img,img)rows,cols,channelsimg。shaperows,cols最后一定要是前景图片的,后面遍历图片需要用到转换hsvhsvcv2。cvtColor(img,cv2。COLORBGR2HSV)获取masklowerblacknp。array(〔0,0,0〕)upperblacknp。array(〔180,255,46〕)maskcv2。inRange(hsv,lowerblack,upperblack)cv2。imshow(Mask,mask)腐蚀膨胀erodecv2。erode(mask,None,iterations1)cv2。imshow(erode,erode)dilatecv2。dilate(erode,None,iterations1)cv2。imshow(dilate,dilate)遍历替换center〔50,50〕在新背景图片中的位置center〔int(img。shape〔0〕2),50〕foriinrange(rows):forjinrange(cols):ifdilate〔i,j〕0:0代表黑色的点imgback〔center〔0〕i,center〔1〕j〕img〔i,j〕此处替换颜色,为BGR通道cv2。imshow(res,imgback)显示效果图cv2。imwrite(homexgjDesktoppicbgpppbw3back。png,imgback)保存合成图cv2。waitKey(0)cv2。destroyAllWindows() 5。4。3操作效果图: 自己整理并分享出来 喜欢的人,请点赞,关注、评论、转发和收藏。