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

标签 python image opencv image-processing

我正在使用 OpenCV 进行无缝克隆。我需要用不同的颜色重新绘制皮肤,例如它将是 rgb (139,69,19)。如何做到有浮雕和质感?

EXAMPLE

最佳答案

虽然您的问题似乎不够努力(您自己尝试了什么?),但它似乎是一个有趣的练习,所以我编写了一些代码,让您可以使用 slider 更改图像的 rgb 值。
slider 范围从 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()

关于python - 如何在 OpenCV 中重新绘制皮肤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57590006/

相关文章:

python - 从 Python 中的字符串中删除辅音

未在光表中执行的 Python 脚本显示错误

c++ - 在 C++ 中将像素数据转换为图像

带有 Assets 目录的 iOS 图像切片会产生奇怪的伪像

python - 使用CoLab在Google云端硬盘上OpenCV读取和写入速度太慢

python - Python openCV 中的实时人体检测

Python rpy2 - nls 回归 RRuntimeError

python - 如何每秒运行一次与 Flask 上的请求分开的函数?

R:对数尺度的图像强度

android - CvCaptureFromAVI 问题 - OpenCV Android