在 tf.Dataset 管道中预处理原始 png 图像

问题描述

我创建了 tf.Dataset 管道来读取和预处理 png 图像。这些图像是深度图像。不幸的是,它们包含我想替换的异常值。每个像素的值通常在 5000 - 10000 范围内,但一些异常值(背景或其他东西)的值高于 20k。这些是我想用零替换的值。

我使用以下两个函数来读取图像,但它们不允许我更改这些像素的值,因为函数 tf.io.decode_image 将值标准化为整个 dtype 范围(0-255认为 uint8)。浮点数归一化为 0-1 等

depth_image = tf.io.read_file(image_file_path)
depth_image = tf.io.decode_image(depth_image,channels=1)

我无法使用 tf.io.read_file 的输出,因为它尚未表示为 png 文件并包含文件标题

我尝试使用 PIL.open 而不是 tf.io.read_file 加载图像,但没有成功并显示错误消息:来自 PIL 模块的 AttributeError: 'Tensor' object has no attribute 'read'。 我也试过 tf.keras.preprocessing.image.load_img,它在内部使用 PIL 并出现相同的错误。 在没有 tensorflow 的情况下使用 PIL.open 效果很好。

如何在不标准化像素值的情况下将文件读取为 png,以便我可以根据原始值替换它们?

编辑: 唯一的问题是我使用的 tf.io.decode_image 与 png 文件中使用的数据类型不同。我必须使用 uint16 dtype 才能按预期工作:

tf.io.decode_image(depth_image,channels=1,dtype=tf.uint16) 

如果指定了不同的数据类型而不是图像文件中使用的数据类型,则像素值将转换为该指定数据类型的范围,同时保持与这些数据类型范围的“比率”。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)