利用python实现对人物头发及衣服颜色的替换

1.方法
选人物照:脸部的局部图像中头发突出,从颜色、灰度值上便于头发的检测:衣服颜色单一,与背景在灰度值、或颜色上的区分度高。
对全局图像或局部图像,采用灰度图像二值化、RGB颜色空间的距离、HSV空间中H的大小(二值化),用于目标像素提取
建立掩模矩阵,用于头发像素、衣服像素的标注一一zeros(M,N), ones(M,N)。 也可以直接用二值化中的1/0做像素类型的判定。
HSV空间中,对目标像素,修改H S分量的值,改变颜色
2.概述
利用opencv库中的inrange函数确定头发像素和衣服像素的范围,建立相关模型,确定范围后,对范围内的像素点进行操作,通过改变H,S的值从而改变目标颜色
3.代码
import cv2
import numpy as np

img = cv2.imread(‘D:/mai2.png’)

cv2.imshow(‘img’,img)

将图像转换为HSV像素空间,因为HSV空间对颜色比较敏感

img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

rows, cols, n = img_hsv.shape

分别设置HSV颜色空间中,相关颜色的阈值

lower_yellow=np.array([12,43,46])
upper_yellow=np.array([34,255,255])

lower_blue=np.array([35,43,46])
upper_blue=np.array([124,255,255])

使用inRange函数获取图像中目标颜色的索引

mask_blue=cv2.inRange(img_hsv,lower_blue,upper_blue)
mask_yellow=cv2.inRange(img_hsv,lower_yellow,upper_yellow)

image_mask=img_hsv.copy()

for row in range(rows): #遍历每一行
for col in range(cols): #遍历每一列
if mask_yellow[row,col] == 255 or mask_blue[row,col] == 255:
image_mask[row, col, 0] = image_mask[row, col, 0] + 50
image_mask[row, col, 1] = image_mask[row, col, 1] + 50
else:
‘’
yellow=cv2.bitwise_and(img,img,mask=mask_yellow)
img_2 = cv2.cvtColor(image_mask,cv2.COLOR_HSV2BGR)
cv2.imshow(‘img_2’,img_2)
cv2.waitKey(0)
4.图片效果
利用python实现对人物头发及衣服颜色的替换
利用python实现对人物头发及衣服颜色的替换
5.总结
选图没有选好,人物肤色与发色接近,衣服颜色的范围也没有取好,导致转换并没有很成功,有部分仍是其它颜色,而且头发中光亮的部分难以转化,基本都是在HSV空间内进行,可能还有一些不太了解的部分,以后应该加深对应的学习。