问题描述
我创建了 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 (将#修改为@)