给照片换底色(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()
🦄 四、总结
给照片换底色只是最基础的计算机视觉应用之一,进一步,可扩展至人像抠图, 通用抠图(商品、动物、植物、汽车等抠图),天空替换(实现魔法换天空),视频人像抠图等领域。
推荐阅读:
计算机视觉__基本图像操作(显示、读取、保存) | 直方图(颜色直方图、灰度直方图) | 直方图均衡化(调节图像亮度、对比度) |