给女朋友做一次AI美甲
陆总说我三个星期都没更新项目了,年初的Flag刚立到一半就倒了。这次陆总直接甩了一个数据集,搞一个美甲的小demo。本次项目代码量较少,但是涉及到的数字图像处理基础知识较多,在这里,我会为大家进行深入浅出的讲解,尽量让大家明白本次项目的原理。好了,让我们开始本次愉快的美甲之旅吧!
一、基础知识
数字图像处理中掩膜概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。在本项目中采用的图片示例如下所示:其中左图为原始图像,右图为对应的mask掩膜。
二、代码实现
该部分将对美甲的实现进行代码实现,并引入Python的代码重构概念,将代码封装为一个函数。
# 解压数据集
!cd data/data68764/ && unzip -q Nails.zip
# 导入相关类库
import os
import cv2
import numpy as np
2.1 功能实现
此小节对美甲功能进行实现。首先,我们遍历图像文件夹,逐个读取图像。之后,读取图像对应的mask图像,需要注意的是,此处的mask的位深度为8,并且我们这里需要将mask以二值形式读取。最后,直接操作图像矩阵,将mask部分的像素值直接赋值,将mask区域变为粉色。(此处需要自己建立data/data68764/Nails/masked文件夹)
images_path = 'data/data68764/Nails/images/'
masks_path = 'data/data68764/Nails/Mask'
masked_path = 'data/data68764/Nails/masked'
for img_item in os.listdir(images_path):
img_path = os.path.join(images_path, img_item)
img = cv2.imread(img_path)
mask_path = os.path.join(masks_path, img_item[:-4]+'.png') # mask是.png格式的
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) # 将彩色mask以二值图像形式读取
img[mask > 0] = (238,0,238)
cv2.imwrite(os.path.join(masked_path, img_item), img) #保存图像
结果展示
2.2 代码封装
通常,为了提升代码重用性,我们需要将代码进行封装,在这里,我们给封装的函数传入四个参数,分别是images_path, masks_path, masked_path, color。
def add_mask2image_binary(images_path, masks_path, masked_path, color):
# Add binary masks to images
for img_item in os.listdir(images_path):
print(img_item)
img_path = os.path.join(images_path, img_item)
img = cv2.imread(img_path)
mask_path = os.path.join(masks_path, img_item[:-4]+'.png') # mask是.png格式的
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) # 将彩色mask以二值图像形式读取
# masked = cv2.add(img, np.zeros(np.shape(img), dtype=np.uint8), mask=mask) #将image的相素值和mask像素值相加得到结果
color = color
# masked = cv2.bitwise_not(img , img, mask=mask) #将image的相素值和mask像素值相加得到结果
img[mask > 0] = color
cv2.imwrite(os.path.join(masked_path, img_item), img)
images_path = 'data/data68764/Nails/images/'
masks_path = 'data/data68764/Nails/Mask'
masked_path = 'data/data68764/Nails/masked'
color = {'作死粉':(238,130,238),'原谅绿':(0,255,0),'苏丹红':(0,0,255)}
add_mask2image_binary(images_path, masks_path, masked_path, color['原谅绿'])
h, masks_path, masked_path, color['原谅绿'])
4c47ee66-e402-11e8-97db-0242ac1c0002.png
4c478f3e-e402-11e8-97db-0242ac1c0002.png
edff1324-0b02-4471-b449-14cea27f0094.png
d61d6de4-db67-11e8-9658-0242ac1c0002.png
cc25f453-04ca-4c24-92bc-f26c5a94e78c.png
d60f3ecc-db67-11e8-9658-0242ac1c0002.png
d60153c0-db67-11e8-9658-0242ac1c0002.png
F6F9B3E6-FA7B-4DAC-B08C-1AD19BC43A76.png
4c48acb6-e402-11e8-97db-0242ac1c0002.png
d97db2d2-18ff-456d-8d85-23bfb7109aef.png
41d83dbb-7c39-4d91-979e-eec5ff71b265.png
af5626a5-feb4-4b2a-8c57-152e443ea3dc.png
4c472e18-e402-11e8-97db-0242ac1c0002.png
917FB1CC-E132-497F-A463-46C61A84BB40.png
d61a32a0-db67-11e8-9658-0242ac1c0002.png
d63890ec-db67-11e8-9658-0242ac1c0002.png
4c490eae-e402-11e8-97db-0242ac1c0002.png
d6321726-db67-11e8-9658-0242ac1c0002.png
964c11f9-fbe3-420e-8674-9bb356cb5d3f.png
da236f3a-8c82-4c64-9a7d-9b950fd8b47e.png
4c46b91a-e402-11e8-97db-0242ac1c0002.png
865a1e90-7ad2-4ceb-b2a1-50b07875c5c7.png
d60a5f06-db67-11e8-9658-0242ac1c0002.png
5CBCC5AC-B638-4DFA-AA7B-2464FADFF2F7.png
4c4a0dd6-e402-11e8-97db-0242ac1c0002.png
7e9f5818-4425-4d8a-808a-4673d96fa250.png
34404E67-4BB8-432E-863E-C1BEF5EB37E0.png
feb2c029-b89c-4ce5-b208-db2114516a40.png
a3a73edd-1483-4413-addb-9a7264b5d853.png
ABD5AB5C-E7CA-4420-A983-2161029ECC9E.png
2C29D473-CCB4-458C-926B-99D0042161E6.png
bf93c2e2-7b5f-4108-ae85-4ef68564d418.png
d6358550-db67-11e8-9658-0242ac1c0002.png
4c4a6402-e402-11e8-97db-0242ac1c0002.png
2c376c66-9823-4874-869e-1e7f5c54ec7b.png
869CDA2E-8251-4880-89D6-9409CBC416F3.png
4c484f8c-e402-11e8-97db-0242ac1c0002.png
b25b81b1-d562-4891-ae4f-83a82a2b64b5.png
C03527E3-ADED-423E-9F11-D797EA35E286.png
d633f320-db67-11e8-9658-0242ac1c0002.png
d6303a64-db67-11e8-9658-0242ac1c0002.png
09aefeec-e05f-11e8-87a6-0242ac1c0002.png
1eecab90-1a92-43a7-b952-0204384e1fae.png
d639e532-db67-11e8-9658-0242ac1c0002.png
9ABD7CB9-7617-4A66-8892-B335FDB0E89F.png
4252e46c-e40f-4543-91ab-031917d46c5c.png
54108996-6DA8-48F9-93DF-7ABB92F64E03.png
d6072ec6-db67-11e8-9658-0242ac1c0002.png
4c49b502-e402-11e8-97db-0242ac1c0002.png
d62b0cd8-db67-11e8-9658-0242ac1c0002.png
5fad3947-76d7-4352-9329-4a92f898dd59.png
3493127D-7B19-4E50-94AE-2401BD2A91C8.png
三、总结
本次项目比较简单,涉及到了一些数字图像处理基础操作,大家可以对照RGB颜色表对颜色进行改变。最后,祝大家早日找到女朋友。