3

我有以下脚本,它以 RGB 格式获取图像并将其转换为 Lab 颜色空间:

import tensorflow as tf
import tensorflow_io as tfio

img = tf.io.read_file(tf.keras.utils.get_file("tf", "https://upload.wikimedia.org/wikipedia/commons/e/e5/TensorFlow_Logo_with_text.png"))
img = tf.image.decode_png(img, channels=3)
img = tf.image.resize(img, [512, 512])
lab = tfio.experimental.color.rgb_to_lab(img)

lab = lab.numpy()
lab.shape  # (512, 512, 3)

lab[:, :, 0].min()  # 3660.3594
lab[:, :, 0].max()  # 9341.573

lab[:, :, 1].min()  # -49.76082
lab[:, :, 1].max()  # 4273.1514

lab[:, :, 2].min()  # -1256.8489
lab[:, :, 2].max()  # 6293.9043

维基 CIELAB 色彩空间

LAB 空间是三维的,涵盖了人类颜色感知的整个范围或色域。它基于人类视觉的对手颜色模型,其中红色/绿色形成对手对,蓝色/黄色形成对手对。亮度值 L*,也称为“Lstar”,定义黑色为 0,白色为 100。a* 轴相对于绿色-红色对立颜色,负值朝向绿色,正值朝向红色。b* 轴代表蓝黄色的对手,负数代表蓝色,正数代表黄色。

a* 和 b* 轴是无界的,根据参考白色,它们很容易超过 ±150 以覆盖人类色域。然而,出于实际原因,软件实现通常会限制这些值。例如,如果使用整数数学,通常将 a* 和 b* 限制在 -128 到 127 的范围内。

为什么不是0 <= lab[:, :, 0].min() <= lab[:, :, 0].max() <= 100真的?

4

1 回答 1

4

该函数tfio.experimental.color.rgb_to_lab期望其输入是一个在 0 和 1 之间标准化的浮点数。

您可以调用tf.image.convert_image_dtype以标准化您的图像(如果您的输入是整数并且您的目标输出是浮点数,该函数将自动将其标准化在 0 和 1 之间)。

import tensorflow as tf
import tensorflow_io as tfio

img = tf.io.read_file(tf.keras.utils.get_file("tf", "https://upload.wikimedia.org/wikipedia/commons/e/e5/TensorFlow_Logo_with_text.png"))
img = tf.image.decode_png(img, channels=3)
img = tf.image.convert_image_dtype(img, dtype=tf.float32)
img = tf.image.resize(img, [512, 512])
lab = tfio.experimental.color.rgb_to_lab(img)

lab = lab.numpy()

并检查L尺寸:

>>> lab[:,:,0].min()
33.678085
>>> lab[:,:,0].max()
100.0
于 2021-01-20T13:39:44.337 回答