在NumPy中为LUT创建渐变图像(查找表)

fd3cxomn  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(113)

我想要实现的是:查找表格来创建双色调效果,也称为“假颜色”。
假设我有两种颜色:纯红色和纯绿色,分别以十六进制格式ff000000ff00提供。我们知道它本质上是(255, 0, 0)(0, 255, 0)。我需要创建一个256x1渐变图像在Numpy与红色和绿色在渐变的两端。
我强烈希望将依赖项限制为numpycv2
下面的代码对我来说很好,但是所有的rgb值都已经硬编码,我需要为任何给定的左颜色和右颜色动态计算LUT渐变图(为简洁起见,LUT表被截断):

lut = np.zeros((256, 1, 3), dtype=np.uint8)

lut[:, 0, 0] = [250,248,246,244,242,240,238,236,234,232,230, ...]
lut[:, 0, 1] = [109,107,105,103,101,99,97,95,93,91,89,87,85, ...]
lut[:, 0, 2] = [127,127,127,127,127,127,127,127,127,127,127, ...]

im_color = cv2.LUT(image, lut)
wwodge7n

wwodge7n1#

here修改为NumPy数组

def hex_to_rgb(hex):
     hex = hex.lstrip('#')
     hlen = len(hex)
     return np.array([int(hex[i:i+hlen//3], 16) for i in range(0, hlen, hlen//3)])

然后是numpy部分:

def gradient(hex1, hex2):
    np1 = hex_to_rgb(hex1)
    np2 = hex_to_rgb(hex2)
    return np.linspace(np1[:, None], np2[:, None], 256, dtype = int)
5f0d552i

5f0d552i2#

我知道问题已经回答了,但我只想问问作者,双色调效果的代码是否可以共享。我有一个粗暴的解决方案,可以逐个像素地更新图像,它很管用,但效率真的很低。所以我在寻找一种更有效的算法,我发现这篇文章很鼓舞人心,但还没有想出一个利用这些线索的有效解决方案。@Pono,如果你能分享使用任何两种颜色创建双色调图像的代码,那就太好了。
不要紧,我想出来了,并分享了下面的代码,以防其他人寻找同样的东西。

def gradient1d(rbg1, rbg2):
    bgr1 = np.array((rbg1[2], rbg1[1], rbg1[0]))
    bgr2 = np.array((rbg2[2], rbg2[1], rbg2[0]))
    return np.linspace(bgr2, bgr1, 256, dtype = int)

def duotone(image, color1, color2):
    img = image.copy()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    table = gradient1d(color1, color2) 
    result = np.zeros((*gray.shape,3), dtype=np.uint8)
    np.take(table, gray, axis=0, out=result)
    return result

相关问题