我正在使用 OpenCV 进行无缝克隆。我需要用不同的颜色重新绘制皮肤,例如它将是 rgb (139,69,19)。如何做到有浮雕和质感?
最佳答案
虽然您的问题似乎不够努力(您自己尝试了什么?),但它似乎是一个有趣的练习,所以我编写了一些代码,让您可以使用 slider 更改图像的 rgb 值。
slider 范围从 0 到 510。首先减去 255,然后将其添加到图像的 rgb 值。这意味着低于 255 的值是减法。这些值被裁剪为最小值和最大值(0 和 255)。
这个过程会改变颜色,同时保持纹理和光照。
代码:
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()
关于python - 如何在 OpenCV 中重新绘制皮肤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57590006/