Python 如何在OpenCV中重新绘制皮肤?
我正在为SeamlesClone使用OpenCV。我需要重新绘制不同颜色的皮肤,例如,它将是rgb(139,69,19)。如何使用浮雕和纹理Python 如何在OpenCV中重新绘制皮肤?,python,image,opencv,image-processing,Python,Image,Opencv,Image Processing,我正在为SeamlesClone使用OpenCV。我需要重新绘制不同颜色的皮肤,例如,它将是rgb(139,69,19)。如何使用浮雕和纹理 虽然您的问题似乎不够努力(您自己尝试了什么?),但这似乎是一个有趣的练习,因此我编写了一些代码,允许您使用滑块更改图像的rgb值。 滑块的范围从0到510。首先减去255,然后将其添加到图像的rgb值中。这意味着低于255的值是减法。值被剪裁为最小值和最大值(0和255)。 此过程在保持纹理和照明的同时更改颜色 结果: 代码: 将numpy导入为np 进
虽然您的问题似乎不够努力(您自己尝试了什么?),但这似乎是一个有趣的练习,因此我编写了一些代码,允许您使用滑块更改图像的rgb值。
滑块的范围从0到510。首先减去255,然后将其添加到图像的rgb值中。这意味着低于255的值是减法。值被剪裁为最小值和最大值(0和255)。
此过程在保持纹理和照明的同时更改颜色 结果:
代码:
将numpy导入为np
进口cv2
#加载图像
img=cv2.imread(“fGhx4.png”)
#创建窗口
cv2.namedWindow(“IMG”)
#设置默认值
红色=0
绿色=0
蓝色=0
#用于设置值的函数
def设定值(val):
全球蓝色
蓝色=val-255
色移()
def设置绿色(val):
全球绿色
绿色=val-255
色移()
def设置为红色(val):
全球红色
红色=val-255
色移()
#执行颜色移位的函数
def colorShift():
#创建工作副本
res=img.copy()
#调色
#将图层转换为uint16以容纳大于255的值
蓝色数组=np.uint16(res[:,:,0])+蓝色
#剪裁最小值和最大值-防止不必要的环绕
蓝色数组=np。其中(蓝色数组>255,255,蓝色数组)
蓝色数组=np。其中(蓝色数组<0,0,蓝色数组)
#转换回uint8并指定给图像层
res[:,:,0]=np.uint8(蓝色数组)
#修改绿色-相同流程
绿色层=np.uint16(res[:,:,1])+绿色
绿色层=np。其中(绿色层>255,255,绿色层)
绿色层=np。其中(绿色层<0,0,绿色层)
res[:,:,1]=np.uint8(绿色层)
#修改红色-相同的过程
红色层=np.uint16(res[:,:,2])+红色
红色层=np。其中(红色层>255,255,红色层)
红色层=np。其中(红色层<0,0,红色层)
res[:,:,2]=np.uint8(红色层)
#显示结果
cv2.imshow(“IMG”,res)
#创建轨迹栏以修改值
cv2.createTrackbar(“蓝色”、“IMG”、255510、蓝色)
cv2.createTrackbar(“绿色”、“IMG”、255510、设置绿色)
cv2.createTrackbar(“红色”、“IMG”、255510、设置红色)
#显示初始图像
cv2.imshow(“IMG”,IMG)
cv2.等待键(0)
cv2.destroyAllWindows()
我尝试了changeColor函数,这让我有点失望,我认为它确实实现了您描述的解决方案。谢谢,很棒的功能。
import numpy as np
import cv2
# load image
img = cv2.imread("fGhx4.png")
# create window
cv2.namedWindow("IMG")
#set default values
red = 0
green = 0
blue = 0
# functions to set values
def setBlue(val):
global blue
blue = val-255
colorShift()
def setGreen(val):
global green
green = val-255
colorShift()
def setRed(val):
global red
red = val-255
colorShift()
# function that performs the colorshift
def colorShift():
# create working copy
res = img.copy()
# modify hue
# converted layer to uint16 to accomodate values larger than 255
blue_array = np.uint16(res[:,:,0])+blue
# clip min and max values - prevents unwanted wrap around
blue_array = np.where(blue_array > 255 , 255, blue_array)
blue_array = np.where(blue_array < 0, 0, blue_array)
# convert back to uint8 and assign to image layer
res[:,:,0] = np.uint8(blue_array)
# modify green - same process
green_layer = np.uint16(res[:,:,1])+green
green_layer = np.where(green_layer > 255 , 255, green_layer)
green_layer = np.where(green_layer < 0, 0, green_layer)
res[:,:,1] = np.uint8(green_layer)
# modify red - same process
red_layer = np.uint16(res[:,:,2])+red
red_layer = np.where(red_layer > 255 , 255, red_layer)
red_layer = np.where(red_layer < 0, 0, red_layer)
res[:,:,2] = np.uint8(red_layer)
# display result
cv2.imshow("IMG", res)
#create trackbars to modify values
cv2.createTrackbar("Blue","IMG",255,510,setBlue)
cv2.createTrackbar("Green","IMG",255,510,setGreen)
cv2.createTrackbar("Red","IMG",255,510,setRed)
# display initial image
cv2.imshow("IMG", img)
cv2.waitKey(0)
cv2.destroyAllWindows()