繁体   English   中英

OpenCV Python:16位图像的LUT?

[英]OpenCV Python: LUT for 16bit image?

我一直在尝试在 OpenCV python 上学习一些图像处理。 我有一个 16 位图像,我想在这个 16 位图像上应用 LUT 转换而不将其减少到 8 位。 从文档中,我读到 OpenCV 中的 LUT function 仅适用于 8 位图像。 有谁知道将此 function 用于 16 位图像的有效方法?

我已将 LUT 覆盖用于 8 位图像。 它们工作正常,但对于 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 function 是仅适用于8位图像的。

正如您已经发现的, OpenCV 的 LUT 方法的实现只支持 8 位 LUT。 但是,您可以实现自己的任意位分辨率,这实际上非常简单。 对于图像中的每个值,这直接用于访问 LUT,它将 output 获得所需的值。 Because OpenCV interfaces with NumPy, you can just use the input image and index into the LUT directly in order to obtain the final output, taking advantage of NumPy array indexing.

首先定义一个 LUT - 您需要确保它是 16 位的,我假设您的值 go 从 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]

这应用了输入图像的逆伽马调整,我们首先生成一个 16 位的 LUT,然后使用图像直接索引到它以创建 output 图像。 请注意,输入图像也被假定为 16 位。 如果您有任何超出 0-65535 范围的值,这将给您一个超出范围的索引错误。

注意 - 多通道图像

请注意,上述情况假设为单通道图像。 如果您想将此应用于多通道(即 RGB 图像),那么您需要为每个通道定义一个 LUT,并将 LUT 分别应用于每个通道。 最简单的方法是在所有通道上进行for循环。 肯定有更多的矢量化方法可以一次性做到这一点,但我不会偏离你问题的意图,我希望这尽可能简单易读。

首先定义一个 2D LUT,其中该矩阵中的每一行都是一个 LUT。 具体来说,第i行对应于要应用于图像的通道i的 LUT。 完成后,循环遍历通道维度并应用 LUT。 为了节省一些时间,我们还可以做的是预先分配 output 图像,使其全为零,然后相应地填充每个通道。

就像是:

# 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]]

output将包含所需的结果。 但是,对于 LUT 在所有通道中都相同的特殊情况,您可以使用之前使用的相同 1D LUT,并且可以使用我之前谈到的相同索引方法:

output = table[image]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM