如何更改 RGB 图像的动态范围?

How to change dynamic range of an RGB image?

我有 16 位原始图像(12 位有效位)。我将它转换为 rgb,现在我想更改动态范围。我创建了 2 个地图函数。您可以在下面看到它们的可视化。如您所见,第一个函数将值 0-500 映射到 0-100,第二个函数将其余值映射到 101-255。

现在我想在 rgb 图像上应用贴图函数。我正在做的是遍历每个像素,为每个通道找到合适的函数并将其应用到通道上。例如像素为RGB=[100 2000 4000]。在 R 通道上,我将应用第一个函数,因为 100 在 0-500 范围内。但是,在 G 和 B 通道上,我将应用第二个函数,因为它们的值在 501-4095 之间。

但是,这样做实际上是在改变像素的实际颜色,因为我在像素的通道上应用了不同的函数。

你能建议怎么做吗,或者至少给我一个方向或展示一些文章?

你做的是一个非常简单的成像操作,经常应用于图像和视频处理。有时它(不准确地)称为查找 table (LUT),即使它并不总是通过实际查找 table 实现。这方面的例子是伽马调整或对数编码。

例如,这种编码的一个例子是 sRGB,它是线性光的伽玛编码。您可以在这里阅读:http://en.wikipedia.org/wiki/SRGB。您会看到它具有非线性调整。

LUT 这个名字暗示了一种很好的实现方式。如果可以使图像成为 uint8 或 uint16 值集,则可以为任何输入值创建所需输出值的向量。查找 table 的元素数量与变量类型的可能范围相同。如果您使用的是 uint8,则需要查找 table 的 256 个值。然后查找很容易,您只需将图像值用作 LUT 的索引即可获得结果值。这种计算效率是 LUTS 如此广泛使用的原因。

在您的情况下,由于您在 RGB space 中工作,因此可以接受table 以完全相同的方式将曲线应用于三个颜色通道中的每一个。出于这个原因,RGB space 很好。然而,出于各种原因,有时每个通道会实现不同的 LUT。

因此,如果您有一张图像(我们将使用 MATLAB 中包含的图像并通过缩放假装它是 12 位):

someimage = uint16(imread('autumn.tif')).*16;
image(someimage.*16); % Need to multiply again to display 16 bit data scaled properly

对于您的 LUT,您可以将其实现为:

lut = uint8([(0:500).*(1/5), (501:4095).*((255-101)/(4095-501)) + 79.5326]);
plot(lut);  %Take a look at the lut

这使得您在问题中描述的分段计算成为可能。

您可以这样制作新图片:

convertedimage = lut(double(someimage)+1);
image(convertedimage);

请注意,因为 MATLAB 使用双精度索引——基于一个——你需要正确转换并加一。这并没有像您想象的那样减慢速度; MATLAB 就是为此而生的。我已经使用 MATLAB 几十年了,这对我来说仍然很奇怪。

这种方法可以让您喜欢 LUT 创建(日志、exp 等),而且它仍然运行得非常快。

在你的例子中,你的 LUT 只需要 4096 个元素,因为你的输入数据只有 12 位。您可能需要小心边界,因为 uint16 可能具有更高的值。一种简单的绑定方法是使用 minend 函数:

convertedimage = lut(min(double(someimage)+1, end));

现在,这已经实现了你的功能,但也许你想要一个稍微不同的功能。例如,这种类型的一个常见功能是简单的伽马调整。 2.2 的伽玛意味着传入的图像值通过将它们取为 1/2.2 次方来缩放(如果缩放在 0 和 1 之间)。我们可以创建这样一个LUT如下:

lutgamma = uint8(256.*(((0:4095)./4095).^(1/2.2)));
plot(lutgamma);

同样,我们通过简单的索引应用 LUT:

convertedimage = lutgamma(min(double(someimage)+1, end));

我们得到如下图像:

使用平滑的 LUT 通常会提高整体图像质量。分段线性 LUT 往往会导致生成的图像在阴影区域出现奇怪的不连续性。

这些在许多成像系统中非常常见,以至于 LUT 具有文件格式。要了解我的意思,请查看一家大型相机公司的 LUT generator。 LUT 很重要,看来您的方向是正确的。

我认为您指的是 Photoshop 调用 "Enhance Monochromatic Contrast" 的东西,它被描述为 here - 看看 "Step 3: Try Out The Different Algorithms".

基本上,我认为您从所有通道中找到 single min,并从所有 3 个通道中找到 single max 并应用对所有通道进行相同的缩放,而不是使用自己的最小值和最大值单独对每个通道进行缩放。

或者,您可以转换为 Lab(亮度加上 ab)模式并将您的函数应用于亮度通道(不影响ab 保存颜色信息的通道)然后转换回 RGB,您的颜色不受影响。