1 python opencv image-processing lookup-tables
我一直在尝试学习 OpenCV python 上的一些图像处理。我有一个 16 位图像,我想对此 16 位图像应用 LUT 转换,而不将其减少到 8 位。从文档中,我了解到 OpenCV 中的 LUT 函数仅适用于 8 位图像。有谁知道对 16 位图像使用此函数的有效方法吗?
我对 8 位图像使用了 LUT 转换。它们工作正常,但对于 16 位图像,会出现以下错误:error: (-215:Assertion failed) (lutcn == cn || lutcn == 1) && \_lut.total() == 256 && \_lut.isContinuous() && (depth == CV_8U || depth == CV_8S) in function 'cv::LUT'。
后来我发现这是因为LUT功能只适用于8位图像。
正如您已经发现的, OpenCV 的 LUT 方法的实现仅支持 8 位 LUT。但是,您可以实现自己的任意位分辨率,实际上非常简单。对于图像中的每个值,这直接用于访问将输出所需值的 LUT。由于 OpenCV 与 NumPy 接口,因此您可以直接使用输入图像并索引到 LUT 中,从而利用 NumPy 数组索引来获得最终输出。
首先定义一个 LUT - 您需要确保它是 16 位,并且我假设您的值在 0 到 65535 之间,以符合 16 位分辨率。完成此操作后,请使用该表为您的图像建立索引。这是使用伽玛调整的示例:
import numpy as np
def adjust_gamma(image, gamma=1.0):
# build a lookup table mapping the pixel values [0, 65535] to
# their adjusted gamma values
inv_gamma = 1.0 / gamma
table = ((np.arange(0, 65536) / 65535) ** inv_gamma) * 65535
# Ensure table is 16-bit
table = table.astype(np.uint16)
# Now just index into this with the intensities to get the output
return table[image]
Run Code Online (Sandbox Code Playgroud)
这对输入图像应用逆伽玛调整,我们首先生成 16 位的 LUT,然后使用图像直接对其进行索引以创建输出图像。请注意,输入图像也假定为 16 位。如果您有任何超出 0-65535 范围的值,则会出现索引越界错误。
请注意,上述情况假设单通道图像。如果您想将此应用于多通道(即 RGB 图像),那么您需要为每个通道定义一个 LUT,并将 LUT 分别应用于每个通道。最简单的方法是for在所有通道之间循环。肯定有更多的矢量化方法可以一次性完成此操作,但我不会偏离您问题的意图,我希望这尽可能简单易读。
首先定义一个 2D LUT,其中该矩阵中的每一行都是一个 LUT。具体来说,行i对应于应用于i图像通道的LUT。完成后,循环遍历通道维度并应用 LUT。为了节省一些时间,我们还可以做的是预先分配输出图像,使其全部为零,然后相应地填充每个通道。
就像是:
# Assume LUT is defined as `table` and it's a 2D NumPy array
output = np.zeros_like(image)
for i in range(image.shape[2]):
output[..., i] = table[i, image[..., i]]
Run Code Online (Sandbox Code Playgroud)
output将包含所需的结果。但是,对于所有通道的 LUT 都相同的特殊情况,您可以使用之前使用的相同 1D LUT,并且可以使用我之前讨论过的相同索引方法:
output = table[image]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2230 次 |
| 最近记录: |