首页 > 解决方案 > 两幅图像之间的颜色转移,其中一幅图像为纯色

问题描述

我遇到了这个使用 OpenCV 的特殊颜色转移教程:

https://www.pyimagesearch.com/2014/06/30/super-fast-color-transfer-images/

并像这样实现它:

def color_transfer(source, target):
    # compute color statistics for the source and target images
    source = cv2.cvtColor(source, cv2.COLOR_BGR2LAB).astype("float32")
    target = cv2.cvtColor(target, cv2.COLOR_BGR2LAB).astype("float32")
    
    # compute color stats for both images
    (lMeanSrc, lStdSrc, aMeanSrc, aStdSrc, bMeanSrc, bStdSrc) = self.image_stats(source)
    (lMeanTar, lStdTar, aMeanTar, aStdTar, bMeanTar, bStdTar) = self.image_stats(target)
    
    # split the color space
    (l, a, b) = cv2.split(target)
    
    # substract the means from target image
    l -= lMeanTar
    a -= aMeanTar
    b -= bMeanTar
    
    # check values
    print(lStdSrc, aStdSrc, bStdSrc)
    print(lStdTar, aStdTar, bStdTar)
    print(lMeanSrc, aStdSrc, bMeanSrc)
    
    # process lab computation
    l = (lStdSrc / lStdTar) * l
    a = (aStdSrc / aStdTar) * a
    b = (bStdSrc / bStdTar) * b
    
    # add the source mean
    l += lMeanSrc
    a += aMeanSrc
    b += bMeanSrc
    
    # clipping the pixels between 0 and 255
    l = np.clip(l, 0, 255)
    a = np.clip(a, 0, 255)
    b = np.clip(b, 0, 255)
    
    # merge the channels
    transfer = cv2.merge([l, a, b])
    
    # converting back to BGR
    transfer = cv2.cvtColor(transfer.astype("uint8"), cv2.COLOR_LAB2BGR)
    
    return transfer

在这个特定的代码中:

    # process lab computation
    l = (lStdSrc / lStdTar) * l
    a = (aStdSrc / aStdTar) * a
    b = (bStdSrc / bStdTar) * b

它得到了源的标准差,所以当我们将源图像和目标图像结合起来时,它也会变成一个普通的图像,因为实验室都是 0。

我怎样才能解决这个问题?当源图像不是带有颜色的普通图像时,它可以工作。

标签: pythonopencvmachine-learningcolortransform

解决方案


推荐阅读