如何在OpenCV中重新绘制皮肤?

2024-04-19 23:18:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用OpenCV的SeamlesClone。我需要重新油漆的皮肤在不同的颜色,例如它将是rgb(139,69,19)。如何做浮雕和纹理呢?你知道吗

EXAMPLE


Tags: 颜色rgbopencv皮肤浮雕纹理油漆seamlesclone
1条回答
网友
1楼 · 发布于 2024-04-19 23:18:39

尽管你的问题似乎不够努力(你自己试过什么?),这似乎是一个有趣的练习,因此我编写了一些代码,可以使用滑块更改图像的rgb值。
滑块的范围从0到510。首先减去255,然后将其添加到图像的rgb值中。这意味着低于255的值是一个减法。值被剪裁为最小值和最大值(0和255)。
这个过程在保持纹理和光照的同时改变颜色。你知道吗

结果:
enter image description here

代码:

    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()

相关问题 更多 >