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



我试图实现的是:查找表以创建双色调效果,也称为假色

假设我有两种颜色:分别以十六进制格式ff000000ff00提供的纯红色和纯绿色。我们知道它本质上是(255, 0, 0)(0, 255, 0)。我需要在numpy中创建一个256x1的渐变图像,渐变的两端都有红色和绿色。

我强烈希望将依赖关系限制为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)

从这里修改以提供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)

我知道这个问题已经得到了回答,但我只想问作者是否可以共享双音效果的代码。我有一个逐像素更新图像的强力解决方案,它很有效,但效率很低。因此,我正在寻找一种更有效的算法,并发现这篇文章很有启发性,但还没有找到一个有效的解决方案@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 

最新更新