python cv2 imshow_好!纯python的opencv的照片背景颜色更换探索

1 说明:

=====

1.1 对照片进行背景颜色替换,用处比较多。目前用python和opencv来看看。

1.2 纯python和opencv代码来试试看,一起探索和思考,提高自己的思维能力。

a2e5feda-7141-41a9-9036-98c87a6b6691

蓝底原图:1111.jpeg

参考文章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 效果图:

9788cbb6c96c4b4db084ae499c13286a

3 whitetored:白底变红底

====================

3.1 图片:来自今日头条图库

87f99c26-c9f9-45b7-aa36-4f466159938b

白底原图:2222.jpeg

3.2 效果图:

e7634e70c0c34b028e24426dfada267c

有bug了

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 图片:来自今日头条图库

80d1a03d-28f8-489b-8bd2-8e7801f96bda

绿色背景图:ls.jpeg

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 效果图:

7ed718948026473181121419f50d4d8c

小bug

===以上都是单一背景颜色的改变===

5 复杂背景的改色或改背景图片:

=========================

5.1 图片:来自今日头条图库

ce2dcc7b-65de-4160-bc3f-b57146f7517e

bw1.jpeg

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 操作如下图:

a380f439936c42bd874878ce1284e0c5
3eabc233e227402d9f1118bb95f9f9e9

上述得到的图:bw2.jpeg

25060abf-dda9-44b3-ad77-79f321f6a9f7

需要设置背景图片:back.jpeg

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 操作效果图:

8646077cc8fa41e7818a2a4cb22ec8d5
4b3eee4ca1674e30b27fcc7963029d99

===自己整理并分享出来===

喜欢的人,请点赞,关注、评论、转发和收藏。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV可以用来进行背景颜色聚类。以下是一些基本步骤: 1. 加载图像并将其转换为HSV颜色空间。 2. 对图像进行分割,以便分离背景和前景。 3. 使用K-Means算法对背景颜色进行聚类。 4. 找到聚类中心并确定最常见的背景颜色。 5. 将背景颜色与图像进行比较,以确定哪些像素应该被视为背景。 以下是一个基本的Python代码示例,用于使用OpenCV进行背景颜色聚类: ```python import cv2 import numpy as np # 加载图像并将其转换为HSV颜色空间 img = cv2.imread('image.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 对图像进行分割,以便分离背景和前景 mask = cv2.inRange(hsv, (0, 0, 0), (180, 255, 100)) # 使用K-Means算法对背景颜色进行聚类 Z = hsv.reshape((-1,3)) Z = np.float32(Z) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) K = 5 ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS) # 找到聚类中心并确定最常见的背景颜色 counts = np.bincount(label.flatten()) background_color = center[np.argmax(counts)] # 将背景颜色与图像进行比较,以确定哪些像素应该被视为背景 background_mask = cv2.inRange(hsv, background_color, background_color) # 显示结果 cv2.imshow("Original Image", img) cv2.imshow("Background Mask", background_mask) cv2.waitKey(0) ``` 在这个例子中,我们首先将原始图像转换为HSV颜色空间,并使用`cv2.inRange`函数对图像进行分割,以便分离背景和前景。然后,我们使用K-Means算法对背景颜色进行聚类,并找到聚类中心以确定最常见的背景颜色。最后,我们将背景颜色与图像进行比较,以确定哪些像素应该被视为背景,并使用`cv2.imshow`函数显示结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值