您现在的位置是:首页 >其他 >给照片换底色(python+opencv)网站首页其他
给照片换底色(python+opencv)
给照片换底色(python+opencv)
本篇目录:
🦄 一、分析照片基本信息
生活中,我们有时需要更换照片的底色,例如证件照,有需要蓝底的,也有需要红底的。给照片换底色实现方法有很多,用phothshop、各种图片修改装饰软件都能够做到。那么在计算视觉角度看,实现给照片换底色的方法如何实现呢?
我们来试一下测试一下。我们有一张蓝底的图片:

要处理好图片,首先要先了解图片的情况,我们来看一下这张图片的基本相关信息:
import cv2
img = cv2.imread('girl4b.jpg') 
print(img)
information = img.shape
print(information)
img_size = img.size 
print(img_size)
ima_type = img.dtype 
print(ima_type)
cv2.imshow("window_name", img) 
cv2.waitKey(0) 
运行结果:
print(img) 
  [[[255  19  19]
   [255  10  10]
   [255   9   9]
   ...
   [255  10  11]
   [255   8   9]
   [255  20  20]]
 [[255  10  10]
   [250   2   2]
   [248   0   0]
   ...
   ...
   ...
   [253  12  11]
   [250   9   8]
   [255  20  19]]]
print(information)  
# 行、列、通道数量:
# 图像高度 × 图像宽度 × 图像通道数
(378, 350, 3)
img_size = img.size
print(img_size) 
#图像大小:
 396900
ima_type = img.dtype 
print(ima_type) 
#图像数据类型:unit8,8位无符号整型
uint8
🦄 二、方法一(遍历图像,将像素值点替换修改为指定颜色)
把图像修改成白底的图,更改背景:蓝色→白色
粗糙的代码方法是:
import cv2
img = cv2.imread('girl4b.jpg')  
information = img.shape
(b, g, r) = img[250, 250]  
# 更改背景:蓝色---→白色
for row in range(information[0]):
    for col in range(information[1]):
        (b, g, r) = img[row, col]
        if b >= 200:  # 如果b通道值大于200(蓝色),就将该点替换为白色
            img[row, col] = (255, 255, 255)
cv2.imwrite('girl4b_c30b_white.jpg', img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  
运行效果(并不理想):
图片背景大部分都被替换成了白色,但是人物脸部部分位置,肩膀部分的颜色也被替换成了白色,效果并部理想,需要更换修改颜色的方法。

🦄 三、修改图片颜色方法二(先转换图像格式再替换颜色值)
(1)、效果对比图
先看一下转换效果对比图片:

(2)、实现方法
先转换图像格式再替换颜色值,
图像格式资料可以参考以下博文:
计算机视觉基础__图像特征(位图和矢量图概念、图像的颜色特征、RGB 颜色空间、HSV 颜色空间、HLS 颜色空间、CMYK 颜色、Lab模式、索引模式、HSB色彩模式、灰度图、二值图)
①、导入模块
import cv2
import numpy as np 
②、# 读取照片
image=cv2.imread('girl4b.jpg') 
③、# 图片转换为二值化图
hsvimg = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
 

④、# 图片二值化黑白处理
lower_red = np.array([110,70,150])
upper_red = np.array([150,255,255])
hbimg = cv2.inRange(hsv, lower_red, upper_red) 
 

⑤、#闭运算
k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(hbimg,cv2.MORPH_CLOSE,k) 
⑥ 、#颜色替换
# 像素点为255表示的是白色,我们要将白色处的像素点,替换为红色
# 替换颜色,为BGR通道,不是RGB通道
rows,cols,channels = image.shape
for i in range(rows):
  for j in range(cols):
    if r[i,j]==255:
      image[i,j]=(0,0,255) 
⑦、#保存新图片
cv2.imwrite('girl4b_c32_red.jpg',image) 

⑧、#无限等待,销毁内存
cv2.waitKey(0)
cv2.destroyAllWindows() 
⑨、完整代码
import cv2
import numpy as np
image=cv2.imread('girl4b.jpg')
#修改尺寸
#image = cv2.resize(image,None,fx=0.8,fy=0.8)
hsvimg = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow('hsvimg',hsvimg)
lower_red = np.array([110,70,150])
upper_red = np.array([150,255,255])
hbimg = cv2.inRange(hsvimg, lower_red, upper_red)
cv2.imshow('hbimg',hbimg)
k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(hbimg,cv2.MORPH_CLOSE,k)
cv2.imshow('yuantu',image)
rows,cols,channels = image.shape
for i in range(rows):
  for j in range(cols):
    if r[i,j]==255: 
      image[i,j]=(0,0,255) 
cv2.imshow('red',image)
cv2.imwrite('girl4b_c32_red.jpg',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
 
 
 
🦄 四、总结
给照片换底色只是最基础的计算机视觉应用之一,进一步,可扩展至人像抠图, 通用抠图(商品、动物、植物、汽车等抠图),天空替换(实现魔法换天空),视频人像抠图等领域。
推荐阅读:
|   
  |   
  |   
  | 
| 计算机视觉__基本图像操作(显示、读取、保存) | 直方图(颜色直方图、灰度直方图) | 直方图均衡化(调节图像亮度、对比度) | 
|   
  |   
  |   
  | 








































            




U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结