Python 利用opencv给白底照片换色,全网唯一
说来也是凑巧,最近有张白色背景的证件照需要换成红色,时间不紧张,于是想用Opencv实现,然后网上搜索了一圈,发现都是蓝底换其他底色的,没有一篇关于白底照片换色的,于是自己动手改了下相关的代码。
直接上代码:
代码如下:
import cv2
import numpy as np
# 1、读取照片
img=cv2.imread(test.jpg)
rows,cols,channels = img.shape
cv2.imshow(img,img)
# 2、图片的二值化处理
### 二值化处理将图片转为黑白两色,但因为本来就是白底照片,因此在设置颜色上需要调整。
### lower~upper之间的值将变成255(纯白) 其他均变为0(纯黑)
lower = np.array([251,251,251])
upper = np.array([256,256,256])
mask = cv2.inRange(img, lower, upper)
cv2.imshow(mask,mask)
# 3、图像的腐蚀膨胀
# kernel = np.ones((2, 2), np.uint8) 这里经过测试选择None代替kernel
erode=cv2.erode(mask,None,iterations=1) #进行腐蚀操作
cv2.imshow(erode,erode)
### dilate进行膨胀操作,iterations=3是为了将白色区域增强,否则换背景色时会出现裸漏色
dilate=cv2.dilate(erode,None,iterations=3)
cv2.imshow(dilate,dilate)
# 4、遍历替换底色
for i in range(rows):
for j in range(cols):
if dilate[i,j]==255: # 像素点255是白色
img[i,j]=(0,0,255) # 此处替换颜色,为BGR通道,不是RGB通道
cv2.imshow(red,img)
# 窗口等待的命令,0表示无限等待
cv2.waitKey(0)
# 5、保存图片
# cv2.imwrite(test_red.jpg, img)
效果如下:
注意点:
- 图像二值化时,因为本身就是白色背景,因此只需要将非白色转黑色即可,但照片中衬衫也是白色,因此在调整时lower至upper的值需要多次调整,否则会出现如下情况:最右图片呈现大量白噪音。
2. 进行图片膨胀操作时,iterations的值要尽量大点,我这里用的3,可自行调整。如若选择1,会出现如下情况:很明显红色底并没覆盖全。
写给键盘侠:
当然是PS和各种图片软件方便了,写这篇就是为了补充【opencv白底换色】的空缺。希望能对需要的人有所帮助,感恩。
